diff --git a/generative/losses/kld_loss.py b/generative/losses/kld_loss.py new file mode 100644 index 00000000..ebcaf52b --- /dev/null +++ b/generative/losses/kld_loss.py @@ -0,0 +1,20 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import torch +import torch.nn as nn + + +class KLDLoss(nn.Module): + def forward(self, mu, logvar): + return -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) diff --git a/generative/networks/blocks/spade_norm.py b/generative/networks/blocks/spade_norm.py new file mode 100644 index 00000000..0fe735e8 --- /dev/null +++ b/generative/networks/blocks/spade_norm.py @@ -0,0 +1,95 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import torch +import torch.nn as nn +import torch.nn.functional as F +from monai.networks.blocks import ADN, Convolution + + +class SPADE(nn.Module): + """ + SPADE normalisation block based on the 2019 paper by Park et al. (doi: https://doi.org/10.48550/arXiv.1903.07291) + + Args: + label_nc: number of semantic labels + norm_nc: number of output channels + kernel_size: kernel size + spatial_dims: number of spatial dimensions + hidden_channels: number of channels in the intermediate gamma and beta layers + norm: type of base normalisation used before applying the SPADE normalisation + norm_params: parameters for the base normalisation + """ + + def __init__( + self, + label_nc: int, + norm_nc: int, + kernel_size: int = 3, + spatial_dims: int = 2, + hidden_channels: int = 64, + norm: str | tuple = "INSTANCE", + norm_params: dict = {}, + ) -> None: + + super().__init__() + + if len(norm_params) != 0: + norm = (norm, norm_params) + self.param_free_norm = ADN( + act=None, dropout=0.0, norm=norm, norm_dim=spatial_dims, ordering="N", in_channels=norm_nc + ) + self.mlp_shared = Convolution( + spatial_dims=spatial_dims, + in_channels=label_nc, + out_channels=hidden_channels, + kernel_size=kernel_size, + norm=None, + padding=kernel_size // 2, + act="LEAKYRELU", + ) + self.mlp_gamma = Convolution( + spatial_dims=spatial_dims, + in_channels=hidden_channels, + out_channels=norm_nc, + kernel_size=kernel_size, + padding=kernel_size // 2, + act=None, + ) + self.mlp_beta = Convolution( + spatial_dims=spatial_dims, + in_channels=hidden_channels, + out_channels=norm_nc, + kernel_size=kernel_size, + padding=kernel_size // 2, + act=None, + ) + + def forward(self, x: torch.Tensor, segmap: torch.Tensor) -> torch.Tensor: + """ + Args: + x: input tensor + segmap: input segmentation map (bxcx[spatial-dimensions]) where c is the number of semantic channels. + The map will be interpolated to the dimension of x internally. + """ + + # Part 1. generate parameter-free normalized activations + normalized = self.param_free_norm(x) + + # Part 2. produce scaling and bias conditioned on semantic map + segmap = F.interpolate(segmap, size=x.size()[2:], mode="nearest") + actv = self.mlp_shared(segmap) + gamma = self.mlp_gamma(actv) + beta = self.mlp_beta(actv) + out = normalized * (1 + gamma) + beta + return out diff --git a/generative/networks/nets/spade_network.py b/generative/networks/nets/spade_network.py new file mode 100644 index 00000000..b2ff2833 --- /dev/null +++ b/generative/networks/nets/spade_network.py @@ -0,0 +1,418 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Sequence, Union + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from monai.networks.blocks import Convolution +from monai.networks.layers import Act +from monai.utils.enums import StrEnum + +from generative.losses.kld_loss import KLDLoss +from generative.networks.blocks.spade_norm import SPADE + + +class UpsamplingModes(StrEnum): + bicubic = "bicubic" + nearest = "nearest" + bilinear = "bilinear" + + +class SPADE_ResNetBlock(nn.Module): + """ + Creates a Residual Block with SPADE normalisation. + + Args: + spatial_dims: number of spatial dimensions + in_channels: number of input channels + out_channels: number of output channels + label_nc: number of semantic channels that will be taken into account in SPADE normalisation blocks + spade_intermediate_channels: number of intermediate channels in the middle conv. layers in SPADE normalisation blocks + norm: base normalisation type used on top of SPADE + kernel_size: convolutional kernel size + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + label_nc: int, + spade_intermediate_channels: int = 128, + norm: Union[str, tuple] = "INSTANCE", + kernel_size: int = 3, + ): + + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.int_channels = min(self.in_channels, self.out_channels) + self.learned_shortcut = self.in_channels != self.out_channels + self.conv_0 = Convolution( + spatial_dims=spatial_dims, in_channels=self.in_channels, out_channels=self.int_channels, act=None, norm=None + ) + self.conv_1 = Convolution( + spatial_dims=spatial_dims, + in_channels=self.int_channels, + out_channels=self.out_channels, + act=None, + norm=None, + ) + self.activation = nn.LeakyReLU(0.2, False) + self.norm_0 = SPADE( + label_nc=label_nc, + norm_nc=self.in_channels, + kernel_size=kernel_size, + spatial_dims=spatial_dims, + hidden_channels=spade_intermediate_channels, + norm=norm, + ) + self.norm_1 = SPADE( + label_nc=label_nc, + norm_nc=self.int_channels, + kernel_size=kernel_size, + spatial_dims=spatial_dims, + hidden_channels=spade_intermediate_channels, + norm=norm, + ) + + if self.learned_shortcut: + self.conv_s = Convolution( + spatial_dims=spatial_dims, + in_channels=self.in_channels, + out_channels=self.out_channels, + act=None, + norm=None, + kernel_size=1, + ) + self.norm_s = SPADE( + label_nc=label_nc, + norm_nc=self.in_channels, + kernel_size=kernel_size, + spatial_dims=spatial_dims, + hidden_channels=spade_intermediate_channels, + norm=norm, + ) + + def forward(self, x, seg): + x_s = self.shortcut(x, seg) + dx = self.conv_0(self.activation(self.norm_0(x, seg))) + dx = self.conv_1(self.activation(self.norm_1(dx, seg))) + out = x_s + dx + return out + + def shortcut(self, x, seg): + if self.learned_shortcut: + x_s = self.conv_s(self.norm_s(x, seg)) + else: + x_s = x + return x_s + + +class SPADE_Encoder(nn.Module): + """ + Encoding branch of a VAE compatible with a SPADE-like generator + + Args: + spatial_dims: number of spatial dimensions + in_channels: number of input channels + z_dim: latent space dimension of the VAE containing the image sytle information + num_channels: number of output after each downsampling block + input_shape: spatial input shape of the tensor, necessary to do the reshaping after the linear layers + of the autoencoder (HxWx[D]) + kernel_size: convolutional kernel size + norm: normalisation layer type + act: activation type + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + z_dim: int, + num_channels: Sequence[int], + input_shape: Sequence[int], + kernel_size: int = 3, + norm: Union[str, tuple] = "INSTANCE", + act: Union[str, tuple] = (Act.LEAKYRELU, {"negative_slope": 0.2}), + ): + + super().__init__() + self.in_channels = in_channels + self.z_dim = z_dim + self.num_channels = num_channels + if len(input_shape) != spatial_dims: + raise ValueError("Length of parameter input shape must match spatial_dims; got %s" % (input_shape)) + for s_ind, s_ in enumerate(input_shape): + if s_ / (2 ** len(num_channels)) != s_ // (2 ** len(num_channels)): + raise ValueError( + "Each dimension of your input must be divisible by 2 ** (autoencoder depth)." + "The shape in position %d, %d is not divisible by %d. " % (s_ind, s_, len(num_channels)) + ) + self.input_shape = input_shape + self.latent_spatial_shape = [s_ // (2 ** len(self.num_channels)) for s_ in self.input_shape] + blocks = [] + ch_init = self.in_channels + for ch_ind, ch_value in enumerate(num_channels): + blocks.append( + Convolution( + spatial_dims=spatial_dims, + in_channels=ch_init, + out_channels=ch_value, + strides=2, + kernel_size=kernel_size, + norm=norm, + act=act, + ) + ) + ch_init = ch_value + + self.blocks = nn.ModuleList(blocks) + self.fc_mu = nn.Linear( + in_features=np.prod(self.latent_spatial_shape) * self.num_channels[-1], out_features=self.z_dim + ) + self.fc_var = nn.Linear( + in_features=np.prod(self.latent_spatial_shape) * self.num_channels[-1], out_features=self.z_dim + ) + + def forward(self, x): + for block in self.blocks: + x = block(x) + x = x.view(x.size(0), -1) + mu = self.fc_mu(x) + logvar = self.fc_var(x) + return mu, logvar + + def encode(self, x): + for block in self.blocks: + x = block(x) + x = x.view(x.size(0), -1) + mu = self.fc_mu(x) + logvar = self.fc_var(x) + return self.reparameterize(mu, logvar) + + def reparameterize(self, mu, logvar): + + std = torch.exp(0.5 * logvar) + eps = torch.randn_like(std) + return eps.mul(std) + mu + + +class SPADE_Decoder(nn.Module): + """ + Decoder branch of a SPADE-like generator. It can be used independently, without an encoding branch, + behaving like a GAN, or coupled to a SPADE encoder. + + Args: + label_nc: number of semantic labels + spatial_dims: number of spatial dimensions + out_channels: number of output channels + label_nc: number of semantic channels used for the SPADE normalisation blocks + input_shape: spatial input shape of the tensor, necessary to do the reshaping after the linear layers + num_channels: number of output after each downsampling block + z_dim: latent space dimension of the VAE containing the image sytle information (None if encoder is not used) + is_gan: whether the decoder is going to be coupled to an autoencoder or not (true: not, false: yes) + spade_intermediate_channels: number of channels in the intermediate layers of the SPADE normalisation blocks + norm: base normalisation type + act: activation layer type + last_act: activation layer type for the last layer of the network (can differ from previous) + kernel_size: convolutional kernel size + upsampling_mode: upsampling mode (nearest, bilinear etc.) + """ + + def __init__( + self, + spatial_dims: int, + out_channels: int, + label_nc: int, + input_shape: Sequence[int], + num_channels: Sequence[int], + z_dim: Union[int, None] = None, + is_gan: bool = False, + spade_intermediate_channels: int = 128, + norm: Union[str, tuple] = "INSTANCE", + act: Union[str, tuple, None] = (Act.LEAKYRELU, {"negative_slope": 0.2}), + last_act: Union[str, tuple, None] = (Act.LEAKYRELU, {"negative_slope": 0.2}), + kernel_size: int = 3, + upsampling_mode: str = UpsamplingModes.nearest.value, + ): + + super().__init__() + self.is_gan = is_gan + self.out_channels = out_channels + self.label_nc = label_nc + self.num_channels = num_channels + if len(input_shape) != spatial_dims: + raise ValueError("Length of parameter input shape must match spatial_dims; got %s" % (input_shape)) + for s_ind, s_ in enumerate(input_shape): + if s_ / (2 ** len(num_channels)) != s_ // (2 ** len(num_channels)): + raise ValueError( + "Each dimension of your input must be divisible by 2 ** (autoencoder depth)." + "The shape in position %d, %d is not divisible by %d. " % (s_ind, s_, len(num_channels)) + ) + self.latent_spatial_shape = [s_ // (2 ** len(self.num_channels)) for s_ in input_shape] + + if self.is_gan: + self.fc = nn.Linear(label_nc, np.prod(self.latent_spatial_shape) * num_channels[0]) + else: + self.fc = nn.Linear(z_dim, np.prod(self.latent_spatial_shape) * num_channels[0]) + + blocks = [] + num_channels.append(self.out_channels) + self.upsampling = torch.nn.Upsample(scale_factor=2, mode=upsampling_mode) + for ch_ind, ch_value in enumerate(num_channels[:-1]): + blocks.append( + SPADE_ResNetBlock( + spatial_dims=spatial_dims, + in_channels=ch_value, + out_channels=num_channels[ch_ind + 1], + label_nc=label_nc, + spade_intermediate_channels=spade_intermediate_channels, + norm=norm, + kernel_size=kernel_size, + ) + ) + + self.blocks = torch.nn.ModuleList(blocks) + self.last_conv = Convolution( + spatial_dims=spatial_dims, + in_channels=num_channels[-1], + out_channels=out_channels, + padding=(kernel_size - 1) // 2, + kernel_size=kernel_size, + norm=None, + act=last_act, + ) + + def forward(self, seg, z: torch.Tensor = None): + if self.is_gan: + x = F.interpolate(seg, size=tuple(self.latent_spatial_shape)) + x = self.fc(x) + else: + if z is None: + z = torch.randn(seg.size(0), self.opt.z_dim, dtype=torch.float32, device=seg.get_device()) + x = self.fc(z) + x = x.view(*[-1, self.num_channels[0]] + self.latent_spatial_shape) + + for res_block in self.blocks: + x = res_block(x, seg) + x = self.upsampling(x) + + x = self.last_conv(x) + return x + + +class SPADE_Net(nn.Module): + + """ + SPADE Network, implemented based on the code by Park, T et al. in "Semantic Image Synthesis with Spatially-Adaptive Normalization" + (https://github.com/NVlabs/SPADE) + + Args: + spatial_dims: number of spatial dimensions + in_channels: number of input channels + out_channels: number of output channels + label_nc: number of semantic channels used for the SPADE normalisation blocks + input_shape: spatial input shape of the tensor, necessary to do the reshaping after the linear layers + num_channels: number of output after each downsampling block + z_dim: latent space dimension of the VAE containing the image sytle information (None if encoder is not used) + is_vae: whether the decoder is going to be coupled to an autoencoder (true) or not (false) + spade_intermediate_channels: number of channels in the intermediate layers of the SPADE normalisation blocks + norm: base normalisation type + act: activation layer type + last_act: activation layer type for the last layer of the network (can differ from previous) + kernel_size: convolutional kernel size + upsampling_mode: upsampling mode (nearest, bilinear etc.) + """ + + def __init__( + self, + spatial_dims: int, + in_channels: int, + out_channels: int, + label_nc: int, + input_shape: Sequence[int], + num_channels: Sequence[int], + z_dim: Union[int, None] = None, + is_vae: bool = True, + spade_intermediate_channels: int = 128, + norm: Union[str, tuple] = "INSTANCE", + act: Union[str, tuple, None] = (Act.LEAKYRELU, {"negative_slope": 0.2}), + last_act: Union[str, tuple, None] = (Act.LEAKYRELU, {"negative_slope": 0.2}), + kernel_size: int = 3, + upsampling_mode: str = UpsamplingModes.nearest.value, + ): + + super().__init__() + self.is_vae = is_vae + if self.is_vae and z_dim is None: + ValueError("The latent space dimension mapped by parameter z_dim cannot be None is is_vae is True.") + + self.in_channels = in_channels + self.out_channels = out_channels + self.num_channels = num_channels + self.label_nc = label_nc + self.input_shape = input_shape + self.kld_loss = KLDLoss() + + if self.is_vae: + self.encoder = SPADE_Encoder( + spatial_dims=spatial_dims, + in_channels=in_channels, + z_dim=z_dim, + num_channels=num_channels, + input_shape=input_shape, + kernel_size=kernel_size, + norm=norm, + act=act, + ) + + decoder_channels = num_channels + decoder_channels.reverse() + + self.decoder = SPADE_Decoder( + spatial_dims=spatial_dims, + out_channels=out_channels, + label_nc=label_nc, + input_shape=input_shape, + num_channels=decoder_channels, + z_dim=z_dim, + is_gan=not is_vae, + spade_intermediate_channels=spade_intermediate_channels, + norm=norm, + act=act, + last_act=last_act, + kernel_size=kernel_size, + upsampling_mode=upsampling_mode, + ) + + def forward(self, seg: torch.Tensor, x: Union[torch.Tensor, None] = None): + z = None + if self.is_vae: + z_mu, z_logvar = self.encoder(x) + z = self.encoder.reparameterize(z_mu, z_logvar) + kld_loss = self.kld_loss(z_mu, z_logvar) + return self.decoder(seg, z), kld_loss + else: + return (self.decoder(seg, z),) + + def encode(self, x: torch.Tensor): + + return self.encoder.encode(x) + + def decode(self, seg: torch.Tensor, z: Union[torch.Tensor, None] = None): + + return self.decoder(seg, z) diff --git a/tests/test_spade_vaegan.py b/tests/test_spade_vaegan.py new file mode 100644 index 00000000..e030b81e --- /dev/null +++ b/tests/test_spade_vaegan.py @@ -0,0 +1,131 @@ +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import unittest + +import numpy as np +import torch +from monai.networks import eval_mode +from parameterized import parameterized + +from generative.networks.nets.spade_network import SPADE_Net + +CASE_2D = [[[2, 1, 1, 3, [64, 64], [16, 32, 64, 128], 16, True]]] +CASE_2D_BIS = [[[2, 1, 1, 3, [64, 64], [16, 32, 64, 128], 16, True]]] +CASE_3D = [[[3, 1, 1, 3, [64, 64, 64], [16, 32, 64, 128], 16, True]]] + + +def create_semantic_data(shape: list, semantic_regions: int): + """ + To create semantic and image mock inputs for the network. + Args: + shape: input shape + semantic_regions: number of semantic regions + Returns: + """ + out_label = torch.zeros(shape) + out_image = torch.zeros(shape) + torch.randn(shape) * 0.01 + for i in range(1, semantic_regions): + shape_square = [i // np.random.choice(list(range(2, i // 2))) for i in shape] + start_point = [np.random.choice(list(range(shape[ind] - shape_square[ind]))) for ind, i in enumerate(shape)] + if len(shape) == 2: + out_label[ + start_point[0] : (start_point[0] + shape_square[0]), start_point[1] : (start_point[1] + shape_square[1]) + ] = i + base_intensity = torch.ones(shape_square) * np.random.randn() + out_image[ + start_point[0] : (start_point[0] + shape_square[0]), start_point[1] : (start_point[1] + shape_square[1]) + ] = (base_intensity + torch.randn(shape_square) * 0.1) + elif len(shape) == 3: + out_label[ + start_point[0] : (start_point[0] + shape_square[0]), + start_point[1] : (start_point[1] + shape_square[1]), + start_point[2] : (start_point[2] + shape_square[2]), + ] = i + base_intensity = torch.ones(shape_square) * np.random.randn() + out_image[ + start_point[0] : (start_point[0] + shape_square[0]), + start_point[1] : (start_point[1] + shape_square[1]), + start_point[2] : (start_point[2] + shape_square[2]), + ] = (base_intensity + torch.randn(shape_square) * 0.1) + else: + ValueError("Supports only 2D and 3D tensors") + + # One hot encode label + out_label_ = torch.zeros([semantic_regions] + list(out_label.shape)) + for ch in range(semantic_regions): + out_label_[ch, ...] = out_label == ch + + return out_label_.unsqueeze(0), out_image.unsqueeze(0).unsqueeze(0) + + +class TestDiffusionModelUNet2D(unittest.TestCase): + @parameterized.expand(CASE_2D) + def test_forward_2d(self, input_param): + """ + Check that forward method is called correctly and output shape matches. + """ + net = SPADE_Net(*input_param) + in_label, in_image = create_semantic_data(input_param[4], input_param[3]) + with eval_mode(net): + out, kld = net(in_label, in_image) + self.assertEqual( + False, + True in torch.isnan(out) + or True in torch.isinf(out) + or True in torch.isinf(kld) + or True in torch.isinf(kld), + ) + self.assertEqual(list(out.shape), [1, 1, 64, 64]) + + @parameterized.expand(CASE_2D_BIS) + def test_encoder_decoder(self, input_param): + """ + Check that forward method is called correctly and output shape matches. + """ + net = SPADE_Net(*input_param) + in_label, in_image = create_semantic_data(input_param[4], input_param[3]) + with eval_mode(net): + out_z = net.encode(in_image) + self.assertEqual(list(out_z.shape), [1, 16]) + out_i = net.decode(in_label, out_z) + self.assertEqual(list(out_i.shape), [1, 1, 64, 64]) + + @parameterized.expand(CASE_3D) + def test_forward_3d(self, input_param): + """ + Check that forward method is called correctly and output shape matches. + """ + net = SPADE_Net(*input_param) + in_label, in_image = create_semantic_data(input_param[4], input_param[3]) + with eval_mode(net): + out, kld = net(in_label, in_image) + self.assertEqual( + False, + True in torch.isnan(out) + or True in torch.isinf(out) + or True in torch.isinf(kld) + or True in torch.isinf(kld), + ) + self.assertEqual(list(out.shape), [1, 1, 64, 64, 64]) + + def test_shape_wrong(self): + """ + We input an input shape that isn't divisible by 2**(n downstream steps) + """ + with self.assertRaises(ValueError): + net = SPADE_Net(1, 1, 8, [16, 16], [16, 32, 64, 128], 16, True) + + +if __name__ == "__main__": + unittest.main() diff --git a/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.ipynb b/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.ipynb index 11d059c3..2b398ee5 100644 --- a/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.ipynb +++ b/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.ipynb @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "350736c2", "metadata": {}, "outputs": [ @@ -80,29 +80,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "MONAI version: 1.1.dev2239\n", - "Numpy version: 1.23.3\n", - "Pytorch version: 1.8.0+cu111\n", + "MONAI version: 1.2.dev2304\n", + "Numpy version: 1.23.5\n", + "Pytorch version: 1.13.1+cu117\n", "MONAI flags: HAS_EXT = False, USE_COMPILED = False, USE_META_DICT = False\n", - "MONAI rev id: 13b24fa92b9d98bd0dc6d5cdcb52504fd09e297b\n", - "MONAI __file__: /media/walter/Storage/Projects/GenerativeModels/venv/lib/python3.8/site-packages/monai/__init__.py\n", + "MONAI rev id: 9a57be5aab9f2c2a134768c0c146399150e247a0\n", + "MONAI __file__: /home/vf19/PycharmProjects/GenerativeModels/venv/lib/python3.9/site-packages/monai/__init__.py\n", "\n", "Optional dependencies:\n", "Pytorch Ignite version: 0.4.10\n", - "Nibabel version: 4.0.2\n", - "scikit-image version: NOT INSTALLED or UNKNOWN VERSION.\n", - "Pillow version: 9.2.0\n", - "Tensorboard version: 2.11.0\n", - "gdown version: NOT INSTALLED or UNKNOWN VERSION.\n", - "TorchVision version: 0.9.0+cu111\n", + "ITK version: 5.3.0\n", + "Nibabel version: 5.0.0\n", + "scikit-image version: 0.19.3\n", + "Pillow version: 9.4.0\n", + "Tensorboard version: 2.12.0\n", + "gdown version: 4.6.3\n", + "TorchVision version: 0.14.1+cu117\n", "tqdm version: 4.64.1\n", - "lmdb version: NOT INSTALLED or UNKNOWN VERSION.\n", - "psutil version: 5.9.3\n", - "pandas version: NOT INSTALLED or UNKNOWN VERSION.\n", + "lmdb version: 1.4.0\n", + "psutil version: 5.9.4\n", + "pandas version: 1.5.3\n", "einops version: 0.6.0\n", - "transformers version: NOT INSTALLED or UNKNOWN VERSION.\n", - "mlflow version: NOT INSTALLED or UNKNOWN VERSION.\n", - "pynrrd version: NOT INSTALLED or UNKNOWN VERSION.\n", + "transformers version: 4.21.3\n", + "mlflow version: 2.1.1\n", + "pynrrd version: 1.0.0\n", "\n", "For details about installing the optional dependencies, please visit:\n", " https://docs.monai.io/en/latest/installation.html#installing-the-recommended-dependencies\n", @@ -115,7 +116,7 @@ "import shutil\n", "import tempfile\n", "import time\n", - "\n", + "from pathlib import Path\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", @@ -1229,7 +1230,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.9.16" } }, "nbformat": 4, diff --git a/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.py b/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.py index 53ccf898..39e44730 100644 --- a/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.py +++ b/tutorials/generative/2d_autoencoderkl/2d_autoencoderkl_tutorial.py @@ -42,7 +42,6 @@ import shutil import tempfile import time - import matplotlib.pyplot as plt import numpy as np import torch diff --git a/tutorials/generative/2d_spade_gan/2d_spade_vae.ipynb b/tutorials/generative/2d_spade_gan/2d_spade_vae.ipynb new file mode 100644 index 00000000..125ecd8b --- /dev/null +++ b/tutorials/generative/2d_spade_gan/2d_spade_vae.ipynb @@ -0,0 +1,2405 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1f7ba8ce", + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright (c) MONAI Consortium\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "# http://www.apache.org/licenses/LICENSE-2.0\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "markdown", + "id": "102909fb", + "metadata": {}, + "source": [ + "# SPADE VAE-GAN" + ] + }, + { + "cell_type": "markdown", + "id": "7d4cbc3c", + "metadata": {}, + "source": [ + "This notebook creates a mock SPADE VAE-GAN based on the paper \"Semantic Image Synthesis with Spatially-Adaptive Normalization\" (2019) by Park T, Liu MY, Wang TC, Zhu JY. More information available at: https://github.com/NVlabs/SPADE" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e059c423", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import os\n", + "import tempfile\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import torch\n", + "from pathlib import Path\n", + "import zipfile\n", + "import gdown\n", + "from monai.data import DataLoader\n", + "from tqdm import tqdm\n", + "from generative.losses import PatchAdversarialLoss, PerceptualLoss\n", + "from generative.networks.nets import MultiScalePatchDiscriminator\n", + "import numpy as np\n", + "import monai\n", + "from generative.networks.nets.spade_network import SPADE_Net" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e76296e7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Temporary directory used: /tmp/tmpz0rbc_3s \n" + ] + } + ], + "source": [ + "directory = os.environ.get(\"MONAI_DATA_DIRECTORY\")\n", + "root_dir = tempfile.mkdtemp() if directory is None else directory\n", + "root_dir = Path(root_dir)\n", + "print(\"Temporary directory used: %s \" % root_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "2483148a", + "metadata": {}, + "outputs": [], + "source": [ + "# INPUT PARAMETERS\n", + "input_shape = [128, 128]\n", + "batch_size = 6\n", + "num_workers = 4\n", + "num_epochs = 100\n", + "lambda_perc = 1.0\n", + "lambda_feat = 0.1\n", + "lambda_kld = 0.00001\n", + "loss_adv = 1.0" + ] + }, + { + "cell_type": "markdown", + "id": "3f2448ba", + "metadata": {}, + "source": [ + "### Data" + ] + }, + { + "cell_type": "markdown", + "id": "2c91eec2", + "metadata": {}, + "source": [ + "The data for this notebook comes from the public dataset OASIS (Open Access Series of Imaging Studies) [1]. The images have been registered to MNI space using ANTsPy, and then subsampled to 2mm isotropic resolution. Geodesic Information Flows (GIF) [2] has been used to segment 5 regions: cerebrospinal fluid (CSF), grey matter (GM), white matter (WM), deep grey matter (DGM) and brainstem. In addition, BaMos [3] has been used to provide white matter hyperintensities segmentations (WMH). The available dataset contains:\n", + "- T1-weighted images\n", + "- FLAIR weighted images\n", + "- Segmentations with the following labels: 0 (background), 1 (CSF), 2 (GM), 3 (WM), 4 (DGM), 5 (brainstem) and 6 (WMH).\n", + "\n", + "_**Acknowledgments**: \"Data were provided by OASIS-3: Longitudinal Multimodal Neuroimaging: Principal Investigators: T. Benzinger, D. Marcus, J. Morris; NIH P30 AG066444, P50 AG00561, P30 NS09857781, P01 AG026276, P01 AG003991, R01 AG043434, UL1 TR000448, R01 EB009352. AV-45 doses were provided by Avid Radiopharmaceuticals, a wholly owned subsidiary of Eli Lilly.”_\n", + "\n", + "\n", + "Citations:\n", + "\n", + "[1] Marcus, DS, Wang, TH, Parker, J, Csernansky, JG, Morris, JC, Buckner. Open Access Series of Imaging Studies (OASIS): Cross-Sectional MRI Data in Young, Middle Aged, Nondemented, and Demented Older Adults, RL. Journal of Cognitive Neuroscience, 19, 1498-1507. doi: 10.1162/jocn.2007.19.9.1498\n", + "\n", + "[2] Cardoso MJ, Modat M, Wolz R, Melbourne A, Cash D, Rueckert D, Ourselin S. Geodesic Information Flows: Spatially-Variant Graphs and Their Application to Segmentation and Fusion. IEEE Trans Med Imaging. 2015 Sep;34(9):1976-88. doi: 10.1109/TMI.2015.2418298. Epub 2015 Apr 14. PMID: 25879909.\n", + "\n", + "[3] Fiford CM, Sudre CH, Pemberton H, Walsh P, Manning E, Malone IB, Nicholas J, Bouvy WH, Carmichael OT, Biessels GJ, Cardoso MJ, Barnes J; Alzheimer’s Disease Neuroimaging Initiative. Automated White Matter Hyperintensity Segmentation Using Bayesian Model Selection: Assessment and Correlations with Cognitive Change. Neuroinformatics. 2020 Jun;18(3):429-449. doi: 10.1007/s12021-019-09439-6. PMID: 32062817; PMCID: PMC7338814.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dc560f7e", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading...\n", + "From: https://drive.google.com/uc?export=download&id=1SX_MCzQe-vyq09QYxECk32wZ2vxp9rx5\n", + "To: /tmp/tmpz0rbc_3s/data.zip\n", + "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 384M/384M [00:05<00:00, 67.0MB/s]\n" + ] + }, + { + "data": { + "text/plain": [ + "'/tmp/tmpz0rbc_3s/data.zip'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gdown.download(\n", + " \"https://drive.google.com/uc?export=download&id=1SX_MCzQe-vyq09QYxECk32wZ2vxp9rx5\", str(root_dir / \"data.zip\")\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cd7dd6ec", + "metadata": {}, + "outputs": [], + "source": [ + "zip_obj = zipfile.ZipFile(os.path.join(root_dir, \"data.zip\"), \"r\")\n", + "zip_obj.extractall(root_dir)\n", + "images_T1 = root_dir / \"OASIS_SMALL-SUBSET/T1\"\n", + "images_FLAIR = root_dir / \"OASIS_SMALL-SUBSET/FLAIR\"\n", + "labels = root_dir / \"OASIS_SMALL-SUBSET/Segmentations\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d48987b9", + "metadata": {}, + "outputs": [], + "source": [ + "# We create the data dictionaries that we need\n", + "all_images = [os.path.join(images_T1, i) for i in os.listdir(images_T1)] + [\n", + " os.path.join(images_FLAIR, i) for i in os.listdir(images_FLAIR)\n", + "]\n", + "np.random.shuffle(all_images)\n", + "corresponding_labels = [\n", + " os.path.join(labels, i.split(\"/\")[-1].replace(i.split(\"/\")[-1].split(\"_\")[0], \"Parcellation\")) for i in all_images\n", + "]\n", + "input_dict = [{\"image\": i, \"label\": corresponding_labels[ind]} for ind, i in enumerate(all_images)]\n", + "input_dict_train = input_dict[: int(len(input_dict) * 0.9)]\n", + "input_dict_val = input_dict[int(len(input_dict) * 0.9) :]" + ] + }, + { + "cell_type": "markdown", + "id": "9916ca5a", + "metadata": {}, + "source": [ + "### Dataloaders" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8ab79cdc", + "metadata": { + "lines_to_end_of_cell_marker": 2 + }, + "outputs": [], + "source": [ + "preliminar_shape = input_shape + [50] # We take random slices fron the center of the brain\n", + "crop_shape = input_shape + [1]\n", + "base_transforms = [\n", + " monai.transforms.LoadImaged(keys=[\"label\", \"image\"]),\n", + " monai.transforms.EnsureChannelFirstd(keys=[\"image\", \"label\"]),\n", + " monai.transforms.CenterSpatialCropd(keys=[\"label\", \"image\"], roi_size=preliminar_shape),\n", + " monai.transforms.RandSpatialCropd(keys=[\"label\", \"image\"], roi_size=crop_shape, max_roi_size=crop_shape),\n", + " monai.transforms.SqueezeDimd(keys=[\"label\", \"image\"], dim=-1),\n", + " monai.transforms.Resized(keys=[\"image\", \"label\"], spatial_size=input_shape),\n", + "]\n", + "last_transforms = [\n", + " monai.transforms.CopyItemsd(keys=[\"label\"], names=[\"label_channel\"]),\n", + " monai.transforms.Lambdad(keys=[\"label_channel\"], func=lambda l: l != 0),\n", + " monai.transforms.MaskIntensityd(keys=[\"image\"], mask_key=\"label_channel\"),\n", + " monai.transforms.NormalizeIntensityd(keys=[\"image\"]),\n", + " monai.transforms.ToTensord(keys=[\"image\", \"label\"]),\n", + "]\n", + "\n", + "aug_transforms = [\n", + " monai.transforms.RandBiasFieldd(coeff_range=(0, 0.005), prob=0.33, keys=[\"image\"]),\n", + " monai.transforms.RandAdjustContrastd(gamma=(0.9, 1.15), prob=0.33, keys=[\"image\"]),\n", + " monai.transforms.RandGaussianNoised(prob=0.33, mean=0.0, std=np.random.uniform(0.005, 0.015), keys=[\"image\"]),\n", + " monai.transforms.RandAffined(\n", + " rotate_range=[-0.05, 0.05],\n", + " shear_range=[0.001, 0.05],\n", + " scale_range=[0, 0.05],\n", + " padding_mode=\"zeros\",\n", + " mode=\"nearest\",\n", + " prob=0.33,\n", + " keys=[\"label\", \"image\"],\n", + " ),\n", + "]\n", + "\n", + "train_transforms = monai.transforms.Compose(base_transforms + aug_transforms + last_transforms)\n", + "val_transforms = monai.transforms.Compose(base_transforms + last_transforms)\n", + "\n", + "train_dataset = monai.data.dataset.Dataset(input_dict_train, train_transforms)\n", + "val_dataset = monai.data.dataset.Dataset(input_dict_val, val_transforms)\n", + "train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size, num_workers=num_workers)\n", + "val_loader = DataLoader(val_dataset, shuffle=False, drop_last=False, batch_size=batch_size, num_workers=num_workers)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "98d14e75", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([6, 1, 128, 128])\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Sanity check\n", + "batch = next(iter(train_loader))\n", + "print(batch[\"image\"].shape)\n", + "plt.subplot(1, 2, 1)\n", + "plt.imshow(batch[\"image\"][0, 0, ...], cmap=\"gist_gray\")\n", + "plt.axis(\"off\")\n", + "plt.subplot(1, 2, 2)\n", + "plt.imshow(batch[\"label\"][0, 0, ...], cmap=\"jet\")\n", + "plt.axis(\"off\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "63de4490", + "metadata": {}, + "source": [ + "### Network creation and losses" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "fa17d864", + "metadata": {}, + "outputs": [], + "source": [ + "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8f126b17", + "metadata": {}, + "outputs": [], + "source": [ + "def one_hot(input_label, label_nc):\n", + " # One hot encoding function for the labels\n", + " shape_ = list(input_label.shape)\n", + " shape_[1] = label_nc\n", + " label_out = torch.zeros(shape_)\n", + " for channel in range(label_nc):\n", + " label_out[:, channel, ...] = input_label[:, 0, ...] == channel\n", + " return label_out" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "255c90c7", + "metadata": {}, + "outputs": [], + "source": [ + "def picture_results(input_label, input_image, output_image):\n", + " f = plt.figure(figsize=(4, 1.5))\n", + " plt.subplot(1, 3, 1)\n", + " plt.imshow(torch.argmax(input_label, 1)[0, ...].detach().cpu(), cmap=\"jet\")\n", + " plt.axis(\"off\")\n", + " plt.title(\"Label\")\n", + " plt.subplot(1, 3, 2)\n", + " plt.imshow(input_image[0, 0, ...].detach().cpu(), cmap=\"gist_gray\")\n", + " plt.axis(\"off\")\n", + " plt.title(\"Input image\")\n", + " plt.subplot(1, 3, 3)\n", + " plt.imshow(output_image[0, 0, ...].detach().cpu(), cmap=\"gist_gray\")\n", + " plt.axis(\"off\")\n", + " plt.title(\"Output image\")\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "c18dbad8", + "metadata": {}, + "outputs": [], + "source": [ + "def feature_loss(input_features_disc_fake, input_features_disc_real, lambda_feat, device):\n", + " criterion = torch.nn.L1Loss()\n", + " num_D = len(input_features_disc_fake)\n", + " GAN_Feat_loss = torch.zeros(1).to(device)\n", + " for i in range(num_D): # for each discriminator\n", + " num_intermediate_outputs = len(input_features_disc_fake[i])\n", + " for j in range(num_intermediate_outputs): # for each layer output\n", + " unweighted_loss = criterion(input_features_disc_fake[i][j], input_features_disc_real[i][j].detach())\n", + " GAN_Feat_loss += unweighted_loss * lambda_feat / num_D\n", + " return GAN_Feat_loss" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "89989c34", + "metadata": {}, + "outputs": [], + "source": [ + "net = SPADE_Net(\n", + " spatial_dims=2,\n", + " in_channels=1,\n", + " out_channels=1,\n", + " label_nc=6,\n", + " input_shape=input_shape,\n", + " num_channels=[16, 32, 64, 128],\n", + " z_dim=16,\n", + " is_vae=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "5b8b676f", + "metadata": {}, + "outputs": [], + "source": [ + "discriminator = MultiScalePatchDiscriminator(\n", + " num_d=2,\n", + " num_layers_d=3,\n", + " spatial_dims=2,\n", + " num_channels=8,\n", + " in_channels=7,\n", + " out_channels=7,\n", + " minimum_size_im=128,\n", + " norm=\"INSTANCE\",\n", + " kernel_size=3,\n", + ")\n", + "\n", + "adversarial_loss = PatchAdversarialLoss(reduction=\"sum\", criterion=\"hinge\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "36ea4308", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead.\n", + "Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=VGG16_Weights.IMAGENET1K_V1`. You can also use `weights=VGG16_Weights.DEFAULT` to get the most up-to-date weights.\n" + ] + } + ], + "source": [ + "perceptual_loss = PerceptualLoss(spatial_dims=2, network_type=\"vgg\", is_fake_3d=False, pretrained=True)\n", + "perceptual_loss = perceptual_loss.to(device)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3b57abd3", + "metadata": {}, + "outputs": [], + "source": [ + "optimizer_G = torch.optim.Adam(net.parameters(), lr=0.0002)\n", + "optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=0.0004)" + ] + }, + { + "cell_type": "markdown", + "id": "b8fde71b", + "metadata": {}, + "source": [ + "### Training loop\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "918eac0a", + "metadata": { + "lines_to_next_cell": 2 + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 0/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████| 15/15 [00:06<00:00, 2.19it/s, kld=135, perceptual=0.221, generator=3.24, feature=0.113, discriminator=2.27]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████| 2/2 [00:00<00:00, 3.22it/s, kld=63.6, perceptual=0.254, generator=3.38, feature=0.125, discriminator=1.77]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.26it/s, kld=754, perceptual=0.354, generator=3.46, feature=0.168, discriminator=1.79]\n", + "100%|████████| 2/2 [00:00<00:00, 4.36it/s, kld=359, perceptual=0.36, generator=3.44, feature=0.173, discriminator=1.85]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 2/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.17it/s, kld=298, perceptual=0.324, generator=3.57, feature=0.167, discriminator=1.58]\n", + "100%|████████| 2/2 [00:00<00:00, 4.07it/s, kld=346, perceptual=0.34, generator=3.57, feature=0.167, discriminator=1.63]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 3/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|███████| 15/15 [00:06<00:00, 2.27it/s, kld=313, perceptual=0.32, generator=3.57, feature=0.166, discriminator=1.6]\n", + "100%|███████| 2/2 [00:00<00:00, 4.36it/s, kld=262, perceptual=0.325, generator=3.49, feature=0.164, discriminator=1.63]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 4/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.28it/s, kld=213, perceptual=0.305, generator=3.52, feature=0.168, discriminator=1.67]\n", + "100%|███████| 2/2 [00:00<00:00, 4.45it/s, kld=101, perceptual=0.307, generator=3.58, feature=0.164, discriminator=1.65]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 5/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.23it/s, kld=119, perceptual=0.302, generator=3.6, feature=0.165, discriminator=1.51]\n", + "100%|██████| 2/2 [00:00<00:00, 3.79it/s, kld=68.9, perceptual=0.288, generator=3.58, feature=0.165, discriminator=1.61]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 6/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.21it/s, kld=114, perceptual=0.286, generator=3.59, feature=0.163, discriminator=1.5]\n", + "100%|████████| 2/2 [00:00<00:00, 4.25it/s, kld=80, perceptual=0.278, generator=3.59, feature=0.161, discriminator=1.51]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 7/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████████| 15/15 [00:06<00:00, 2.28it/s, kld=116, perceptual=0.263, generator=3.6, feature=0.16, discriminator=1.5]\n", + "100%|█████████| 2/2 [00:00<00:00, 4.44it/s, kld=73.9, perceptual=0.269, generator=3.6, feature=0.16, discriminator=1.5]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 8/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|███████| 15/15 [00:06<00:00, 2.22it/s, kld=100, perceptual=0.25, generator=3.6, feature=0.155, discriminator=1.53]\n", + "100%|█████████| 2/2 [00:00<00:00, 4.31it/s, kld=54.1, perceptual=0.26, generator=3.6, feature=0.154, discriminator=1.5]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 9/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.19it/s, kld=97.2, perceptual=0.243, generator=3.54, feature=0.149, discriminator=1.57]\n", + "100%|██████| 2/2 [00:00<00:00, 4.01it/s, kld=69.7, perceptual=0.252, generator=3.62, feature=0.141, discriminator=1.46]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 10/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=106, perceptual=0.242, generator=3.52, feature=0.129, discriminator=1.72]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████| 2/2 [00:00<00:00, 3.42it/s, kld=109, perceptual=0.258, generator=3.54, feature=0.128, discriminator=1.6]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 11/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=413, perceptual=0.325, generator=3.21, feature=0.144, discriminator=2.18]\n", + "100%|███████| 2/2 [00:00<00:00, 3.80it/s, kld=252, perceptual=0.325, generator=3.39, feature=0.141, discriminator=1.88]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 12/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.26it/s, kld=238, perceptual=0.311, generator=3.55, feature=0.169, discriminator=1.67]\n", + "100%|████████| 2/2 [00:00<00:00, 4.29it/s, kld=214, perceptual=0.317, generator=3.57, feature=0.17, discriminator=1.61]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 13/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.25it/s, kld=110, perceptual=0.304, generator=3.57, feature=0.177, discriminator=1.55]\n", + "100%|███████| 2/2 [00:00<00:00, 4.01it/s, kld=53.1, perceptual=0.314, generator=3.58, feature=0.176, discriminator=1.5]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 14/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████████| 15/15 [00:06<00:00, 2.16it/s, kld=129, perceptual=0.27, generator=3.6, feature=0.17, discriminator=1.52]\n", + "100%|████████| 2/2 [00:00<00:00, 4.45it/s, kld=83.5, perceptual=0.295, generator=3.6, feature=0.17, discriminator=1.47]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 15/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.29it/s, kld=74.5, perceptual=0.254, generator=3.59, feature=0.166, discriminator=1.52]\n", + "100%|███████| 2/2 [00:00<00:00, 4.49it/s, kld=38.9, perceptual=0.285, generator=3.6, feature=0.166, discriminator=1.47]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 16/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.29it/s, kld=103, perceptual=0.25, generator=3.63, feature=0.162, discriminator=1.45]\n", + "100%|███████| 2/2 [00:00<00:00, 4.36it/s, kld=80.4, perceptual=0.246, generator=3.6, feature=0.159, discriminator=1.47]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 17/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.28it/s, kld=95.8, perceptual=0.247, generator=3.62, feature=0.162, discriminator=1.44]\n", + "100%|████████| 2/2 [00:00<00:00, 4.44it/s, kld=60, perceptual=0.233, generator=3.51, feature=0.166, discriminator=1.59]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 18/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.33it/s, kld=476, perceptual=0.248, generator=3.36, feature=0.152, discriminator=1.84]\n", + "100%|███████| 2/2 [00:00<00:00, 2.86it/s, kld=181, perceptual=0.251, generator=3.59, feature=0.172, discriminator=1.53]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 19/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.23it/s, kld=478, perceptual=0.285, generator=3.52, feature=0.15, discriminator=1.87]\n", + "100%|██████| 2/2 [00:00<00:00, 4.42it/s, kld=483, perceptual=0.304, generator=2.73, feature=0.0971, discriminator=2.46]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 20/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.20it/s, kld=725, perceptual=0.348, generator=3.31, feature=0.157, discriminator=1.78]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████| 2/2 [00:00<00:00, 2.95it/s, kld=530, perceptual=0.346, generator=3.16, feature=0.143, discriminator=1.94]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 21/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.24it/s, kld=143, perceptual=0.382, generator=3.6, feature=0.218, discriminator=1.46]\n", + "100%|██████| 2/2 [00:00<00:00, 4.35it/s, kld=80.1, perceptual=0.399, generator=3.61, feature=0.225, discriminator=1.44]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 22/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.25it/s, kld=179, perceptual=0.344, generator=3.59, feature=0.209, discriminator=1.51]\n", + "100%|██████| 2/2 [00:00<00:00, 4.43it/s, kld=91.7, perceptual=0.366, generator=3.62, feature=0.217, discriminator=1.38]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 23/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.21it/s, kld=336, perceptual=0.31, generator=3.59, feature=0.182, discriminator=1.49]\n", + "100%|████████| 2/2 [00:00<00:00, 4.46it/s, kld=216, perceptual=0.311, generator=3.6, feature=0.185, discriminator=1.48]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 24/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.23it/s, kld=423, perceptual=0.271, generator=3.58, feature=0.157, discriminator=1.53]\n", + "100%|███████| 2/2 [00:00<00:00, 4.07it/s, kld=136, perceptual=0.269, generator=3.59, feature=0.168, discriminator=1.52]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 25/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.26it/s, kld=349, perceptual=0.276, generator=3.6, feature=0.155, discriminator=1.45]\n", + "100%|███████| 2/2 [00:00<00:00, 4.41it/s, kld=220, perceptual=0.272, generator=3.61, feature=0.156, discriminator=1.45]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 26/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.31it/s, kld=109, perceptual=0.265, generator=3.62, feature=0.156, discriminator=1.46]\n", + "100%|███████| 2/2 [00:00<00:00, 4.00it/s, kld=117, perceptual=0.246, generator=3.59, feature=0.157, discriminator=1.52]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 27/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.27it/s, kld=209, perceptual=0.235, generator=3.61, feature=0.154, discriminator=1.47]\n", + "100%|███████| 2/2 [00:00<00:00, 4.47it/s, kld=120, perceptual=0.256, generator=3.61, feature=0.156, discriminator=1.43]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 28/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.33it/s, kld=146, perceptual=0.231, generator=3.61, feature=0.15, discriminator=1.44]\n", + "100%|██████| 2/2 [00:00<00:00, 4.35it/s, kld=76.3, perceptual=0.248, generator=3.61, feature=0.153, discriminator=1.41]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 29/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.28it/s, kld=180, perceptual=0.225, generator=3.59, feature=0.147, discriminator=1.45]\n", + "100%|███████| 2/2 [00:00<00:00, 4.18it/s, kld=98.1, perceptual=0.228, generator=3.6, feature=0.149, discriminator=1.43]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 30/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.31it/s, kld=113, perceptual=0.233, generator=3.63, feature=0.145, discriminator=1.37]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████| 2/2 [00:00<00:00, 3.31it/s, kld=90, perceptual=0.226, generator=3.6, feature=0.142, discriminator=1.43]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 31/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.21it/s, kld=114, perceptual=0.227, generator=3.63, feature=0.145, discriminator=1.4]\n", + "100%|██████| 2/2 [00:00<00:00, 4.38it/s, kld=62.7, perceptual=0.212, generator=3.64, feature=0.144, discriminator=1.32]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 32/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=102, perceptual=0.229, generator=3.62, feature=0.149, discriminator=1.36]\n", + "100%|██████| 2/2 [00:00<00:00, 4.42it/s, kld=89.2, perceptual=0.233, generator=3.63, feature=0.143, discriminator=1.36]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 33/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|███████| 15/15 [00:06<00:00, 2.23it/s, kld=155, perceptual=0.2, generator=3.61, feature=0.144, discriminator=1.38]\n", + "100%|██████| 2/2 [00:00<00:00, 4.19it/s, kld=70.7, perceptual=0.226, generator=3.61, feature=0.144, discriminator=1.41]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 34/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.24it/s, kld=118, perceptual=0.217, generator=3.6, feature=0.144, discriminator=1.38]\n", + "100%|██████| 2/2 [00:00<00:00, 4.08it/s, kld=77.5, perceptual=0.204, generator=3.62, feature=0.145, discriminator=1.37]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 35/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.21it/s, kld=128, perceptual=0.199, generator=3.49, feature=0.138, discriminator=1.54]\n", + "100%|██████| 2/2 [00:00<00:00, 4.23it/s, kld=72.3, perceptual=0.219, generator=3.58, feature=0.146, discriminator=1.42]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 36/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.29it/s, kld=137, perceptual=0.206, generator=3.62, feature=0.144, discriminator=1.37]\n", + "100%|██████| 2/2 [00:00<00:00, 4.47it/s, kld=98.9, perceptual=0.222, generator=3.63, feature=0.145, discriminator=1.42]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 37/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.18it/s, kld=250, perceptual=0.227, generator=3.61, feature=0.148, discriminator=1.47]\n", + "100%|███████| 2/2 [00:00<00:00, 4.23it/s, kld=142, perceptual=0.217, generator=3.58, feature=0.148, discriminator=1.45]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 38/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.32it/s, kld=101, perceptual=0.208, generator=3.62, feature=0.145, discriminator=1.36]\n", + "100%|██████| 2/2 [00:00<00:00, 4.44it/s, kld=66.2, perceptual=0.211, generator=3.63, feature=0.145, discriminator=1.35]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 39/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.25it/s, kld=99.7, perceptual=0.209, generator=3.61, feature=0.146, discriminator=1.37]\n", + "100%|██████| 2/2 [00:00<00:00, 3.83it/s, kld=74.2, perceptual=0.202, generator=3.62, feature=0.143, discriminator=1.38]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 40/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.25it/s, kld=132, perceptual=0.206, generator=3.6, feature=0.141, discriminator=1.37]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████| 2/2 [00:00<00:00, 3.33it/s, kld=86.4, perceptual=0.205, generator=3.63, feature=0.142, discriminator=1.36]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 41/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.22it/s, kld=87.2, perceptual=0.208, generator=3.64, feature=0.138, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 3.98it/s, kld=73.5, perceptual=0.197, generator=3.62, feature=0.141, discriminator=1.35]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 42/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.25it/s, kld=120, perceptual=0.219, generator=3.62, feature=0.148, discriminator=1.34]\n", + "100%|██████| 2/2 [00:00<00:00, 4.48it/s, kld=55.8, perceptual=0.207, generator=3.63, feature=0.136, discriminator=1.33]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 43/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.27it/s, kld=95.9, perceptual=0.198, generator=3.64, feature=0.135, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.34it/s, kld=57.2, perceptual=0.209, generator=3.66, feature=0.135, discriminator=1.25]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 44/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=128, perceptual=0.197, generator=3.62, feature=0.132, discriminator=1.34]\n", + "100%|██████| 2/2 [00:00<00:00, 3.98it/s, kld=82.2, perceptual=0.182, generator=3.62, feature=0.124, discriminator=1.35]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 45/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.19it/s, kld=108, perceptual=0.184, generator=3.63, feature=0.126, discriminator=1.32]\n", + "100%|██████| 2/2 [00:00<00:00, 4.10it/s, kld=72.3, perceptual=0.195, generator=3.64, feature=0.132, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 46/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=115, perceptual=0.188, generator=3.62, feature=0.126, discriminator=1.32]\n", + "100%|██████| 2/2 [00:00<00:00, 4.20it/s, kld=60.3, perceptual=0.213, generator=3.65, feature=0.129, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 47/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.18it/s, kld=105, perceptual=0.206, generator=3.64, feature=0.127, discriminator=1.28]\n", + "100%|██████| 2/2 [00:00<00:00, 4.34it/s, kld=59.4, perceptual=0.202, generator=3.66, feature=0.125, discriminator=1.26]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 48/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=106, perceptual=0.176, generator=3.63, feature=0.128, discriminator=1.32]\n", + "100%|███████| 2/2 [00:00<00:00, 4.31it/s, kld=55.1, perceptual=0.21, generator=3.64, feature=0.134, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 49/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.26it/s, kld=88.5, perceptual=0.192, generator=3.62, feature=0.131, discriminator=1.33]\n", + "100%|████████| 2/2 [00:00<00:00, 4.29it/s, kld=63.5, perceptual=0.2, generator=3.61, feature=0.131, discriminator=1.35]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 50/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.33it/s, kld=94.5, perceptual=0.2, generator=3.64, feature=0.129, discriminator=1.31]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████| 2/2 [00:00<00:00, 3.45it/s, kld=52.4, perceptual=0.203, generator=3.65, feature=0.133, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 51/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.27it/s, kld=87.7, perceptual=0.192, generator=3.62, feature=0.131, discriminator=1.34]\n", + "100%|███████| 2/2 [00:00<00:00, 4.27it/s, kld=50.3, perceptual=0.207, generator=3.64, feature=0.133, discriminator=1.3]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 52/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.30it/s, kld=91.9, perceptual=0.184, generator=3.62, feature=0.127, discriminator=1.33]\n", + "100%|██████| 2/2 [00:00<00:00, 4.32it/s, kld=65.7, perceptual=0.182, generator=3.62, feature=0.128, discriminator=1.35]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 53/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.29it/s, kld=84.6, perceptual=0.193, generator=3.62, feature=0.136, discriminator=1.34]\n", + "100%|██████| 2/2 [00:00<00:00, 4.45it/s, kld=67.2, perceptual=0.176, generator=3.63, feature=0.129, discriminator=1.32]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 54/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████████| 15/15 [00:06<00:00, 2.31it/s, kld=91.9, perceptual=0.2, generator=3.64, feature=0.14, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.49it/s, kld=43.8, perceptual=0.204, generator=3.64, feature=0.133, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 55/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.29it/s, kld=118, perceptual=0.183, generator=3.64, feature=0.129, discriminator=1.28]\n", + "100%|███████| 2/2 [00:00<00:00, 4.44it/s, kld=71.7, perceptual=0.195, generator=3.6, feature=0.141, discriminator=1.37]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 56/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.35it/s, kld=102, perceptual=0.202, generator=3.63, feature=0.137, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.18it/s, kld=64.4, perceptual=0.188, generator=3.62, feature=0.133, discriminator=1.33]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 57/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.28it/s, kld=96.8, perceptual=0.181, generator=3.61, feature=0.125, discriminator=1.36]\n", + "100%|██████| 2/2 [00:00<00:00, 4.54it/s, kld=54.1, perceptual=0.201, generator=3.59, feature=0.136, discriminator=1.36]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 58/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.33it/s, kld=137, perceptual=0.195, generator=3.62, feature=0.134, discriminator=1.35]\n", + "100%|██████| 2/2 [00:00<00:00, 4.09it/s, kld=64.9, perceptual=0.198, generator=3.63, feature=0.133, discriminator=1.32]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 59/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.33it/s, kld=77.3, perceptual=0.189, generator=3.64, feature=0.13, discriminator=1.29]\n", + "100%|██████| 2/2 [00:00<00:00, 3.47it/s, kld=48.4, perceptual=0.187, generator=3.65, feature=0.132, discriminator=1.26]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 60/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:07<00:00, 2.11it/s, kld=76.1, perceptual=0.179, generator=3.62, feature=0.132, discriminator=1.31]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████| 2/2 [00:00<00:00, 3.59it/s, kld=45.9, perceptual=0.196, generator=3.65, feature=0.133, discriminator=1.26]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 61/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.22it/s, kld=91.5, perceptual=0.192, generator=3.64, feature=0.134, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.30it/s, kld=51.4, perceptual=0.175, generator=3.63, feature=0.127, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 62/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.24it/s, kld=89.7, perceptual=0.199, generator=3.65, feature=0.132, discriminator=1.25]\n", + "100%|██████| 2/2 [00:00<00:00, 4.25it/s, kld=51.4, perceptual=0.179, generator=3.59, feature=0.133, discriminator=1.36]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 63/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.22it/s, kld=85.4, perceptual=0.18, generator=3.61, feature=0.13, discriminator=1.34]\n", + "100%|██████| 2/2 [00:00<00:00, 3.02it/s, kld=69.2, perceptual=0.195, generator=3.62, feature=0.135, discriminator=1.33]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 64/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.30it/s, kld=113, perceptual=0.185, generator=3.64, feature=0.126, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.46it/s, kld=67.6, perceptual=0.206, generator=3.65, feature=0.128, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 65/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.27it/s, kld=79, perceptual=0.163, generator=3.61, feature=0.124, discriminator=1.33]\n", + "100%|██████| 2/2 [00:00<00:00, 3.91it/s, kld=47.8, perceptual=0.198, generator=3.63, feature=0.133, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 66/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:07<00:00, 2.13it/s, kld=80.8, perceptual=0.174, generator=3.63, feature=0.13, discriminator=1.3]\n", + "100%|███████| 2/2 [00:00<00:00, 4.20it/s, kld=62.5, perceptual=0.172, generator=3.63, feature=0.134, discriminator=1.3]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 67/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.23it/s, kld=88.8, perceptual=0.208, generator=3.64, feature=0.135, discriminator=1.28]\n", + "100%|██████| 2/2 [00:00<00:00, 4.25it/s, kld=48.4, perceptual=0.196, generator=3.64, feature=0.135, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 68/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.19it/s, kld=100, perceptual=0.202, generator=3.63, feature=0.135, discriminator=1.29]\n", + "100%|██████| 2/2 [00:00<00:00, 4.05it/s, kld=61.3, perceptual=0.208, generator=3.65, feature=0.135, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 69/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.29it/s, kld=116, perceptual=0.201, generator=3.64, feature=0.134, discriminator=1.29]\n", + "100%|████████| 2/2 [00:00<00:00, 4.46it/s, kld=68, perceptual=0.188, generator=3.64, feature=0.132, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 70/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.21it/s, kld=74.7, perceptual=0.187, generator=3.63, feature=0.131, discriminator=1.3]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████| 2/2 [00:00<00:00, 3.44it/s, kld=54.3, perceptual=0.17, generator=3.64, feature=0.126, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 71/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.21it/s, kld=102, perceptual=0.186, generator=3.65, feature=0.132, discriminator=1.27]\n", + "100%|██████| 2/2 [00:00<00:00, 4.29it/s, kld=63.4, perceptual=0.191, generator=3.66, feature=0.131, discriminator=1.25]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 72/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.17it/s, kld=161, perceptual=0.191, generator=3.64, feature=0.132, discriminator=1.29]\n", + "100%|███████| 2/2 [00:00<00:00, 4.33it/s, kld=77.6, perceptual=0.165, generator=3.64, feature=0.13, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 73/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.23it/s, kld=102, perceptual=0.185, generator=3.61, feature=0.132, discriminator=1.31]\n", + "100%|██████| 2/2 [00:00<00:00, 4.36it/s, kld=64.2, perceptual=0.204, generator=3.64, feature=0.137, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 74/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.18it/s, kld=71.9, perceptual=0.188, generator=3.63, feature=0.135, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.13it/s, kld=50.9, perceptual=0.206, generator=3.65, feature=0.131, discriminator=1.26]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 75/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.25it/s, kld=72.6, perceptual=0.179, generator=3.65, feature=0.124, discriminator=1.26]\n", + "100%|███████| 2/2 [00:00<00:00, 4.15it/s, kld=44.3, perceptual=0.182, generator=3.58, feature=0.13, discriminator=1.34]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 76/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.20it/s, kld=165, perceptual=0.177, generator=3.64, feature=0.131, discriminator=1.3]\n", + "100%|████████| 2/2 [00:00<00:00, 4.08it/s, kld=95, perceptual=0.205, generator=3.63, feature=0.138, discriminator=1.31]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 77/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.23it/s, kld=107, perceptual=0.179, generator=3.64, feature=0.126, discriminator=1.28]\n", + "100%|███████| 2/2 [00:00<00:00, 4.41it/s, kld=56.1, perceptual=0.203, generator=3.63, feature=0.138, discriminator=1.3]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 78/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.23it/s, kld=82.6, perceptual=0.174, generator=3.63, feature=0.126, discriminator=1.29]\n", + "100%|███████| 2/2 [00:00<00:00, 4.19it/s, kld=56.4, perceptual=0.19, generator=3.64, feature=0.136, discriminator=1.26]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 79/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.29it/s, kld=88.3, perceptual=0.177, generator=3.65, feature=0.123, discriminator=1.26]\n", + "100%|███████| 2/2 [00:00<00:00, 4.33it/s, kld=55.7, perceptual=0.17, generator=3.65, feature=0.128, discriminator=1.24]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 80/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.26it/s, kld=92.4, perceptual=0.185, generator=3.62, feature=0.135, discriminator=1.31]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████| 2/2 [00:00<00:00, 3.51it/s, kld=62.6, perceptual=0.191, generator=3.66, feature=0.132, discriminator=1.24]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 81/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.27it/s, kld=93.2, perceptual=0.183, generator=3.64, feature=0.132, discriminator=1.29]\n", + "100%|███████| 2/2 [00:00<00:00, 4.39it/s, kld=64.2, perceptual=0.197, generator=3.66, feature=0.13, discriminator=1.24]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 82/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.20it/s, kld=90.5, perceptual=0.176, generator=3.65, feature=0.131, discriminator=1.28]\n", + "100%|██████| 2/2 [00:00<00:00, 4.01it/s, kld=61.5, perceptual=0.199, generator=3.67, feature=0.131, discriminator=1.23]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 83/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.26it/s, kld=89.7, perceptual=0.184, generator=3.66, feature=0.129, discriminator=1.24]\n", + "100%|██████| 2/2 [00:00<00:00, 4.12it/s, kld=61.7, perceptual=0.181, generator=3.66, feature=0.123, discriminator=1.25]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 84/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.22it/s, kld=89.6, perceptual=0.181, generator=3.65, feature=0.133, discriminator=1.25]\n", + "100%|███████| 2/2 [00:00<00:00, 4.47it/s, kld=46.8, perceptual=0.178, generator=3.65, feature=0.13, discriminator=1.26]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 85/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.27it/s, kld=96.5, perceptual=0.192, generator=3.64, feature=0.13, discriminator=1.28]\n", + "100%|███████| 2/2 [00:00<00:00, 4.30it/s, kld=66.1, perceptual=0.19, generator=3.63, feature=0.133, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 86/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.23it/s, kld=150, perceptual=0.197, generator=3.65, feature=0.134, discriminator=1.27]\n", + "100%|████████| 2/2 [00:00<00:00, 4.41it/s, kld=72, perceptual=0.208, generator=3.62, feature=0.141, discriminator=1.32]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 87/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.26it/s, kld=119, perceptual=0.178, generator=3.63, feature=0.129, discriminator=1.3]\n", + "100%|██████| 2/2 [00:00<00:00, 4.19it/s, kld=81.4, perceptual=0.176, generator=3.63, feature=0.133, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 88/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.23it/s, kld=102, perceptual=0.173, generator=3.64, feature=0.13, discriminator=1.26]\n", + "100%|███████| 2/2 [00:00<00:00, 4.28it/s, kld=54.9, perceptual=0.192, generator=3.63, feature=0.136, discriminator=1.3]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 89/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.22it/s, kld=105, perceptual=0.178, generator=3.63, feature=0.137, discriminator=1.29]\n", + "100%|██████| 2/2 [00:00<00:00, 4.18it/s, kld=85.9, perceptual=0.173, generator=3.64, feature=0.129, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 90/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.16it/s, kld=78.7, perceptual=0.17, generator=3.65, feature=0.132, discriminator=1.28]\n", + " 0%| | 0/2 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████| 2/2 [00:00<00:00, 3.52it/s, kld=50.1, perceptual=0.159, generator=3.65, feature=0.126, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 91/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.22it/s, kld=120, perceptual=0.175, generator=3.65, feature=0.13, discriminator=1.26]\n", + "100%|██████| 2/2 [00:00<00:00, 3.88it/s, kld=54.5, perceptual=0.193, generator=3.64, feature=0.136, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 92/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.16it/s, kld=85.1, perceptual=0.178, generator=3.67, feature=0.133, discriminator=1.22]\n", + "100%|██████| 2/2 [00:00<00:00, 4.22it/s, kld=56.2, perceptual=0.163, generator=3.66, feature=0.129, discriminator=1.24]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 93/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.19it/s, kld=98, perceptual=0.177, generator=3.64, feature=0.136, discriminator=1.27]\n", + "100%|██████| 2/2 [00:00<00:00, 4.38it/s, kld=63.8, perceptual=0.192, generator=3.66, feature=0.131, discriminator=1.24]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 94/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.22it/s, kld=117, perceptual=0.189, generator=3.64, feature=0.134, discriminator=1.29]\n", + "100%|██████| 2/2 [00:00<00:00, 4.20it/s, kld=62.4, perceptual=0.158, generator=3.63, feature=0.124, discriminator=1.29]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 95/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.24it/s, kld=115, perceptual=0.186, generator=3.67, feature=0.131, discriminator=1.22]\n", + "100%|██████| 2/2 [00:00<00:00, 4.25it/s, kld=72.7, perceptual=0.161, generator=3.64, feature=0.126, discriminator=1.28]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 96/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|████| 15/15 [00:06<00:00, 2.16it/s, kld=83.2, perceptual=0.161, generator=3.66, feature=0.127, discriminator=1.24]\n", + "100%|████████| 2/2 [00:00<00:00, 4.27it/s, kld=76, perceptual=0.166, generator=3.65, feature=0.128, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 97/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.21it/s, kld=100, perceptual=0.173, generator=3.64, feature=0.128, discriminator=1.27]\n", + "100%|███████| 2/2 [00:00<00:00, 3.91it/s, kld=52.8, perceptual=0.16, generator=3.64, feature=0.122, discriminator=1.27]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 98/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|█████| 15/15 [00:06<00:00, 2.19it/s, kld=105, perceptual=0.188, generator=3.63, feature=0.133, discriminator=1.29]\n", + "100%|██████| 2/2 [00:00<00:00, 4.30it/s, kld=66.9, perceptual=0.182, generator=3.66, feature=0.131, discriminator=1.22]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 99/100\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "100%|██████| 15/15 [00:06<00:00, 2.24it/s, kld=107, perceptual=0.164, generator=3.64, feature=0.126, discriminator=1.3]\n", + "100%|███████| 2/2 [00:00<00:00, 3.99it/s, kld=63.3, perceptual=0.16, generator=3.66, feature=0.129, discriminator=1.25]\n" + ] + } + ], + "source": [ + "net = net.to(device)\n", + "discriminator = discriminator.to(device)\n", + "torch.autograd.set_detect_anomaly(True)\n", + "losses = {\"kld\": [], \"perceptual\": [], \"feature\": [], \"generator\": [], \"discriminator\": []}\n", + "losses_val = {\"kld\": [], \"perceptual\": [], \"feature\": [], \"generator\": [], \"discriminator\": []}\n", + "for epoch in range(num_epochs):\n", + " print(\"Epoch %d/%d\" % (epoch, num_epochs))\n", + " train_bar = tqdm(enumerate(train_loader), total=len(train_loader), ncols=120)\n", + " losses_epoch = {\"kld\": 0, \"perceptual\": 0, \"feature\": 0, \"generator\": 0, \"discriminator\": 0}\n", + " for step, d in train_bar:\n", + " image = d[\"image\"].to(device)\n", + " with torch.no_grad():\n", + " label = one_hot(d[\"label\"], 6).to(device)\n", + " optimizer_G.zero_grad()\n", + "\n", + " # Losses gen\n", + " out, kld_loss = net(label, image)\n", + " disc_fakes, features_fakes = discriminator(torch.cat([out, label], 1))\n", + " loss_g = adversarial_loss(disc_fakes, target_is_real=True, for_discriminator=False)\n", + " disc_reals, features_reals = discriminator(torch.cat([image, label], 1))\n", + " loss_feat = feature_loss(features_fakes, features_reals, lambda_feat, device)\n", + " loss_perc = perceptual_loss(out, target=image)\n", + " total_loss = loss_g + loss_perc * lambda_perc + kld_loss * lambda_kld + loss_feat * lambda_feat\n", + " total_loss.backward(retain_graph=True)\n", + " optimizer_G.step()\n", + "\n", + " # Store\n", + " losses_epoch[\"kld\"] += kld_loss.item()\n", + " losses_epoch[\"perceptual\"] += loss_perc.item()\n", + " losses_epoch[\"generator\"] += loss_g.item()\n", + " # Train disc\n", + " out, _ = net(label, image)\n", + " disc_fakes, _ = discriminator(torch.cat([out, label], 1))\n", + " loss_d_r = adversarial_loss(disc_reals, target_is_real=True, for_discriminator=True)\n", + " loss_g_f = adversarial_loss(disc_fakes, target_is_real=False, for_discriminator=True)\n", + " optimizer_D.zero_grad()\n", + " loss_d = loss_d_r + loss_g_f\n", + " loss_d.backward()\n", + " optimizer_D.step()\n", + "\n", + " # Store\n", + " losses_epoch[\"feature\"] = loss_feat.item()\n", + " losses_epoch[\"discriminator\"] = loss_d_r.item() + loss_g_f.item()\n", + "\n", + " train_bar.set_postfix(\n", + " {\n", + " \"kld\": kld_loss.item(),\n", + " \"perceptual\": loss_perc.item(),\n", + " \"generator\": loss_g.item(),\n", + " \"feature\": loss_feat.item(),\n", + " \"discriminator\": loss_d_r.item() + loss_g_f.item(),\n", + " }\n", + " )\n", + "\n", + " val_bar = tqdm(enumerate(val_loader), total=len(val_loader), ncols=120)\n", + " losses_epoch_val = {\"kld\": 0, \"perceptual\": 0, \"feature\": 0, \"generator\": 0, \"discriminator\": 0}\n", + " for step, d in val_bar:\n", + " image = d[\"image\"].to(device)\n", + " with torch.no_grad():\n", + " label = one_hot(d[\"label\"], 6).to(device)\n", + " # Losses gen\n", + " out, kld_loss = net(label, image)\n", + " disc_fakes, features_fakes = discriminator(torch.cat([out, label], 1))\n", + " loss_g = adversarial_loss(disc_fakes, target_is_real=True, for_discriminator=False)\n", + " disc_reals, features_reals = discriminator(torch.cat([image, label], 1))\n", + " loss_feat = feature_loss(features_fakes, features_reals, lambda_feat, device)\n", + " loss_perc = perceptual_loss(out, target=image)\n", + " total_loss = loss_adv * loss_g + loss_perc * lambda_perc + kld_loss * lambda_kld + loss_feat * lambda_feat\n", + " # Store\n", + " losses_epoch_val[\"kld\"] += kld_loss.item()\n", + " losses_epoch_val[\"perceptual\"] += loss_perc.item()\n", + " losses_epoch_val[\"generator\"] += loss_g.item()\n", + " # Train disc\n", + " out, _ = net(label, image)\n", + " disc_fakes, _ = discriminator(torch.cat([out, label], 1))\n", + " loss_d_r = adversarial_loss(disc_reals, target_is_real=True, for_discriminator=True)\n", + " loss_g_f = adversarial_loss(disc_fakes, target_is_real=False, for_discriminator=True)\n", + " loss_d = loss_adv * (loss_d_r + loss_g_f)\n", + "\n", + " # Store\n", + " losses_epoch_val[\"feature\"] = loss_feat.item()\n", + " losses_epoch_val[\"discriminator\"] = loss_d_r.item() + loss_g_f.item()\n", + "\n", + " val_bar.set_postfix(\n", + " {\n", + " \"kld\": kld_loss.item(),\n", + " \"perceptual\": loss_perc.item(),\n", + " \"generator\": loss_g.item(),\n", + " \"feature\": loss_feat.item(),\n", + " \"discriminator\": loss_d_r.item() + loss_g_f.item(),\n", + " }\n", + " )\n", + " if step == 0 and epoch % 10 == 0:\n", + " picture_results(label, image, out)\n", + " for key, val in losses_epoch.items():\n", + " losses[key].append(val / len(train_loader))\n", + " for key, val in losses_epoch_val.items():\n", + " losses_val[key].append(val / len(val_loader))" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "d79c8ced", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Lr788ku8++678PX1xZAhQ2wun0KhwNSpU3Hr1i2oVCp07twZ69atK4NPTkjVJDDGmKMLQQipGIIgYOPGjRgwYICji0IIsRGNURNCCCFOjAI1IYQQ4sRojJqQaoRGugipfKhFTQghhDgxCtSEEEKIE6NATQghhDgxCtSEEEKIE6NATQghhDgxCtSEEEKIE6NATQghhDgxCtSEEEKIE6NATQghhDgxCtSEEEKIE6NATQghhDgxCtSEEEKIE6NATQghhDgxCtSEEEKIE6NATQipEm7dugVBEPD99987uiiElCkK1ISQcnPhwgXMmjULt27dcnRRCKm0KFATQsrNhQsXMHv2bArUhDwCCtSEVHHZ2dmOLgIh5BFQoCbEgWbNmgVBEHDp0iUMHToUarUaPj4+mDhxInJzc63OXbNmDdq0aQOVSgVvb2+88MILiI2NtTqnW7duaNasGU6cOIEuXbrA1dUVH374IQAgNzcXs2bNQoMGDeDi4oKgoCAMGjQI169fN/++KIpYvHgxmjZtChcXFwQEBOCNN97A/fv3rd4nLCwM/fr1wz///INWrVrBxcUFTZo0wYYNG8znfP/993juuecAAN27d4cgCBAEAXv27AEACIKAWbNmFaqTsLAwvPLKK+bHqampePfdd9G8eXO4u7tDrVajT58+OH36tN31TUhlRIGaECcwdOhQ5ObmYv78+Xj66afx9ddfY/To0ebn586dixEjRqB+/fpYtGgRJk2ahKioKHTp0gVpaWlWr5WSkoI+ffqgVatWWLx4Mbp37w6j0Yh+/fph9uzZaNOmDb744gtMnDgR6enpOHfunPl333jjDUyZMgWdOnXCV199hZEjR2Lt2rXo1asXDAaD1ftcvXoVzz//PPr06YP58+dDJpPhueeew86dOwEAXbp0wVtvvQUA+PDDD/HTTz/hp59+QuPGje2qmxs3bmDTpk3o168fFi1ahClTpuDs2bPo2rUr4uLi7HotQiolRghxmJkzZzIA7Nlnn7U6PnbsWAaAnT59mt26dYtJpVI2d+5cq3POnj3LZDKZ1fGuXbsyAGz58uVW565atYoBYIsWLSpUBlEUGWOM7d+/nwFga9eutXp++/bthY7XqlWLAWB//PGH+Vh6ejoLCgpirVu3Nh9bv349A8B2795d6H0BsJkzZxY6XqtWLRYZGWl+nJuby4xGo9U5N2/eZEqlkn388cdWxwCw1atXF3pNQiozalET4gTGjRtn9XjChAkAgK1bt2LDhg0QRRFDhw5FcnKy+ScwMBD169fH7t27rX5XqVRi5MiRVsf++OMP+Pr6ml+3IEEQAADr16+Hp6cnnnzySav3adOmDdzd3Qu9T3BwMAYOHGh+rFarMWLECJw6dQrx8fGlr4wHKJVKSCT8q8poNCIlJQXu7u5o2LAhTp48WWbvQ4izkjm6AIQQoH79+laP69atC4lEglu3bkEikYAxVugcE7lcbvU4JCQECoXC6tj169fRsGFDyGTF/5e/evUq0tPT4e/vX+TziYmJVo/r1atnDvImDRo0AMDnNAcGBhb7XvYQRRFfffUVvvnmG9y8eRNGo9H8nI+PT5m8ByHOjAI1IU6oYAAURRGCIGDbtm2QSqWFznV3d7d6rFKpSvWeoijC398fa9euLfJ5Pz+/Ur2uvQoGYgCYN28epk+fjldffRVz5syBt7c3JBIJJk2aBFEUK6RMhDgSBWpCnMDVq1dRu3Zt8+Nr165BFEWEhYVBKpWCMYbatWubW6z2qlu3Lo4cOQKDwVCoBV7wnH///RedOnWyKdhfu3YNjDGri4orV64A4JnbAAq1uAvy8vIqlAin1+tx7949q2O///47unfvju+++87qeFpaGnx9fR9aTkIqOxqjJsQJLF261OrxkiVLAAB9+vTBoEGDIJVKMXv2bDDGrM5jjCElJeWhrz948GAkJyfjf//7X6HnTK85dOhQGI1GzJkzp9A5eXl5hYJqXFwcNm7caH6s1Wrx448/olWrVuZubzc3NwAo9LsAvzDYt2+f1bEVK1YUalGbLlQKWr9+Pe7evVvMpyWkaqEWNSFO4ObNm3j22WfRu3dvHDp0CGvWrMGLL76Ili1bAgA++eQTTJ06Fbdu3cKAAQPg4eGBmzdvYuPGjRg9ejTefffdEl9/xIgR+PHHHzF58mQcPXoUnTt3RlZWFv7991+MHTsW/fv3R9euXfHGG29g/vz5iI6OxlNPPQW5XI6rV69i/fr1+OqrrzBkyBDzazZo0ACvvfYajh07hoCAAKxatQoJCQlYvXq1+ZxWrVpBKpXi008/RXp6OpRKJZ544gn4+/vj9ddfx5gxYzB48GA8+eSTOH36NHbs2FGoldyvXz98/PHHGDlyJDp27IizZ89i7dq1qFOnThn+CxDixByYcU5ItWeannXhwgU2ZMgQ5uHhwby8vNj48eNZTk6O1bl//PEHe/zxx5mbmxtzc3NjjRo1YuPGjWOXL182n9O1a1fWtGnTIt8rOzubTZs2jdWuXZvJ5XIWGBjIhgwZwq5fv2513ooVK1ibNm2YSqViHh4erHnz5uy9995jcXFx5nNq1arF+vbty3bs2MFatGjBlEola9SoEVu/fn2h9125ciWrU6cOk0qlVlO1jEYje//995mvry9zdXVlvXr1YteuXStyetY777zDgoKCmEqlYp06dWKHDh1iXbt2ZV27djWfR9OzSFUlMPZAnxIhpMLMmjULs2fPRlJSUqUabw0LC0OzZs2wZcsWRxeFkCqPxqgJIYQQJ0aBmhBCCHFiFKgJIYQQJ0Zj1IQQQogToxY1IYQQ4sQqbB710qVLsXDhQsTHx6Nly5ZYsmQJ2rdv/9DfW7duHYYNG4b+/ftj06ZNNr+fKIqIi4uDh4dHiasjEUIIIRWNMYaMjAwEBwebN50p6eRyt27dOqZQKNiqVavY+fPn2ahRo5hGo2EJCQkl/t7NmzdZSEgI69y5M+vfv79d7xkbG8sA0A/90A/90A/9OO1PbGzsQ+NZhYxRh4eHo127dublC0VRRGhoKCZMmIAPPvigyN8xGo3o0qULXn31Vezfvx9paWkltqh1Oh10Op35cXp6OmrWrInY2Fio1eoy/TyEEELIo9BqtQgNDUVaWho8PT1LPLfcu771ej1OnDiBqVOnmo9JJBL07NkThw4dKvb3Pv74Y/j7++O1117D/v37H/o+8+fPx+zZswsdV6vVFKgJIYQ4JVuGZss9mSw5ORlGoxEBAQFWxwMCAordXP7AgQP47rvvsHLlSpvfZ+rUqUhPTzf/xMbGPlK5CSGEEGfgdJtyZGRk4OWXX8bKlSvtWlJRqVRCqVSWY8nIo4pLzkNquhHN6tK/EyGE2KrcA7Wvry+kUikSEhKsjickJJi3wivo+vXruHXrFp555hnzMdPm8DKZDJcvX0bdunXLt9CkXIz8OA6GPODbqYGoH6pwdHEIIaRSKPeub4VCgTZt2iAqKsp8TBRFREVFISIiotD5jRo1wtmzZxEdHW3+efbZZ9G9e3dER0cjNDS0vItMykFquhGGPH7/xKVcxxaGEEIqkQrp+p48eTIiIyPRtm1btG/fHosXL0ZWVhZGjhwJgO+VGxISgvnz58PFxQXNmjWz+n2NRgMAhY6TyiNHL5rvx9wzOLAkhBBSuVRIoH7++eeRlJSEGTNmID4+Hq1atcL27dvNCWa3b99++IRvUqmF+Mkx/VUfzFmVgksxekcXhxBCKo0qu9a3VquFp6cn0tPTaXqWkxg9/x6uxfLW9ObPQ+DuKnVwiQghxDHsiVHUjCXljjGG2AQDrt+xdHnPWpmM3ALd4YQQQopGgZqUu4RUIyJn3wNjgCAAUglw8rIOE79IQGJqnqOLRwghTo0CNSl3lwuMSdcKlOOLSf7wdJfgaqwBby1KgN5QJUdfCCGkTFCgJuXucoxlDfYQPxla1HPBsvcDoXaTIDHViKuxlFxGCCHFoUBNyl3BLO8gXymW/XEfn6xKRp0QOQDg2h0K1IQQUhwK1KRciSLD1duWQBziL8epy7m4cFMPD1f+51cwyYwQQog1CtSkXN1JzENWLoNpf5gQPxkah/G1vo1GPjZNLWpCCCkeBWpSrh5c3CTYT45GYXyd79QMPj3rxl2DOWgTQgixRoGalKs6wXI829kdDHxaVoCX1ByoY+4ZoFQAegPDnUSapkUIIUWhQE3KVb1QBbo+5goACPKVQSoVUDNQDpVSQI6OoYY/X8WWur8JIaRoFKhJuYtL5q3lYF8elKUSAQ1r8la1h4ovI3qdAjUhhBSJAnUpbPsvEz9uTYco0rhqSZLT8nDsQg5uxPGs7mA/yx4wjcIU8NVI4aPhgfoaZX4TQkiRKmT3rKqEMYaFa1IBALWD5ejcytXBJXJeh8/lYtHPqdC48+vBgoH61Wc1GD3QC5du6RB1LBvXYvVgjEEQhOJejhBCqiVqUdspM8fSiv7ncJYDS+L8zCuS5cfeED+5+TmZlB+sHSyHRADSMkWkpBsruoiEEOL0KFDbKS3DEkyOnM/BfW0eFv+Siv/9looqumNoqV3N39IyO4dPwwrxK9yBo5ALqBFgSiij7m9CCHkQBWo7pWdatmYcM8gLSWlGbN6fiQ17MnE7nqYYmYgiw+14Hnj1eXzXrEAf60D9/ZY0DPngLlwUvHVNCWWEEFIYBWo7qd0keLazO4Y9pcag7h6ITbAE5yPncxxYMueSeN+IXD2DlOeKwc9LCoXcevyZMeB+hmgel6YWNSGEFEaB2k41A+WYNMwbowZoAABXCqxjffgcBWqTmPzWtJcHj9RFdXvXC+VTtDKyeS8FtagJIaQwCtSPIEcn4vBZS3A+e02HrByxhN+oPmLu8UDt5sJby6Y51AXVzw/Uiam8V+JuUh6yc6n+CCGkIArUdkrLMCI90whRZIi5Z0Bs/tKXSgVgFIETl3IdXELn0LGFCu8M94aX2tSilhc6J8BbCrWbBHlGQOMuAWN83W9CCCEWFKjt9M0f9zHwvbv47d8MuKks1WdqHR6h7m8AQA1/Ofp2codOzzPhg4vo+hYEwVxv3mrTlpfU/U0IIQVRoLaTNj/r29NDYjU+nZjKp20dOZ9DK5YVcDeJ9zgUNUYNAPVDeUtbKjUllFGgJoSQgihQ2yktP1Br3KXmQC2V8CxnhRxI1YrVPns5I1vElgOZOHYhB9osXl9FjVEDQNM6SrSsr0TdGrxlXd3rjhBCHkRLiNopLZO3nD3dJbiaH6ib1VXi9FUdPFylSEk34si5HDTI33SiOroaq8ein1Ph78XHp73UEqhcir4m7NTSFZ1auuJuogHbD2XhZhzfm9rUwiaEkOqOWtR2MnV9q10luBLLA/WAru4AgPtaHsSdaZrWldt6XLipq9D3NC10ovHgf15FJZI9KMhXBqVcgN7AzLttEUIIoUBtl1y9iNz85KhsnYjsXAaFXMDjLV3RvJ4SLeorAQCXYvRWS406Sq5exNtfJmD8wgT8uTejwt7XNDXLRWEK1A/vuMnWMQT78Rb4rXvU/U0IISYUqO2QlsFb0zKppdVYr4YcUqmAhRP8sWhSAOrWkIMx4OgFx0/TuhyjR46OX1h89et9/LwjvULe1xSoGfIzvosZnzb5cWs6nn3nDoz51zYUqAkhxIICtR3kMgH9u7qjd4S7ecOJ+vlj0ablMTs0VQFw/HKiG/dkmC8WPPO3mfy/P9OxYlNauW8eEpNg2oyj+KlZBQV685a0Po+fH0OBmhBCzCiZzA4+nlJMfN4bADD5ywQAKJQ01qAWf3zwdA6u39Gbs5kr0vkbOiz57T5MWzv37eQGD1cpvt2YhnX/aGHIYxg3xKtc3lubZcR9Le95uJfMA25YUMlj1KalRE2/Ry1qQgixoBZ1KYgiMyeSNQi1BOKMbBGfrEoGAOgNDDNXJiMzu+KXxJRJgRb1lDA1nNdH8cVZ3h7mBUEA/tiVUW7B0LSDmI+nFNk63tPwsEBdK1AOhVyAzsALHJvAM78JIYRQoLZLRraI9EwjYhMN5kSygkHIw1WCDs1417dKKSAuKQ8LfkypsAVQLtzUYd7qZFyO0eO9ET4AAAGAIQ9Y9HMqTl/VoUMzFwDA71HacilD3RA5Fk3yR892rgCAOiHyh061kkoF1Anh9SiX8vLepcxvQggBQIHaLr/t1GLge3exdH0aAB6UHgxC/bt4AAB0egapBPjvTA7W7SyfoPigyzF6/HssG8cu5OLCDT4lq2EtOUYP1EAiAXYdz0Z8Cs/Y2nk0C6npZZ+ZrnKRoFUDF3O3e/1Q27r+Tee5u/I/yVtx1P1NCCEABWq7mBY7ydHx7mzTeHRBrRsq8VS4Gwo2oldtTsfJCtiswzT/ONhPhvP5c6eb1nXBC0+q8dXkAAR4S/HGQA2a1lHAkAdsLMcpW+ZkOzsDtSnAm7bJJISQ6o4CtR1My4em50/TKmr1MUEQMOUlbzzeUgWjyJcXFRkwbVkS9p7MLtfy3TMFal+ZuUXdJIyXsWkdJX6YGYz2TVUY2lMNANi8L9N80VFWftqWjm3/ZeJyDH9/W1doa1ZXiac7uqFFPd41TwllhBDCVVigXrp0KcLCwuDi4oLw8HAcPXq02HM3bNiAtm3bQqPRwM3NDa1atcJPP/1UUUUtlmlVsqR0HhAbFNNalEoFfPSqL9o2doFRBPy8pNAZGGb/XzJ+3JpebtOj4vI3wPDRSHE9f7vIJnWU5udNU8g6tlAhwFuKjGwR2w9lldn75+SKWP1XOhauSUVmDoNM+vCMb5OwIDnefckHT4W7AQBiqOubEEIAVFCg/vXXXzF58mTMnDkTJ0+eRMuWLdGrVy8kJiYWeb63tzemTZuGQ4cO4cyZMxg5ciRGjhyJHTt2VERxi2Xq+tblb/BUw7/42W0KuYCP3/DFmEEa/DQrCIOf4GPX329Jx5zvUpCrL9uWLGPM3KLO1YkQRZ55bVpvu6A9J7KRnMY/y+9RWhjLKNntdv78aTcVvyAIC5abLw5sVSs/sMcmUuY3IYQAFRSoFy1ahFGjRmHkyJFo0qQJli9fDldXV6xatarI87t164aBAweicePGqFu3LiZOnIgWLVrgwIEDFVHcYqVnWoKrl1oCpaLk6nNRSDC0pxoKuQTjhnjhneHekEqAPSezMWtlcplmg6dqRegMDBIBiM/fcrNpHQUEoXCgbFhLYR4LvpdixIHoslmcxbRQiVv+BhzF9TgUJ8/IoM0yQiHLz/xOosxvQggp90Ct1+tx4sQJ9OzZ0/KmEgl69uyJQ4cOPfT3GWOIiorC5cuX0aVLl2LP0+l00Gq1Vj9lyWhk5i0bASDA2761YnJyRVy6pcNLfdRQyAUcPZ+LP3aXXTJX0v08SATA31uKy7d4k79JbWWR59bwl2NgNw/z49/+LZulRWPirQNrfTt3ENt5JAtvfppgzqSncWpCCKmAQJ2cnAyj0YiAgACr4wEBAYiPjy/299LT0+Hu7g6FQoG+fftiyZIlePLJJ4s9f/78+fD09DT/hIaGltlnAACDkaF/V3fUrcG7ZgPtDNR/7svE3wezsHFPJiL78mSulZvSzHtaP6pGYUps/zoUX00OMO+WVVygBoCX+3hC7cb/+S/eMuDG3UcvhylTOyP/gsbeFnXD/Cx6vYGWEiWEEBOnzfr28PBAdHQ0jh07hrlz52Ly5MnYs2dPsedPnToV6enp5p/Y2NgyLY+LQoKJz3ujZX2elRzgXXjstySDn/BAvVA5tFkiTl/R4fGWLsgzAp+sSkZObtmMV8ukAgxG4H6GCJm05Ixrd1cJXn3G0/z47wOP3rq/mZ8AlqNnkEhgXsTEVrUC5XBRCDDmVwe1qAkhpAICta+vL6RSKRISEqyOJyQkIDAwsPiCSSSoV68eWrVqhXfeeQdDhgzB/Pnziz1fqVRCrVZb/ZSHhFTevRvgY1+LWi4TMDXSB3IZ31mrWV0X+HtJcScxD1//dr/MymeallU/VPHQRK4+Hd2hUvJzth/ONrdkSyNHJyI+xdL1XStQ/tAx/AdJpYLVvGsK1IQQUgGBWqFQoE2bNoiKijIfE0URUVFRiIiIsPl1RFGETqcrjyLaJDtXRFqGEfH5G03Y2/UNALWDFXi9vwYAsPqvdLzW3xMSAdhxOAu7jz/aNKkvf07F/O+TcegcTwwrOC2rOHKZgC6tXSEAyNEx7DtV+nneLgoB6z4JNi8dauv86Qc1LLCITGyCAXmU+U0IqeYqpOt78uTJWLlyJX744QdcvHgRb775JrKysjBy5EgAwIgRIzB16lTz+fPnz8fOnTtx48YNXLx4EV988QV++uknvPTSSxVR3CLtPJqFQe/fNSdMBfjY1/VtMri7Bx5rqITOwPDHrkwM68WTupZvSHukFu3+6GzsPJqN63fyE8nCbAuUowZoMLwP733YejCz1O8vCAL8vGTIyuWfwdYVyR5kCtSCAOQZLXPDCSGkuqqQbS6ff/55JCUlYcaMGYiPj0erVq2wfft2c4LZ7du3IZFYrhmysrIwduxY3LlzByqVCo0aNcKaNWvw/PPPV0Rxi2SampWXvzy2vVnfJhKJgPcjfTBqbjwSUvPQuaUX/jmcjaQ0Izbvz8CQJ+zvss/OFc2rpt1J4IGtcQmJZAV5q6Xo18kdP2/XIvqqDncSDajhb9/YckFX83cVqx9autdoZGpR51+z3LpnQM3A0peHEEIquwrbj3r8+PEYP358kc89mCT2ySef4JNPPqmAUtkuLcOygYXaTQJXl9J3RvhpZJg92hc1/OXw8ZRiRF9PfLE2FWu3a/F0R3e7X9u00ImbSkBWDoOHq8SuZDd/bxnaNlbi6AUdth7MxOiB9u9V/ePWdGRki0hOM0IQgHql3Ic72E+G0QM0OHEpFycu5eLWPQO6tC7VSxFCSJXgtFnfzia9wBxqfzszvovSsr4LfDz56/Tu4IYa/jKkZ4r4Y5f92demhUE88neeqltDXuRCJ8W5l5yHm3H8NbYfyizVuPBf+zPNZQ/1l0FVygsZQRDwwlNqtGmcv+Y3LSVKCKnmKFDbKL1Ai7q03d7FOXgmB6H5y5H+9q8W6Zn2bT9p2jVLlr9QiL3jw/5eUujzeHBOy2T474x9K5Vps4xIKbBlpr0LnRTFtEb4pRhdmS+3SgghlQkFahulZZZ+VbKS3Ek0YNbKZBw+n4sa/jwZa90/9q2qZur61uUno9W1s9tZKhXQpZWr+fHfdiaVmaZRKeWlu1B4UE6uiPtaI+QyID7FiPeXJCEzh4I1IaR6okBto4LrfAeWMuO7KDX85ejZzhWMWVrEG/dmIjnN9mznnFwREsHS6q9Xw/7kq65tLIH62IVc3E2yvcvZtNCJmL8rWMMi9um2R2auiIVrUpFnBFxdgLPXdZi8OMEqT4AQQqoLCtQ2eqKtKzzyl9ws667v1/troJQLPMM5QAa9gWH1X7avv/3hSF9891Eg9HmAXIZSZUm3rK+El4flz+Gv/ba3qk3jyIY8QCKUfg61iZ9GBh9PKRgDxg3xhsZdgmuxBkxalICk+zRdixBSvVCgttGbg70gy29Il3Wg9veW4YWn+LQsUxfv9sNZuHTL9gVeTPO7awcrzC1ze0glfPETk+2HsqCzcWz4ZoGEr7BgOVTKR/+zMrXKM3NELH4nAP5eUtxOyMO7XydSNzghpFqhQG0jnV7EfS0PEGXZ9W3y/JMe8NNIkaoVUa+GHIwB/1t/3+atMK/lL3RSmm5vk66P8UAtCIA2S8TuE7atVGYaIweAxjYutPIwpkB9OUaPmgFyfPVOAPw0UsQm5OGTVclltoc2IYQ4OwrUNtDpRVzND4QqpWCeBlWWXBQSjBqgAQDEJubBRQFcuKnHv0dLXlr07LVcTPwiwbwEqb2JZAU1r6dE/67ueLI9D9h/7rOt+/vnT4LROD+wNg6zbaGVhzEtfLL7RDZen3sPaRlGzBnjB2X+FqH/tymtTN6HEEKcHQVqG5y4lIu3Pk8EwLu97ZmjbI8e7VzRq4MbPh7tixFPawAAKzalIauErt5b9ww4e12HxPs80epRMq6lEgETn/fGmEFekMt4a9bW7vdb+VtcNq5dNi3q5vWUaFhTAcaAG3cN0HhI0aCmAu+97A0A+PXfDPxz5NHWRyeEkMqAArUNyivj+0GCIOD9ET5o10SFQd09EOInQ6pWxJptxSeWmdbCNuT3Ptu7tWRRNB5Sczf4ZhuSym7HG5CjY1AphTJb7tNFIcGyDwKxfn4I5ozxhb8Xr/dubVwxqLs7AOCLtSm4eNNxG7UQQkhFoEBtg/RymkNdEoVcwMBufMOO33dlFLvlY1yB8eEQP9kjLW1qcjVWD1Ofwa7j2SUuwPLD3+lY+FMqAKBhTQWkkrLtbfDxlKJTC1cIgoDE1Dy881Ui/juTg4hmLjDkATNWJNs1lY0QQiobCtQ2SMssv1XJisMYM3ftGkVgyteFpyalZxpx4abe/LjeIy40YvJ7lBY7j2bD010CvYFh26Hiu5iPnM/BpRhehkY2bgRSWmp3CWIT8hCfYkSzukqEBcmRkm7EzBXJj7TzGCGEODMK1DaoqK7vggRBwKxRvubNNVLSRUz+MsHcus0zMsz+v2SkpBuhUvJW7KNkfBfUOX+VMjH/Y/+6U4vM7MLj5KLIrFr6jR5xoZOHcVFI8Eo/T16mfzMw9RVveLhKcPGWHl/+kgrGKFgTQqoeCtQ2SCvHdb5LEugjw9fvBMBXw4P13WQj3v0qEVk5Iv45nIXoKzqolAI07qbNOMomULZr4gIXpYCMbBGBPlKkZ4r4cWvhcfKEVCNydZbgWFaJZCXp3cENNQNk0GaJ2HsyB9Nf84FEAHYczsLGPaXfT5sQQpwVBWoblNc637bw85Lhy7f9zcH4+l0Dpn6TiG5tVHilnyfeGe6NhNTSLx1aFKVCgvCmKgCWVvLGPRm4nWA9Tn4zztLt7quRwk9T/nUjlQrmaWw/79BCKhHwxiD++Js/7uPEpdxyLwMhhFQkCtQ2aF6Xj73KpIDGo+KrLMRPji8m+cPNhXdxn7uuxztfJaFfJ3cE+cogMsDLQ2LeNrMsdGnFA/W1OwaEN1XCKALLfr9vdU7BLSjLu9u7oI4tVGiW/2/y8XfJGPKEB54Kd4MoAu8vScTxi/bt/kUIIc6MArUNOrbgQSvQRwZJGWc126p2sAKfT/RHi/pKeLgKuByjx9iF8Yg6xlcPq1tDUabzu8ObqSCXAXcS8/BsFw/IpMCR87k4ep4HQVFk2FVg5bLG5ZxIVpAgCBj/nBfUbhJ4efA1wd8e5gVXFwEiAz5almTXpiKEEOLMKFDbID6FZ1tXdLf3gxrWUmLx2wH45r1A1PCXITHViA27MwCUXbe3iauLBG0bq+DpLoHIYJ4q9s3v95FnZMjOZQjykZmncZXV0qG2alBTgU0La2DV9CBIJAKUCgnmjPEDAOjzgEmLEpCqpd22CCGVHwVqG5jGgAMqKOP7YUL85VjybgBa1LO0YstqalZB777kjd/nh6BTC1e8/LQnNO4S3E7Iw+yVyUhKy8OkYd5g4GuDP+qOWWWhdQMX9Ap3A8Cz5N//X0KJq7oRQkhlQIHaBgmpvEUd6OAWdUGe7lJ8NsEfz3Z2R8OaCrRroirz9/DykEKavxOXu0qCsUO8AAAHz+Tg9bnx+GhZEgAgLEheJgutlIWxz3mZ12K/ficPX/6S6uASEULIo3GOb1cn5yxd3w9SyAVMGuaNZR8ElstGISaMMfy1PwOGPIblHwSgZqAMjAGXb/Os74ru9i6Jh6sEY4dozI93Hc/G/mjbdgEjhBBnRIHaBs7W9V3R9p3KwZe/3MeS9fdx4pIOt+Pz4OEmQedWKvh4StE7wt3RRbTyVLibOVMfABb/klriMqiEEOLMnKuJ6KTaNXbBnUQDgnyrZ3V1bqVCi3pKnLmmw8r87SUHdfNAZF9PxxasGIIg4O0XvXHhhg7ro7SIic/D17/ex/TXfB1dNEIIsRu1qG0waZg3Pp8YUCELejgjiUTAlJe94aIwjVcLGPyEh4NLVbKwIDme7uSOqa/4QiLh+1rvOUld4ISQyocCNbFJiJ8c457zgiAAr/TTwF1VOf50GtRUYEj+RcVX61KtVlMjhJDKQGBVdCcDrVYLT09PpKenQ61WO7o4VYZOL0KpqBxBGuDljZx9D4n3LWPUXVqr8FJvz3KZ0kYIIbawJ0ZVz75cUmqVKUgDvLxPdXDDmm1ayGWAIY8nx+07lYP2TVzQop4SdWooUDdEDl+NtExXdyOEkLJAgZpUeS/19sSB6BzzlpxSCd/j++iFXBy9YNnEw1cjxYCu7ni2swfcy3G6GyGE2IO6vkm1kJCah5+2puPwuRykavlqZYIAtGmkRHKaiNsJBvP+2yqlgH6Pu2Nwdw/4l9Hc+exc0fza1GonhNgToyhQk2pFFBmuxuqx63g2erRzMy99qjcw7D2ZjV93anEjf1cwuQwY2kONF3upobJj5bWktDys+0eLzGwRcpmA63cNuHJbD8b4a2rcpfDzkmJYLzU6tXAtl89JCHFuFKhBgZqUDmMM2/7LxNb/snDhJs8Q9/KQwE0lQZfWKrzcx7PEcfqDp7OxcE0qtFm2rTE+4mk1Rjzt6bBd2QghjkGBGhSoie2u39HjSqwefSLccfGWDh9+k4RgXxkGd/fAd5vTcC/FkjHu6SbBq894ome4G1RK64C95LdUbNyTCQAIC5IhLVNEWoYIicB3H3v1WU+kZ4pIyzBi59Es87mdWqowNdLHadZLJ4SUPwrUoEBNbHPrngGj590DY8CoARp8vyUduXqGBjUVWDDOD64uEqzZmoZ1URnIy7P8nkQA/DQSSKUC5HIJZFIgOc2I9EwRSgWQl8cT1nw8pZjzhi8ahfElTUWRQWdgUCkl2H4oE1/+kgpDHlArUIb+XT3QvK4CSfeNuHHXgIHdPOzqcieEVB4UqEGBmtiGMYaZK5Jx4HSO+Vjbxi6YPcrXKkimZxqx52Q21m7TIjndtnXDm9ZRYNYoP/h48jXib8bpsejnVNTwl+P9ET4AgIu3dJjxbTJSinjN1g2UWPiWHySSsgvWaRlGzFmVjIjmKgx5gv5fEOIoFKhBgZrY7n6GEa/NuYe0TBFPtnfFuy/5QC4resxYFBl++1eL7zanwygC7Zu6YGhPNYxGBplUgFIhQCkX4KIUEOwrs8rwvnhLh/ELE8AY8PU7AWhWVwlDHsO95DzsPZmNM9d0OHs9F3qD5f2CfaUY/5w3wpu5FMoWz84VEZtgwJ3EPPh5SdGinstDP+vS3+/jj10ZAIDf5gXDt5oui0uIozlloF66dCkWLlyI+Ph4tGzZEkuWLEH79u2LPHflypX48ccfce7cOQBAmzZtMG/evGLPLwoFamKPuOQ83IrTI6K5yqbpU+mZRuj0zO7pW5+vTcHWg1moEyJHpxYq/H0wE51buWLiC94AgDwjw+mruVj9V7o5mQ0AagbI0ChMiUAfKS7d0uNqrB73MywJa4LAg3/TOspC72miNzA8P+0u0jP5773UR41Xn9HYVf6KZDQyHD6Xg6Z1lNB4VM+d60jV5XQrk/3666+YPHkyli9fjvDwcCxevBi9evXC5cuX4e/vX+j8PXv2YNiwYejYsSNcXFzw6aef4qmnnsL58+cREhJSEUUm1UywrwzBduyO5uleusAxqr8G+0/l4MZdA27c5U3nE5dyIYoMEokAmVRAm0YqtGrggre/TMS56zoIAnA7IQ+3E/IKvZ6riwAPVwkSUo04cSm3UKDWGxi2/pcJfy8p0jNFc5B+63kvPN2x+O1JGWMOne+tNzDMWZWMg6dzUDNAhpXTgort5SCkqquQFnV4eDjatWuH//3vfwAAURQRGhqKCRMm4IMPPnjo7xuNRnh5eeF///sfRowYUeQ5Op0OOp3O/Fir1SI0NJRa1MTp7DyShU9/SkHzukr07+qBx1uqIJMWDkLJaXkYNS8e6Zkinu3sDl+NFDuPZiE+OQ+GAkPaLgqgRX0XjOqvQd0alvXLz13X4Yu1KYiJ5wHe1UVAdi7D6/098WKv4rcovZtowKJfUjGynwbN6loH/mMXcvD3wUz07eSOdk1Uj1gTRcvRiZjxbTJOXOKrxtUKkuOLif7wVlOrmlQdTtWi1uv1OHHiBKZOnWo+JpFI0LNnTxw6dMim18jOzobBYIC3t3ex58yfPx+zZ89+5PISUt6eDHdDz/auD22x+mpkeH+EDxJS8vBsF3cIgoAhPTzAGKDNErHzSBZ2HM7C3aQ8HD2fi6Pn49GqgRIDu3kg+kouNu3NBGOAp7sEWTkisnP5NXlaphHZuSJcXSQwigyiCDAGbDmQiWe7uGPdTi1OXdYhOS0FKz8MgkLOy5mZI+Lj75KRlcPMa6W/MUiD2sFlt7lJZraIqd8k4vwNPVyUAiYM9ULvDm5Ot5obYwz7o3MQ6CMzL5rjKNosI6Z8nYgcHUPTOko0r6tE83pKhAbIHVouUnbKvUUdFxeHkJAQ/Pfff4iIiDAff++997B3714cOXLkoa8xduxY7NixA+fPn4eLS9EJM9SiJtURYwxnr+uwaU8m9kVnm5dBNekd4YYxgzTIyBKx6OdUnLrC/4/IpECInwz3M0T0aOcKnYFh68EsRDR3wQeRvhj5cRxStSJe7KXG6/015tc7fTUXb3+ZCIkAiIxPU3umszvGPedVZK9ASe5nGCEA5vHn2wkGvPtVIpLTjHBXCVgw3h9Nahc/5u5IsQkGfPhNEu4m5aFLaxVee1ZTpoHxwaGHYxdyEBogR6BP4bbV4l9SsXl/ptWxJrUV+N+UwFK998nLudi0JwORfT2temhKwygyrPtHC1+NFL06FD/UUh05VYv6US1YsADr1q3Dnj17ig3SAKBUKqFUOud/akLKiyAIaFHPBS3quSAu0YBR8+ORo2PwcJXgo1e90a4JX6JU7SbF5xP9ceB0DlZuSsOdxDxzl7hp4RUAOHQ2F0On3oW7Kw8Sv+zQQm8Q0aW1GxrWUqBlfRfs+qYm7iYasGJTGvZH5+DPfZmo4S9D51au2H44C+mZRvTq4F6opWkUGTbvy8TR8zm4dseAlHQjRvbzxMtP8254qYTPRffykOCzCf5WQSIzR8RnP6bgZpwBw55S4+lOj/6lH5tgwM04A+qEyBHsK7NrdbjQADkmDfPGlK8Tse9UDg6czkG/Tu4Y+YxnqfMXTO4kGvD+/5LQt6MbhvVSQxAEfLE2FWmZIr6c5I/GBS5ertzW468D/N9v/HNeSNUacfa6Di3rl+67MDXdiNkrk5GRLeLiLT2WTgl4pPXul/2Rhg27MzCgqzueCnds3kNlVu6B2tfXF1KpFAkJCVbHExISEBhY8hXf559/jgULFuDff/9FixYtyrOYhFR6wf5yvDFQg8Xr7iMjW8SKTelISBXRtrELAn34VLHOrVzRuZUr4pLzcPR8DpZvSIPeYN2ppjMw6NL5MQbg912Z+H1XJpRyAU3qKNCsjhL+3jL0iXBHoI8M66My8N3mdHzzexpMr7RxTyZaNVDi+SfVaFFPiaPnc7BiUxruJVvPF/9xazr+O5ODgd3c0bGlKz4Y4Y12TVXweiDLe8XG++a57p+vTYVMJuCpcDeb6yYzW8TGvRlISM1D7w7uCA2QYcLnCealXjd8GmJu2X+74T4ux+iRrWNo3UCJNwZ5FfmabRq54P+mBeL//kzD4XO52Lw/Exdv6fD1OwGPtB3stv+ycC85D2ev6/CiIEBvYJDJ+O2MFcn49oNAeOfPzf92430wBjzR1hWDunuU+j1Nvv4tFRnZvE5S0o348JskfPVOANxU9n+e9VFabNjNpwK2aVR4eiGxXYUlk7Vv3x5LliwBwJPJatasifHjxxebTPbZZ59h7ty52LFjBzp06GD3e9L0LFIdiSLDtxvT8Oe+TKsA3KCmAnPe8IWfl/W1+fooLZb9kYaaATIsmRIAxoDMHIaElDxcv6PHtxvTYLRt2XIAQKv6Snh7SrH3ZLZdvwcAXmoJ+nfxQL9O7uZABADXYvV4+8t4ZOVanz92iAaDu3uUGAAyc0Rs2J2B9VFaZOVY6sNPI0VSmhFuKgFeHlL8OCvY/NyUrxPNiWwA8OXb/mhZ39KbdzvegEAfmXnsHgBOX8nFrJXJSM8S8VS4G94f4V1iuRhjMOTB6jUAPj3vhWl3kaoVMXu0Lzq34j0i2bkixi1MQMw9A5rWUWDRpADIZQLuJhrwv/X3EdGCX9zUCpIjxFcGqVQAYwxHzuUiRyeie9uHX9TsPZmN2f+XDKkEmD3aF4t+TkW2juGz8f6Fkgptea2Pv0sGY8DogRq88CT/Ds7MEXH2mg5hQXIE2THLwuRqrB7rdmoxqr+myGGAYxdycPRCLkb11xSqW2fjdPOof/31V0RGRuLbb79F+/btsXjxYvz222+4dOkSAgICMGLECISEhGD+/PkAgE8//RQzZszAzz//jE6dOplfx93dHe7utnV5UaAm1Zk2y4gdh7Pw575MxCXlIchXhh9mBhUaRzaKDLuOZaN1Q2WRi58cu5CDn7Zp8XJvNXy9pDhzTYert/VI1RqRkm40bxn6RFtX9H3cHTXzx2kTU/Pwx+4MbDmQiRwd/4pxdxXQJ8INTeu4wN1VAneVBEq5gINnsrFpbyaS03hrWyIBwpuq0DvCDcG+Mkz5OhFpmSLCguVISMkzvx4AeKslGP+cF7q1sQSinFwRp67k4tiFXEQdy0JmfoAOC5KjfqgcUceyIea/RIifFMF+Mni4SuGmkqBeDTn8vGTIzhWxPzoHe09mo1V9JRa9HQCAB9jI2feQnili3lg/NK2jxPkbOqyP0mL/qRwwAHIpENFchfo1ee9D49rKQkFj2R/3sXFPBj4e7YcOzVUwigyJqUacu56L+T+kwstDgl/nhUCWH3Bz9QyXbukxbVkScvUMDWsq4OclxcVb+kKr2smkvGs+2FeKg2dyoXaT4KfZwfB4yB7rxy/mYOFPqegd4YaRz2hw5bYeggDUD7VvnPrcdR3e+SoBhjygf1d3DOrmjoOnc7H3ZBau3DaAAVC7SbB4cgDCguwb139qwm3kGXn9zn3Tr9jnC14cOCunC9QA8L///c+84EmrVq3w9ddfIzw8HADQrVs3hIWF4fvvvwcAhIWFISYmptBrzJw5E7NmzbLp/ShQE8Jb2Jdi9PD3klbIKmSGPGY13zlHxzcmOXA6GwO7eRSbcJZnZNh3KhsbdmdYLfRiUj9Uji8mBUAiAP+dycHyDffNFwkNavLgKgC4rzXi4i29ORADfB31EU97outjrhAEYOxnCbgco4cAoKgvv5oBMowf6oWaAXK8PCsOhjzgxV5qXI3VIy3DiKuxBsikwGvParA/OrvI8hakkAtoXleJ1g2V6B3hDrWbxNxqdlMJmPemH7785T5u3bMsSeeiALw8pMjKZcjKEUvsnZBKgHr54/kx8Qbk6gt/qifDXTE10tfqGGMM2iwRcUn84se0Up5cJhTZGv1zbwbUbhJ0ecwV0mLG84+cz8En3yUjK5ehQzMXhAbI8MfuTKskR5kUyDPyXo0F4/1snjVw8aYO4xbyIdTpr/oU2Uvw49Z0fL8lHe2buGDB+MJrdDgTpwzUFY0CNSEV59Y9A5b/cR8SCTBvrD/uJhkKLaFqq5h7Buw4nImdR7ORkm5ErSA5Fr/tb5WkpTcwTPk6AWevFx0k3VUCurdxRYfmrmjf1MUcWKKOZWHu6hS4KAR8/pY/ktONyMoVkZUjIj1DxN8HM5GWvyjM4y1ViEvOMy9MUxy5DOjZzg2DuntAIRcQc8+A2/EGXL9rwKkrOUjLsHzFuigEDOrugQHdPDB06l0AfFU5xiy3xVHIBfh7SSGKfCW9+qFyjBmkQZPaSvOYuCgyJN434nKMHhv3ZODMNctMGFcl4KqSwkUhQCETkHg/z9zbAADN6irxyRhfqN0KJ8OlZxrx4vQ45OgYAn2k6NBMhQY1FVDIBTDGP1dogBzZuSImLkpAqL8c2ToR8fk7z7Vp5AI/Lym2H8qCUi5A7SYgKU2EAGDFh4E2ZZd/sioZu45no1cHN/Na+Q+6GqvHG/Pj4aIQsGlhDafu/qZADQrUhFSkO4kGRM7mu5B9PNoXn/6UgvZNVJjysjdcSplYZTTy3oDawfIitwDV6UUcPJODrBweWBkDTl3Jxd6TPOlseC81Xn3W0+piIfpKLhb/koqe7d3wUp/Ci75kZov4YWs6Nu7JsGoFqpQ8wP4elQGdgSG8KR+zblBTgf5dPKzG1HlZGP7an4nf/s3A6IEapGr5UMTlGH5h4aYS4O0hRWwiz7xvVkeBFvVd8PMOLRqHKTBpmDf0BgY3lQRuKgHuLhK4KAUIAu8K/2WHFkqFgMEP2Vjlwk0dZnybZO59KIpMyi8SDHl8cZlPx/mZM70ZYzhxKRd7jmfjyIXcIjePKUgiAbzcJUjJfz8/jRQTX/BCxxauYIxh4iK+2l5BAd5SLP8gEGo3CX77NwOtG7oUmjGQnJaHYR/FwSgCyz8ILHLuuiGPQSYFXpgWh6Q0I+aN9UOHZoUX5XH0qnsmFKhBgZqQijZzRRL2R1t2IWtaR4EvJgZUeKvGlCAH8DneNfxl8HCVoHcEz2/JM/JFXkoq1804PdZu14IxoHsbV3RsocLuE9mYuzoFgT5SrJkdXOJ0rvRMI976IgGxCXlwUQj4INIH7q4C1v2TgaT7lqlxUgnfDjXEX4b3XvLGtkNZaNfYxabkL1vFJhgwau496POA4b3VaNvYBXoDg6+Gt3DXR2XAWy2BIAAp6SL8NFLMGeOHK7f1+GN3BmLuWfco8Hpj5s1jBAEI8ZciOU1Ebn7+gCAA/bu447VnNVYZ41du6zHh83hIBAHtm7rg5KVcZOUvxGOqCwAIDZChcRhPTPTTSHEn0YCNezLRvK4Si972x8WbelyO0UGpkODUlVy4uwjYfjgLDWoq4Oclw54T2XjmcTe8/aIPcvUiTlzKxaGzOThyLheZ2SJCA2UIC5RDb2CoGSTHS709S/x7uJ9hxMHTOTgQnY1mdZVFXuTZiwI1KFATUtHO39Bhwud8DNFXI8Xy9wMLtTQrysY9GVjy233z48ZhCix9r3QLgJi8tyQRxy/mYsTTarzST/PQ8zOz+Upuxy/yDHIPVwkyskW88KQH6tZQ4Mw1Hfp2csO0ZXyb0+G91HitwOIyZcl08aJSCvh5TjA83aW4dY8HcKMIzHnDF/VCFXh/SWKhNeVVSgFPtndDqwZKNKilRJCPFIIg4F5yHo6cz8HR8zkIC5Jj1AANktOMiE3Ig69GipqBRSeKpaQboVQIcFdJcPGmDrO/S0Ziqm1bx0b2VePJ9m54aeY9m8738hCQlYtCUxAfpJQD7ZuqENFcBX8vGTJz+HDIfa0Rxy7m4uw1nTnvISxIjlXTg2x6/5JQoAYFakIc4cNvEnH2ug4LJ/ijUZhjFyCKOpaF7YeyoHaToG6IHC/2Ln0ryJDH8N6SRJy+qsOaj4Nt3sDFaGRY9sd9bMhfVMbfW4pVHwVZdeUfiM7Ghj0ZeOdFb4T4l8+yn6LIMPf7FPQKd0P7piowxvDO4kREX9VZZVCnZxoxbVkSLtzUI9BHioHdPNCnozvcSzGP2lamrHZtloi0DCN++UeLfadyIABo38QFuQaG01ct3eUuCsGcMOemEjC4uwf+PZaNuKQ8qN0E5Oj41LeCAryliGjOA3GAjww37uix+Jf70GbbPoewQU0FurRS4fHWrubZDY+CAjUoUBPiCKLIkGcsuVu5MsrMEfHW5wloUluBd18qOpGpJNv+y8S2Q1kYPaDwRidAxY+b7jyShfk/pEApF7B6RpDVnGRDHsPNOAPq1pAXm91dnhhj+OLnVGw9mAWZFJj7ph98NVJs2puJnUeykKtnUCl5QH68lQofjfTFgPfuIFfHzOPXZ6/nwstdihw9g0ImoGagdWLjD3+n44e/0+Gt5r0chjygR1sV7iQZkatncFfxJLmrsXoE+sgw702/Mr+IqlJLiBJCKg+JRMAjLMrltNxVkkfq7uzT0R19SthWtCKDdEa2iPk/pAAAXu6jLrRwiFwmOHSjEUEQ8PYwb2TnMOyPzsb6qAzMeN0Xbw/zxqj+Gty6ZzAnpp28lIsTl3KRq2Pw8ZSiXg0eTJvXLX65aYDvJOeiEDD+OS9citHj74OZaNdEhWn565HfTTRg3EI+F7xFPWW59XTYigI1IYRUIxdv6uCi4FO9nuvpnL2NUomAqa/4IHu5iBw9Q3xyHuqFKuDuKkGzukqIIoOXWoL7WhErNvJchPBmLkUm+Jn2ei/ouR5q9GjrBi+1BG2bqDDsKbV5+l96phFTv0mCNkuEl1qCsUMsS8gajQxSOzefKQtV8NqXEEJIcfiUMnfMHu1ntTiNs5HLBHz8hh+GPalGjQDrNqVEIqBDUz71ypRBH/HAVKzN+zIw8uM4bP0vy3xMLLASjrcnT4pzV0nMQVpvYJjxbTLuJOYhwFuKlVODoFLyMJmTK2LCFwmIT3lgALwCUIuaEEKqEY2HtNiNRpyNQi6gQ/PCc6EBoENzFbYd4kG4VQMlHmtk3d2dniUiJj4PB09nw89Lip1HsnD9rgGTnvdCywaFu8YZY3jriwRcua3nK8aN9bOatfDPkSx0aeVa5Brj5Y2SyQghhFQ6OToRN+4a0ChMUWTS2/U7eoyaF1/oeMFNTQqKvpKLyYsTIZUAn473LxT4TaGyrPIJKJmMEEJIlaZSStC0TvFTAOuEyFEzQIbbCXnwdJegextXPBnuhka1FEUG25b1lXjvZW/4e8vwWMPCLW5HrmZGLWpCCCFVUlJaHuIS89C0rrLYDWEchVrUhBBCqj0/jQx+FbBrXHmjrG9CCCHEiVGgJoQQQpxY5e8TKIZp6F2r1Tq4JIQQQog1U2yyJU2sygbqjIwMAEBoaKiDS0IIIYQULSMjA56eJW8YU2WzvkVRRFxcHDw8PB45rV6r1SI0NBSxsbGUQW4HqrfSoXorHaq30qF6K71HqTvGGDIyMhAcHAyJpORR6CrbopZIJKhRo0aZvqZaraY/5FKgeisdqrfSoXorHaq30itt3T2sJW1CyWSEEEKIE6NATQghhDgxCtQ2UCqVmDlzJpTK4perI4VRvZUO1VvpUL2VDtVb6VVU3VXZZDJCCCGkKqAWNSGEEOLEKFATQgghTowCNSGEEOLEKFATQgghTowCtQ2WLl2KsLAwuLi4IDw8HEePHnV0kZzK/Pnz0a5dO3h4eMDf3x8DBgzA5cuXrc7Jzc3FuHHj4OPjA3d3dwwePBgJCQkOKrHzWbBgAQRBwKRJk8zHqM6Kd/fuXbz00kvw8fGBSqVC8+bNcfz4cfPzjDHMmDEDQUFBUKlU6NmzJ65everAEjue0WjE9OnTUbt2bahUKtStWxdz5syxWmua6g3Yt28fnnnmGQQHB0MQBGzatMnqeVvqKDU1FcOHD4darYZGo8Frr72GzMzM0heKkRKtW7eOKRQKtmrVKnb+/Hk2atQoptFoWEJCgqOL5jR69erFVq9ezc6dO8eio6PZ008/zWrWrMkyMzPN54wZM4aFhoayqKgodvz4cdahQwfWsWNHB5baeRw9epSFhYWxFi1asIkTJ5qPU50VLTU1ldWqVYu98sor7MiRI+zGjRtsx44d7Nq1a+ZzFixYwDw9PdmmTZvY6dOn2bPPPstq167NcnJyHFhyx5o7dy7z8fFhW7ZsYTdv3mTr169n7u7u7KuvvjKfQ/XG2NatW9m0adPYhg0bGAC2ceNGq+dtqaPevXuzli1bssOHD7P9+/ezevXqsWHDhpW6TBSoH6J9+/Zs3Lhx5sdGo5EFBwez+fPnO7BUzi0xMZEBYHv37mWMMZaWlsbkcjlbv369+ZyLFy8yAOzQoUOOKqZTyMjIYPXr12c7d+5kXbt2NQdqqrPivf/+++zxxx8v9nlRFFlgYCBbuHCh+VhaWhpTKpXsl19+qYgiOqW+ffuyV1991erYoEGD2PDhwxljVG9FeTBQ21JHFy5cYADYsWPHzOds27aNCYLA7t69W6pyUNd3CfR6PU6cOIGePXuaj0kkEvTs2ROHDh1yYMmcW3p6OgDA29sbAHDixAkYDAaremzUqBFq1qxZ7etx3Lhx6Nu3r1XdAFRnJdm8eTPatm2L5557Dv7+/mjdujVWrlxpfv7mzZuIj4+3qjtPT0+Eh4dX67rr2LEjoqKicOXKFQDA6dOnceDAAfTp0wcA1ZstbKmjQ4cOQaPRoG3btuZzevbsCYlEgiNHjpTqfavsphxlITk5GUajEQEBAVbHAwICcOnSJQeVyrmJoohJkyahU6dOaNasGQAgPj4eCoUCGo3G6tyAgADEx8c7oJTOYd26dTh58iSOHTtW6Dmqs+LduHEDy5Ytw+TJk/Hhhx/i2LFjeOutt6BQKBAZGWmun6L+31bnuvvggw+g1WrRqFEjSKVSGI1GzJ07F8OHDwcAqjcb2FJH8fHx8Pf3t3peJpPB29u71PVIgZqUqXHjxuHcuXM4cOCAo4vi1GJjYzFx4kTs3LkTLi4uji5OpSKKItq2bYt58+YBAFq3bo1z585h+fLliIyMdHDpnNdvv/2GtWvX4ueff0bTpk0RHR2NSZMmITg4mOrNyVHXdwl8fX0hlUoLZdomJCQgMDDQQaVyXuPHj8eWLVuwe/duqy1GAwMDodfrkZaWZnV+da7HEydOIDExEY899hhkMhlkMhn27t2Lr7/+GjKZDAEBAVRnxQgKCkKTJk2sjjVu3Bi3b98GAHP90P9ba1OmTMEHH3yAF154Ac2bN8fLL7+Mt99+G/PnzwdA9WYLW+ooMDAQiYmJVs/n5eUhNTW11PVIgboECoUCbdq0QVRUlPmYKIqIiopCRESEA0vmXBhjGD9+PDZu3Ihdu3ahdu3aVs+3adMGcrncqh4vX76M27dvV9t67NGjB86ePYvo6GjzT9u2bTF8+HDzfaqzonXq1KnQ9L8rV66gVq1aAIDatWsjMDDQqu60Wi2OHDlSresuOzsbEon1V75UKoUoigCo3mxhSx1FREQgLS0NJ06cMJ+za9cuiKKI8PDw0r1xqVLQqpF169YxpVLJvv/+e3bhwgU2evRoptFoWHx8vKOL5jTefPNN5unpyfbs2cPu3btn/snOzjafM2bMGFazZk22a9cudvz4cRYREcEiIiIcWGrnUzDrmzGqs+IcPXqUyWQyNnfuXHb16lW2du1a5urqytasWWM+Z8GCBUyj0bA///yTnTlzhvXv37/aTTN6UGRkJAsJCTFPz9qwYQPz9fVl7733nvkcqjc+E+PUqVPs1KlTDABbtGgRO3XqFIuJiWGM2VZHvXv3Zq1bt2ZHjhxhBw4cYPXr16fpWeVtyZIlrGbNmkyhULD27duzw4cPO7pITgVAkT+rV682n5OTk8PGjh3LvLy8mKurKxs4cCC7d++e4wrthB4M1FRnxfvrr79Ys2bNmFKpZI0aNWIrVqywel4URTZ9+nQWEBDAlEol69GjB7t8+bKDSusctFotmzhxIqtZsyZzcXFhderUYdOmTWM6nc58DtUbY7t37y7y+ywyMpIxZlsdpaSksGHDhjF3d3emVqvZyJEjWUZGRqnLRNtcEkIIIU6MxqgJIYQQJ0aBmhBCCHFiFKgJIYQQJ0aBmhBCCHFiFKgJIYQQJ0aBmhBCCHFiFKgJIYQQJ0aBmhBCCHFiFKgJIWVKEARs2rTJ0cUgpMqgQE1IFfLKK69AEIRCP71793Z00QghpUT7URNSxfTu3RurV6+2OqZUKh1UGkLIo6IWNSFVjFKpRGBgoNWPl5cXAN4tvWzZMvTp0wcqlQp16tTB77//bvX7Z8+exRNPPAGVSgUfHx+MHj0amZmZVuesWrUKTZs2hVKpRFBQEMaPH2/1fHJyMgYOHAhXV1fUr18fmzdvNj93//59DB8+HH5+flCpVKhfv36hCwtCiAUFakKqmenTp2Pw4ME4ffo0hg8fjhdeeAEXL14EAGRlZaFXr17w8vLCsWPHsH79evz7779WgXjZsmUYN24cRo8ejbNnz2Lz5s2oV6+e1XvMnj0bQ4cOxZkzZ/D0009j+PDhSE1NNb//hQsXsG3bNly8eBHLli2Dr69vxVUAIZVN6TcDI4Q4m8jISCaVSpmbm5vVz9y5cxljfEvSMWPGWP1OeHg4e/PNNxljjK1YsYJ5eXmxzMxM8/N///03k0gk5j3Yg4OD2bRp04otAwD20UcfmR9nZmYyAGzbtm2MMcaeeeYZNnLkyLL5wIRUAzRGTUgV0717dyxbtszqmLe3t/l+RESE1XMRERGIjo4GAFy8eBEtW7aEm5ub+flOnTpBFEVcvnwZgiAgLi4OPXr0KLEMLVq0MN93c3ODWq1GYmIiAODNN9/E4MGDcfLkSTz11FMYMGAAOnbsWKrPSkh1QIGakCrGzc2tUFd0WVGpVDadJ5fLrR4LggBRFAEAffr0QUxMDLZu3YqdO3eiR48eGDduHD7//PMyLy8hVQGNURNSzRw+fLjQ48aNGwMAGjdujNOnTyMrK8v8/MGDByGRSNCwYUN4eHggLCwMUVFRj1QGPz8/REZGYs2aNVi8eDFWrFjxSK9HSFVGLWpCqhidTof4+HirYzKZzJywtX79erRt2xaPP/441q5di6NHj+K7774DAAwfPhwzZ85EZGQkZs2ahaSkJEyYMAEvv/wyAgICAACzZs3CmDFj4O/vjz59+iAjIwMHDx7EhAkTbCrfjBkz0KZNGzRt2hQ6nQ5btmwxXygQQgqjQE1IFbN9+3YEBQVZHWvYsCEuXboEgGdkr1u3DmPHjkVQUBB++eUXNGnSBADg6uqKHTt2YOLEiWjXrh1cXV0xePBgLFq0yPxakZGRyM3NxZdffol3330Xvr6+GDJkiM3lUygUmDp1Km7dugWVSoXOnTtj3bp1ZfDJCamaBMYYc3QhCCEVQxAEbNy4EQMGDHB0UQghNqIxakIIIcSJUaAmhBBCnBiNURNSjdBIFyGVD7WoCSGEECdGgZoQQghxYhSoCSGEECdGgZoQQghxYhSoCSGEECdGgZoQQghxYhSoCSGEECdGgZoQQghxYhSoCSGEECdGgZoQQghxYhSoCSGEECdGgZoQQghxYhSoCSGEECdGgZoQQghxYhSoCanEjh07ho4dO8LNzQ2CICA6OtrRRSKElDHaj5qQSspgMOC5556Di4sLvvzyS7i6uqJWrVpl+h5xcXFYsWIFBgwYgFatWpXpaxNCbEOBmpBK6vr164iJicHKlSvx+uuvl8t7xMXFYfbs2QgLC6NATYiDUNc3IZVUYmIiAECj0Ti2IKWQm5sLURQdXQxCKgUK1IRUQq+88gq6du0KAHjuuecgCAK6desGALh06RKGDBkCb29vuLi4oG3btti8ebPV76empuLdd99F8+bN4e7uDrVajT59+uD06dPmc/bs2YN27doBAEaOHAlBECAIAr7//nsAQFhYGF555ZVCZevWrZu5LKbXEQQB69atw0cffYSQkBC4urpCq9UCAI4cOYLevXvD09MTrq6u6Nq1Kw4ePFhGNUVI5Udd34RUQm+88QZCQkIwb948vPXWW2jXrh0CAgJw/vx5dOrUCSEhIfjggw/g5uaG3377DQMGDMAff/yBgQMHAgBu3LiBTZs24bnnnkPt2rWRkJCAb7/9Fl27dsWFCxcQHByMxo0b4+OPP8aMGTMwevRodO7cGQDQsWPHUpV5zpw5UCgUePfdd6HT6aBQKLBr1y706dMHbdq0wcyZMyGRSLB69Wo88cQT2L9/P9q3b19mdUZIpcUIIZXS7t27GQC2fv1687EePXqw5s2bs9zcXPMxURRZx44dWf369c3HcnNzmdFotHq9mzdvMqVSyT7++GPzsWPHjjEAbPXq1YXev1atWiwyMrLQ8a5du7KuXbsWKmedOnVYdna2Vbnq16/PevXqxURRNB/Pzs5mtWvXZk8++aRN9UBIVUdd34RUEampqdi1axeGDh2KjIwMJCcnIzk5GSkpKejVqxeuXr2Ku3fvAgCUSiUkEv7f32g0IiUlBe7u7mjYsCFOnjxZLuWLjIyESqUyP46OjsbVq1fx4osvIiUlxVzerKws9OjRA/v27aNxbEJAXd+EVBnXrl0DYwzTp0/H9OnTizwnMTERISEhEEURX331Fb755hvcvHkTRqPRfI6Pj0+5lK927dpWj69evQqAB/DipKenw8vLq1zKQ0hlQYGakCrC1Pp899130atXryLPqVevHgBg3rx5mD59Ol599VXMmTMH3t7ekEgkmDRpks2tWEEQijxuNBohlUoLHS/Ymi5Y3oULFxY79cvd3d2mshBSlVGgJqSKqFOnDgBALpejZ8+eJZ77+++/o3v37vjuu++sjqelpcHX19f8uLhgDABeXl5IS0srdDwmJsZclpLU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StUpbfpWdSO/GA6cMmrUg1sYt0MopZSqtTqpUb/zzju0atUKX19f+vfvz9q1ayvdf+7cuXTs2BFfX1+6devG999/7/L8nXfeiclkcnmMGDGiLkJV9SUtz5gMYXuKsYZuTVYMUkopVUatE/V//vMfHn30UaZMmcLGjRvp0aMHw4cPJyUlpdz9f//9d2655RbuueceNm3axKhRoxg1ahTbt2932W/EiBEcP37c+fjyyy9rG6qqTyGn53DOKTJmMFJKKVUnap2oX3vtNe677z7uuusuOnfuzLvvvou/vz8fffRRufu/+eabjBgxgscff5xOnTrx/PPP06tXL/71r3+57Ge1WomOjnY+wsLCahuqqk+lp/c7keu+OJRSqpGpVaIuLCxkw4YNDBs2rOSAZjPDhg1j1apV5b5m1apVLvsDDB8+vMz+K1asIDIykg4dOvDAAw+QmnrG2rNnKCgoIDMz0+WhGlDpqSrfWuO+OJRSqpGpVaI+efIkNpuNqKgol+1RUVEkJZWzTiiQlJR01v1HjBjBp59+yrJly3j55Zf5+eefGTlyJDZbxU2qM2bMICQkxPmIi4urxTtTtRKgi3EopVRd8chR3zfffLPz/926daN79+60bduWFStWMHRo+csoTp48mUcffdT5fWZmpibrhjaynbH+7q3d3B2JUko1GrVK1E2bNsVisZCcnOyyPTk5mejo6HJfEx0dXa39Adq0aUPTpk35448/KkzUVqsVq7UBFqVXFbu6A1ze1n3rYiulVCNUq6ZvHx8fevfuzbJly5zb7HY7y5YtIz6+/AW34+PjXfYHWLp0aYX7Axw9epTU1FRiYmJqE65qCJqklVKqTtV61Pejjz7K+++/zyeffMKuXbt44IEHyMnJ4a677gLgjjvuYPLkyc79J02axOLFi3n11VfZvXs3U6dOZf369UycOBGA7OxsHn/8cVavXs2hQ4dYtmwZ11xzDe3atWP48OG1DVcppZQ6p9S6+nPTTTdx4sQJnnvuOZKSkrjwwgtZvHixc8DYkSNHMJtLrgcGDBjAF198wd/+9jeefvpp2rdvz/z58+natSsAFouFrVu38sknn5Cenk5sbCxXXHEFzz//vDZtK6WUOu+YRETcHUR9yMzMJCQkhIyMDIKDg90djlJKKeVUnRyli3IopZRSHkwTtVJKKeXBNFErpZRSHkwTtVJK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ZDJhMpmccRQXF/P88887z9OqVSuefvppCgoKypT3n/70J5YsWUKfPn3w8/Mr9+eilKfwcncASjVW27Zt44orriAiIoKpU6dSXFzMlClTiIqKqvR1U6dOZcaMGdx7773069ePzMxM1q9fz8aNG7n88ssBI7ENHjwYb29vxo0bR6tWrdi/fz//+9//mD59usvxbrjhBtq3b8+LL77I2Xq6fv31VxYsWMCECRMAmDFjBn/605944okn+Pe//82DDz7IqVOn+Mc//sHdd9/N8uXLz1oOX3zxBVlZWdx///2YTCb+8Y9/cN1113HgwAFnS8LSpUs5cOAAd911F9HR0ezYsYNZs2axY8cOVq9ejclk4rrrrmPv3r18+eWXvP766zRt2hSAiIgIAO69914++eQTrr/+ev7617+yZs0aZsyYwa5du5g3b55LTHv27OGWW27h/vvv57777qNDhw5nfR9KuY0operFqFGjxNfXVw4fPuzctnPnTrFYLFL6T69ly5YyduxY5/c9evSQq666qtJjX3zxxRIUFORybBERu93u/P+UKVMEkFtuuaXM6x3PlQaI1WqVgwcPOre99957Akh0dLRkZmY6t0+ePFkAl33Hjh0rLVu2dH5/8OBBAaRJkyaSlpbm3P7tt98KIP/73/+c23Jzc8vE+OWXXwogv/zyi3PbP//5zzLnFRHZvHmzAHLvvfe6bH/ssccEkOXLlzu3tWzZUgBZvHhxmXMq5Ym06VupemCz2ViyZAmjRo2iRYsWzu2dOnVi+PDhlb42NDSUHTt2sG/fvnKfP3HiBL/88gt33323y7GBcm+5Gj9+fJXjHjp0qEvzdf/+/QEYPXo0QUFBZbYfOHDgrMe86aabCAsLc34/ePDgMq/18/Nz/j8/P5+TJ09y0UUXAbBx48aznuP7778H4NFHH3XZ/te//hWA7777zmV769atz/pzUMpTaKJWqh6cOHGCvLw82rdvX+a5szWz/v3vfyc9PZ0LLriAbt268fjjj7N161bn844E17Vr1yrF0rp16yrHfWbiDwkJASAuLq7c7adOnar2MR1Ju/Rr09LSmDRpElFRUfj5+REREeGMOyMj46znOHz4MGazmXbt2rlsj46OJjQ0lMOHD7tsr06ZKOVumqiV8jAXX3wx+/fv56OPPqJr16588MEH9OrViw8++KBGxytdWz0bi8VS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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot losses\n", + "colors = [\"orangered\", \"royalblue\", \"hotpink\", \"lime\", \"goldenrod\"]\n", + "plt.figure(figsize=(5, 10))\n", + "ind = 0\n", + "for key, val in losses.items():\n", + " plt.subplot(len(losses.keys()), 1, ind + 1)\n", + " plt.plot(val, color=colors[ind], linestyle=\"-\")\n", + " plt.plot(losses_val[key], color=colors[ind], linestyle=\"--\")\n", + " plt.title(key)\n", + " plt.xlabel(\"Epochs\")\n", + " ind += 1\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c3cf096f", + "metadata": { + "pycharm": { + "name": "#%%" + } + }, + "source": [ + "**Conclusion**: from early on, the network shows the capability of discern between the different semantic layers. To achieve good image quality, more images and training time are needed (to avoid overfitting, seen in some loss plots of previous example), as well as thorough optimisation, such as establishing an adversarial schedule that makes sure that the discriminator and generator and the discriminator are trained only when their performance does not exceed a certain limit.\n" + ] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,py:light" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tutorials/generative/2d_spade_gan/2d_spade_vae.py b/tutorials/generative/2d_spade_gan/2d_spade_vae.py new file mode 100644 index 00000000..ec286f29 --- /dev/null +++ b/tutorials/generative/2d_spade_gan/2d_spade_vae.py @@ -0,0 +1,360 @@ +# --- +# jupyter: +# jupytext: +# formats: ipynb,py:light +# text_representation: +# extension: .py +# format_name: light +# format_version: '1.5' +# jupytext_version: 1.14.4 +# kernelspec: +# display_name: Python 3 (ipykernel) +# language: python +# name: python3 +# --- + +# + +# Copyright (c) MONAI Consortium +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# - + +# # SPADE VAE-GAN + +# This notebook creates a mock SPADE VAE-GAN based on the paper "Semantic Image Synthesis with Spatially-Adaptive Normalization" (2019) by Park T, Liu MY, Wang TC, Zhu JY. More information available at: https://github.com/NVlabs/SPADE + +import os +import tempfile +import matplotlib.pyplot as plt +import numpy as np +import torch +from pathlib import Path +import zipfile +import gdown +from monai.data import DataLoader +from tqdm import tqdm +from generative.losses import PatchAdversarialLoss, PerceptualLoss +from generative.networks.nets import MultiScalePatchDiscriminator +import numpy as np +import monai +from generative.networks.nets.spade_network import SPADE_Net + +directory = os.environ.get("MONAI_DATA_DIRECTORY") +root_dir = tempfile.mkdtemp() if directory is None else directory +root_dir = Path(root_dir) +print("Temporary directory used: %s " % root_dir) + +# INPUT PARAMETERS +input_shape = [128, 128] +batch_size = 6 +num_workers = 4 +num_epochs = 100 +lambda_perc = 1.0 +lambda_feat = 0.1 +lambda_kld = 0.00001 +loss_adv = 1.0 + +# ### Data + +# The data for this notebook comes from the public dataset OASIS (Open Access Series of Imaging Studies) [1]. The images have been registered to MNI space using ANTsPy, and then subsampled to 2mm isotropic resolution. Geodesic Information Flows (GIF) [2] has been used to segment 5 regions: cerebrospinal fluid (CSF), grey matter (GM), white matter (WM), deep grey matter (DGM) and brainstem. In addition, BaMos [3] has been used to provide white matter hyperintensities segmentations (WMH). The available dataset contains: +# - T1-weighted images +# - FLAIR weighted images +# - Segmentations with the following labels: 0 (background), 1 (CSF), 2 (GM), 3 (WM), 4 (DGM), 5 (brainstem) and 6 (WMH). +# +# _**Acknowledgments**: "Data were provided by OASIS-3: Longitudinal Multimodal Neuroimaging: Principal Investigators: T. Benzinger, D. Marcus, J. Morris; NIH P30 AG066444, P50 AG00561, P30 NS09857781, P01 AG026276, P01 AG003991, R01 AG043434, UL1 TR000448, R01 EB009352. AV-45 doses were provided by Avid Radiopharmaceuticals, a wholly owned subsidiary of Eli Lilly.”_ +# +# +# Citations: +# +# [1] Marcus, DS, Wang, TH, Parker, J, Csernansky, JG, Morris, JC, Buckner. Open Access Series of Imaging Studies (OASIS): Cross-Sectional MRI Data in Young, Middle Aged, Nondemented, and Demented Older Adults, RL. Journal of Cognitive Neuroscience, 19, 1498-1507. doi: 10.1162/jocn.2007.19.9.1498 +# +# [2] Cardoso MJ, Modat M, Wolz R, Melbourne A, Cash D, Rueckert D, Ourselin S. Geodesic Information Flows: Spatially-Variant Graphs and Their Application to Segmentation and Fusion. IEEE Trans Med Imaging. 2015 Sep;34(9):1976-88. doi: 10.1109/TMI.2015.2418298. Epub 2015 Apr 14. PMID: 25879909. +# +# [3] Fiford CM, Sudre CH, Pemberton H, Walsh P, Manning E, Malone IB, Nicholas J, Bouvy WH, Carmichael OT, Biessels GJ, Cardoso MJ, Barnes J; Alzheimer’s Disease Neuroimaging Initiative. Automated White Matter Hyperintensity Segmentation Using Bayesian Model Selection: Assessment and Correlations with Cognitive Change. Neuroinformatics. 2020 Jun;18(3):429-449. doi: 10.1007/s12021-019-09439-6. PMID: 32062817; PMCID: PMC7338814. +# + +gdown.download( + "https://drive.google.com/uc?export=download&id=1SX_MCzQe-vyq09QYxECk32wZ2vxp9rx5", str(root_dir / "data.zip") +) + +zip_obj = zipfile.ZipFile(os.path.join(root_dir, "data.zip"), "r") +zip_obj.extractall(root_dir) +images_T1 = root_dir / "OASIS_SMALL-SUBSET/T1" +images_FLAIR = root_dir / "OASIS_SMALL-SUBSET/FLAIR" +labels = root_dir / "OASIS_SMALL-SUBSET/Segmentations" + +# We create the data dictionaries that we need +all_images = [os.path.join(images_T1, i) for i in os.listdir(images_T1)] + [ + os.path.join(images_FLAIR, i) for i in os.listdir(images_FLAIR) +] +np.random.shuffle(all_images) +corresponding_labels = [ + os.path.join(labels, i.split("/")[-1].replace(i.split("/")[-1].split("_")[0], "Parcellation")) for i in all_images +] +input_dict = [{"image": i, "label": corresponding_labels[ind]} for ind, i in enumerate(all_images)] +input_dict_train = input_dict[: int(len(input_dict) * 0.9)] +input_dict_val = input_dict[int(len(input_dict) * 0.9) :] + +# ### Dataloaders + +# + +preliminar_shape = input_shape + [50] # We take random slices fron the center of the brain +crop_shape = input_shape + [1] +base_transforms = [ + monai.transforms.LoadImaged(keys=["label", "image"]), + monai.transforms.EnsureChannelFirstd(keys=["image", "label"]), + monai.transforms.CenterSpatialCropd(keys=["label", "image"], roi_size=preliminar_shape), + monai.transforms.RandSpatialCropd(keys=["label", "image"], roi_size=crop_shape, max_roi_size=crop_shape), + monai.transforms.SqueezeDimd(keys=["label", "image"], dim=-1), + monai.transforms.Resized(keys=["image", "label"], spatial_size=input_shape), +] +last_transforms = [ + monai.transforms.CopyItemsd(keys=["label"], names=["label_channel"]), + monai.transforms.Lambdad(keys=["label_channel"], func=lambda l: l != 0), + monai.transforms.MaskIntensityd(keys=["image"], mask_key="label_channel"), + monai.transforms.NormalizeIntensityd(keys=["image"]), + monai.transforms.ToTensord(keys=["image", "label"]), +] + +aug_transforms = [ + monai.transforms.RandBiasFieldd(coeff_range=(0, 0.005), prob=0.33, keys=["image"]), + monai.transforms.RandAdjustContrastd(gamma=(0.9, 1.15), prob=0.33, keys=["image"]), + monai.transforms.RandGaussianNoised(prob=0.33, mean=0.0, std=np.random.uniform(0.005, 0.015), keys=["image"]), + monai.transforms.RandAffined( + rotate_range=[-0.05, 0.05], + shear_range=[0.001, 0.05], + scale_range=[0, 0.05], + padding_mode="zeros", + mode="nearest", + prob=0.33, + keys=["label", "image"], + ), +] + +train_transforms = monai.transforms.Compose(base_transforms + aug_transforms + last_transforms) +val_transforms = monai.transforms.Compose(base_transforms + last_transforms) + +train_dataset = monai.data.dataset.Dataset(input_dict_train, train_transforms) +val_dataset = monai.data.dataset.Dataset(input_dict_val, val_transforms) +train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size, num_workers=num_workers) +val_loader = DataLoader(val_dataset, shuffle=False, drop_last=False, batch_size=batch_size, num_workers=num_workers) + + +# - + +# Sanity check +batch = next(iter(train_loader)) +print(batch["image"].shape) +plt.subplot(1, 2, 1) +plt.imshow(batch["image"][0, 0, ...], cmap="gist_gray") +plt.axis("off") +plt.subplot(1, 2, 2) +plt.imshow(batch["label"][0, 0, ...], cmap="jet") +plt.axis("off") +plt.show() + +# ### Network creation and losses + +device = "cuda" if torch.cuda.is_available() else "cpu" + + +def one_hot(input_label, label_nc): + # One hot encoding function for the labels + shape_ = list(input_label.shape) + shape_[1] = label_nc + label_out = torch.zeros(shape_) + for channel in range(label_nc): + label_out[:, channel, ...] = input_label[:, 0, ...] == channel + return label_out + + +def picture_results(input_label, input_image, output_image): + f = plt.figure(figsize=(4, 1.5)) + plt.subplot(1, 3, 1) + plt.imshow(torch.argmax(input_label, 1)[0, ...].detach().cpu(), cmap="jet") + plt.axis("off") + plt.title("Label") + plt.subplot(1, 3, 2) + plt.imshow(input_image[0, 0, ...].detach().cpu(), cmap="gist_gray") + plt.axis("off") + plt.title("Input image") + plt.subplot(1, 3, 3) + plt.imshow(output_image[0, 0, ...].detach().cpu(), cmap="gist_gray") + plt.axis("off") + plt.title("Output image") + plt.show() + + +def feature_loss(input_features_disc_fake, input_features_disc_real, lambda_feat, device): + criterion = torch.nn.L1Loss() + num_D = len(input_features_disc_fake) + GAN_Feat_loss = torch.zeros(1).to(device) + for i in range(num_D): # for each discriminator + num_intermediate_outputs = len(input_features_disc_fake[i]) + for j in range(num_intermediate_outputs): # for each layer output + unweighted_loss = criterion(input_features_disc_fake[i][j], input_features_disc_real[i][j].detach()) + GAN_Feat_loss += unweighted_loss * lambda_feat / num_D + return GAN_Feat_loss + + +net = SPADE_Net( + spatial_dims=2, + in_channels=1, + out_channels=1, + label_nc=6, + input_shape=input_shape, + num_channels=[16, 32, 64, 128], + z_dim=16, + is_vae=True, +) + +# + +discriminator = MultiScalePatchDiscriminator( + num_d=2, + num_layers_d=3, + spatial_dims=2, + num_channels=8, + in_channels=7, + out_channels=7, + minimum_size_im=128, + norm="INSTANCE", + kernel_size=3, +) + +adversarial_loss = PatchAdversarialLoss(reduction="sum", criterion="hinge") +# - + +perceptual_loss = PerceptualLoss(spatial_dims=2, network_type="vgg", is_fake_3d=False, pretrained=True) +perceptual_loss = perceptual_loss.to(device) + +optimizer_G = torch.optim.Adam(net.parameters(), lr=0.0002) +optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=0.0004) + +# ### Training loop +# + +net = net.to(device) +discriminator = discriminator.to(device) +torch.autograd.set_detect_anomaly(True) +losses = {"kld": [], "perceptual": [], "feature": [], "generator": [], "discriminator": []} +losses_val = {"kld": [], "perceptual": [], "feature": [], "generator": [], "discriminator": []} +for epoch in range(num_epochs): + print("Epoch %d/%d" % (epoch, num_epochs)) + train_bar = tqdm(enumerate(train_loader), total=len(train_loader), ncols=120) + losses_epoch = {"kld": 0, "perceptual": 0, "feature": 0, "generator": 0, "discriminator": 0} + for step, d in train_bar: + image = d["image"].to(device) + with torch.no_grad(): + label = one_hot(d["label"], 6).to(device) + optimizer_G.zero_grad() + + # Losses gen + out, kld_loss = net(label, image) + disc_fakes, features_fakes = discriminator(torch.cat([out, label], 1)) + loss_g = adversarial_loss(disc_fakes, target_is_real=True, for_discriminator=False) + disc_reals, features_reals = discriminator(torch.cat([image, label], 1)) + loss_feat = feature_loss(features_fakes, features_reals, lambda_feat, device) + loss_perc = perceptual_loss(out, target=image) + total_loss = loss_g + loss_perc * lambda_perc + kld_loss * lambda_kld + loss_feat * lambda_feat + total_loss.backward(retain_graph=True) + optimizer_G.step() + + # Store + losses_epoch["kld"] += kld_loss.item() + losses_epoch["perceptual"] += loss_perc.item() + losses_epoch["generator"] += loss_g.item() + # Train disc + out, _ = net(label, image) + disc_fakes, _ = discriminator(torch.cat([out, label], 1)) + loss_d_r = adversarial_loss(disc_reals, target_is_real=True, for_discriminator=True) + loss_g_f = adversarial_loss(disc_fakes, target_is_real=False, for_discriminator=True) + optimizer_D.zero_grad() + loss_d = loss_d_r + loss_g_f + loss_d.backward() + optimizer_D.step() + + # Store + losses_epoch["feature"] = loss_feat.item() + losses_epoch["discriminator"] = loss_d_r.item() + loss_g_f.item() + + train_bar.set_postfix( + { + "kld": kld_loss.item(), + "perceptual": loss_perc.item(), + "generator": loss_g.item(), + "feature": loss_feat.item(), + "discriminator": loss_d_r.item() + loss_g_f.item(), + } + ) + + val_bar = tqdm(enumerate(val_loader), total=len(val_loader), ncols=120) + losses_epoch_val = {"kld": 0, "perceptual": 0, "feature": 0, "generator": 0, "discriminator": 0} + for step, d in val_bar: + image = d["image"].to(device) + with torch.no_grad(): + label = one_hot(d["label"], 6).to(device) + # Losses gen + out, kld_loss = net(label, image) + disc_fakes, features_fakes = discriminator(torch.cat([out, label], 1)) + loss_g = adversarial_loss(disc_fakes, target_is_real=True, for_discriminator=False) + disc_reals, features_reals = discriminator(torch.cat([image, label], 1)) + loss_feat = feature_loss(features_fakes, features_reals, lambda_feat, device) + loss_perc = perceptual_loss(out, target=image) + total_loss = loss_adv * loss_g + loss_perc * lambda_perc + kld_loss * lambda_kld + loss_feat * lambda_feat + # Store + losses_epoch_val["kld"] += kld_loss.item() + losses_epoch_val["perceptual"] += loss_perc.item() + losses_epoch_val["generator"] += loss_g.item() + # Train disc + out, _ = net(label, image) + disc_fakes, _ = discriminator(torch.cat([out, label], 1)) + loss_d_r = adversarial_loss(disc_reals, target_is_real=True, for_discriminator=True) + loss_g_f = adversarial_loss(disc_fakes, target_is_real=False, for_discriminator=True) + loss_d = loss_adv * (loss_d_r + loss_g_f) + + # Store + losses_epoch_val["feature"] = loss_feat.item() + losses_epoch_val["discriminator"] = loss_d_r.item() + loss_g_f.item() + + val_bar.set_postfix( + { + "kld": kld_loss.item(), + "perceptual": loss_perc.item(), + "generator": loss_g.item(), + "feature": loss_feat.item(), + "discriminator": loss_d_r.item() + loss_g_f.item(), + } + ) + if step == 0 and epoch % 10 == 0: + picture_results(label, image, out) + for key, val in losses_epoch.items(): + losses[key].append(val / len(train_loader)) + for key, val in losses_epoch_val.items(): + losses_val[key].append(val / len(val_loader)) + + +# Plot losses +colors = ["orangered", "royalblue", "hotpink", "lime", "goldenrod"] +plt.figure(figsize=(5, 10)) +ind = 0 +for key, val in losses.items(): + plt.subplot(len(losses.keys()), 1, ind + 1) + plt.plot(val, color=colors[ind], linestyle="-") + plt.plot(losses_val[key], color=colors[ind], linestyle="--") + plt.title(key) + plt.xlabel("Epochs") + ind += 1 +plt.tight_layout() +plt.show() + +# + [markdown] pycharm={"name": "#%%"} +# **Conclusion**: from early on, the network shows the capability of discern between the different semantic layers. To achieve good image quality, more images and training time are needed (to avoid overfitting, seen in some loss plots of previous example), as well as thorough optimisation, such as establishing an adversarial schedule that makes sure that the discriminator and generator and the discriminator are trained only when their performance does not exceed a certain limit. +# +# -