import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20io%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20torch.nn%20as%20nn%0A%20%20%20%20import%20torch.nn.functional%20as%20F%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20AutoEncoder%20%E3%81%8B%E3%82%89%20VAE%20%E3%81%B8%0A%0A%20%20%20%20%E7%94%BB%E5%83%8F%E3%82%92%E5%9C%A7%E7%B8%AE%E3%81%97%E3%81%A6%E5%BE%A9%E5%85%83%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%E3%81%AA%E3%82%89%E9%80%9A%E5%B8%B8%E3%81%AE%20AutoEncoder%EF%BC%88AE%EF%BC%89%E3%81%A7%E5%8D%81%E5%88%86%E3%81%A7%E3%81%99%E3%80%82%E4%B8%80%E6%96%B9%E3%80%81%E6%9C%AA%E7%9F%A5%E3%81%AE%E6%BD%9C%E5%9C%A8%E7%82%B9%E3%81%8B%E3%82%89%0A%20%20%20%20%E6%96%B0%E3%81%97%E3%81%84%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E6%BD%9C%E5%9C%A8%E7%A9%BA%E9%96%93%E3%81%AE%E3%81%A9%E3%81%93%E3%82%92%20decode%20%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%8B%E3%82%82%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%20notebook%20%E3%81%A7%E3%81%AF%E5%90%8C%E3%81%98%E6%9D%A1%E4%BB%B6%E3%81%A7%20AE%20%E3%81%A8%20Variational%20AutoEncoder%EF%BC%88VAE%EF%BC%89%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%97%E3%80%81%0A%20%20%20%20**%E5%86%8D%E6%A7%8B%E6%88%90%E6%80%A7%E8%83%BD%E3%81%A8%E7%94%9F%E6%88%90%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%AF%E5%88%A5%E3%81%AE%E7%9B%AE%E6%A8%99**%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E3%81%8B%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%E3%81%A8%E5%86%8D%E7%8F%BE%E6%80%A7%0A%0A%20%20%20%20%E5%86%92%E9%A0%AD%E3%81%AE%20%60with%20app.setup%60%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%20marimo%E3%80%81Matplotlib%E3%80%81NumPy%E3%80%81pandas%E3%80%81PyTorch%20%E3%82%92%0A%20%20%20%20notebook%20%E5%85%A8%E4%BD%93%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E7%B6%9A%E3%81%8F%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E4%B9%B1%E6%95%B0%20seed%20%E3%82%92%2042%20%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%97%E3%80%81%0A%20%20%20%20CUDA%E3%80%81MPS%E3%80%81CPU%20%E3%81%AE%E9%A0%86%E3%81%A7%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%20device%20%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20seed%20%3D%2042%0A%20%20%20%20np.random.seed(seed)%0A%20%20%20%20torch.manual_seed(seed)%0A%20%20%20%20if%20torch.cuda.is_available()%3A%0A%20%20%20%20%20%20%20%20torch.cuda.manual_seed_all(seed)%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22cuda%22)%0A%20%20%20%20elif%20getattr(torch.backends%2C%20%22mps%22%2C%20None)%20is%20not%20None%20and%20torch.backends.mps.is_available()%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22mps%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22cpu%22)%0A%20%20%20%20print(f%22selected%20device%3A%20%7Bdevice%7D%22)%0A%20%20%20%20pd.DataFrame(%7B%22item%22%3A%20%5B%22torch%22%2C%20%22device%22%2C%20%22seed%22%5D%2C%20%22value%22%3A%20%5Btorch.__version__%2C%20str(device)%2C%20seed%5D%7D)%0A%20%20%20%20return%20(device%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%87%E3%83%BC%E3%82%BF%0A%0A%20%20%20%20torchvision%20%E3%81%AE%20MNIST%20%E3%82%92%20%60%5B0%2C%201%5D%60%20%E3%81%AE%2028%C3%9728%20tensor%20%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82%E6%95%B0%E5%AD%97%E3%81%94%E3%81%A8%E3%81%AE%0A%20%20%20%20%E5%A4%9A%E6%A7%98%E6%80%A7%E3%82%92%E5%8D%81%E5%88%86%E3%81%AB%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%AD%A6%E7%BF%92%E7%94%A860%2C000%E4%BB%B6%E3%81%A8%E8%A9%95%E4%BE%A1%E7%94%A810%2C000%E4%BB%B6%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%97%E3%80%81%0A%20%20%20%20batch%20size%20%E3%81%AF%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C256%E3%80%81512%E3%81%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%AC%A1%E3%81%AE2%E3%82%BB%E3%83%AB%E3%81%A7%20loader%20%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%80%81%E5%85%A5%E5%8A%9B%E4%BE%8B%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20torch.utils.data%20import%20DataLoader%0A%20%20%20%20from%20torchvision%20import%20datasets%2C%20transforms%0A%0A%20%20%20%20transform%20%3D%20transforms.ToTensor()%0A%20%20%20%20train_dataset%20%3D%20datasets.MNIST(%22.%2Fdata%22%2C%20train%3DTrue%2C%20download%3DTrue%2C%20transform%3Dtransform)%0A%20%20%20%20test_dataset%20%3D%20datasets.MNIST(%22.%2Fdata%22%2C%20train%3DFalse%2C%20download%3DTrue%2C%20transform%3Dtransform)%0A%20%20%20%20train_loader%20%3D%20DataLoader(%0A%20%20%20%20%20%20%20%20train_dataset%2C%0A%20%20%20%20%20%20%20%20batch_size%3D256%2C%0A%20%20%20%20%20%20%20%20shuffle%3DTrue%2C%0A%20%20%20%20%20%20%20%20num_workers%3D0%2C%0A%20%20%20%20)%0A%20%20%20%20test_loader%20%3D%20DataLoader(%0A%20%20%20%20%20%20%20%20test_dataset%2C%0A%20%20%20%20%20%20%20%20batch_size%3D512%2C%0A%20%20%20%20%20%20%20%20shuffle%3DFalse%2C%0A%20%20%20%20%20%20%20%20num_workers%3D0%2C%0A%20%20%20%20)%0A%20%20%20%20return%20test_loader%2C%20train_dataset%2C%20train_loader%0A%0A%0A%40app.cell%0Adef%20_(train_dataset)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(2%2C%205%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20for%20_idx%2C%20_axis%20in%20enumerate(_axes.ravel())%3A%0A%20%20%20%20%20%20%20%20_image%2C%20_label%20%3D%20train_dataset%5B_idx%5D%0A%20%20%20%20%20%20%20%20_axis.imshow(_image.squeeze(0)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axis.set_title(f%22label%3D%7B_label%7D%22)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%BE%E3%81%9A%20AutoEncoder%20%E3%82%92%E5%9F%BA%E6%BA%96%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20AE%20%E3%81%AF784%E6%AC%A1%E5%85%83%E3%81%AE%E7%94%BB%E5%83%8F%E3%82%9216%E6%AC%A1%E5%85%83%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%20%24z%24%20%E3%81%B8%E5%9C%A7%E7%B8%AE%E3%81%97%E3%80%81decoder%20%E3%81%A7784%E5%80%8B%E3%81%AE%E7%94%BB%E7%B4%A0logit%E3%81%B8%0A%20%20%20%20%E6%88%BB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%86%8D%E6%A7%8B%E6%88%90%E8%AA%A4%E5%B7%AE%E3%81%A0%E3%81%91%E3%82%92%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%85%A5%E5%8A%9B%E3%82%92%E5%9C%A7%E7%B8%AE%E3%83%BB%E5%BE%A9%E5%85%83%E3%81%99%E3%82%8B%E7%94%A8%E9%80%94%E3%81%AB%E3%81%AF%E9%81%A9%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%9F%E3%81%A0%E3%81%97%E3%80%81%E6%BD%9C%E5%9C%A8%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E5%88%86%E5%B8%83%E3%81%AB%E3%81%AF%E5%88%B6%E7%B4%84%E3%81%8C%E3%81%AA%E3%81%8F%E3%80%81%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%81%AA%E3%81%84%E9%A0%98%E5%9F%9F%E3%82%92decode%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C%E3%81%AF%E4%BF%9D%E8%A8%BC%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20z%3Df_%5Cphi(x)%2C%5Cqquad%20%5Chat%7Bx%7D%3Dg_%5Ctheta(z)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%85%AC%E5%B9%B3%E3%81%AB%E6%AF%94%E3%81%B9%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81AE%20%E3%81%A8%20VAE%20%E3%81%AF%E5%90%8C%E3%81%9816%E6%AC%A1%E5%85%83%E3%80%81%E5%90%8C%E3%81%98256%E2%86%92128%E3%81%AE%E9%9A%A0%E3%82%8C%E5%B1%A4%E3%80%81%E5%90%8C%E3%81%98decoder%E6%A7%8B%E9%80%A0%E3%82%92%0A%20%20%20%20%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82VAE%E3%81%A0%E3%81%91%E3%81%8C%E6%BD%9C%E5%9C%A8%E5%88%86%E5%B8%83%E3%82%92%E8%A1%A8%E3%81%99%E3%81%9F%E3%82%81%E3%81%AE%E5%B9%B3%E5%9D%87%E3%83%BB%E5%AF%BE%E6%95%B0%E5%88%86%E6%95%A3%E3%81%AE2%E3%81%A4%E3%81%AE%E5%87%BA%E5%8A%9Bhead%E3%82%92%E6%8C%81%E3%81%A1%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20class%20AutoEncoder(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20x_dim%3D784%2C%20h_dim1%3D256%2C%20h_dim2%3D128%2C%20z_dim%3D16)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc1%20%3D%20nn.Linear(x_dim%2C%20h_dim1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc2%20%3D%20nn.Linear(h_dim1%2C%20h_dim2)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc_z%20%3D%20nn.Linear(h_dim2%2C%20z_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc3%20%3D%20nn.Linear(z_dim%2C%20h_dim2)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc4%20%3D%20nn.Linear(h_dim2%2C%20h_dim1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc5%20%3D%20nn.Linear(h_dim1%2C%20x_dim)%0A%0A%20%20%20%20%20%20%20%20def%20encode(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc1(x))%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc2(h))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.fc_z(h)%0A%0A%20%20%20%20%20%20%20%20def%20decode(self%2C%20z)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc3(z))%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc4(h))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.fc5(h)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20z%20%3D%20self.encode(x.view(-1%2C%20784))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.decode(z)%2C%20z%0A%0A%20%20%20%20class%20VAE(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20x_dim%3D784%2C%20h_dim1%3D256%2C%20h_dim2%3D128%2C%20z_dim%3D16)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc1%20%3D%20nn.Linear(x_dim%2C%20h_dim1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc2%20%3D%20nn.Linear(h_dim1%2C%20h_dim2)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc_mu%20%3D%20nn.Linear(h_dim2%2C%20z_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc_logvar%20%3D%20nn.Linear(h_dim2%2C%20z_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc3%20%3D%20nn.Linear(z_dim%2C%20h_dim2)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc4%20%3D%20nn.Linear(h_dim2%2C%20h_dim1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.fc5%20%3D%20nn.Linear(h_dim1%2C%20x_dim)%0A%0A%20%20%20%20%20%20%20%20def%20encode(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc1(x))%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc2(h))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.fc_mu(h)%2C%20self.fc_logvar(h)%0A%0A%20%20%20%20%20%20%20%20def%20reparameterize(self%2C%20mu%2C%20logvar)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20std%20%3D%20torch.exp(0.5%20*%20logvar)%0A%20%20%20%20%20%20%20%20%20%20%20%20eps%20%3D%20torch.randn_like(std)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20mu%20%2B%20eps%20*%20std%0A%0A%20%20%20%20%20%20%20%20def%20decode(self%2C%20z)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc3(z))%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.relu(self.fc4(h))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.fc5(h)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20x.view(-1%2C%20784)%0A%20%20%20%20%20%20%20%20%20%20%20%20mu%2C%20logvar%20%3D%20self.encode(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20z%20%3D%20self.reparameterize(mu%2C%20logvar)%0A%20%20%20%20%20%20%20%20%20%20%20%20logits%20%3D%20self.decode(z)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20logits%2C%20mu%2C%20logvar%0A%0A%20%20%20%20return%20AutoEncoder%2C%20VAE%0A%0A%0A%40app.cell%0Adef%20_(AutoEncoder%2C%20VAE%2C%20device)%3A%0A%20%20%20%20ae_model%20%3D%20AutoEncoder().to(device)%0A%20%20%20%20vae_model%20%3D%20VAE().to(device)%0A%20%20%20%20ae_optimizer%20%3D%20torch.optim.Adam(ae_model.parameters()%2C%20lr%3D1e-3)%0A%20%20%20%20vae_optimizer%20%3D%20torch.optim.Adam(vae_model.parameters()%2C%20lr%3D1e-3)%0A%20%20%20%20model_sizes%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22model%22%3A%20%5B%22AE%22%2C%20%22VAE%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22parameters%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sum(parameter.numel()%20for%20parameter%20in%20ae_model.parameters())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sum(parameter.numel()%20for%20parameter%20in%20vae_model.parameters())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20model_sizes%0A%20%20%20%20return%20ae_model%2C%20ae_optimizer%2C%20vae_model%2C%20vae_optimizer%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20VAE%EF%BC%9A%E6%BD%9C%E5%9C%A8%E7%A9%BA%E9%96%93%E3%81%AB%E3%82%82%E5%AD%A6%E7%BF%92%E7%9B%AE%E6%A8%99%E3%82%92%E4%B8%8E%E3%81%88%E3%82%8B%0A%0A%20%20%20%20VAE%20%E3%81%AE%20encoder%20%E3%81%AF%E3%80%81%E7%82%B9%20%24z%24%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E5%B9%B3%E5%9D%87%20%24%5Cmu%24%20%E3%81%A8%E5%AF%BE%E6%95%B0%E5%88%86%E6%95%A3%20%24%5Clog%20%5Csigma%5E2%24%20%E3%82%92%E6%8E%A8%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%A8%99%E6%BA%96%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E3%81%8B%E3%82%89%E5%BE%97%E3%81%9F%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E4%BD%BF%E3%81%86%E5%86%8D%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81sampling%E3%82%92%E5%90%AB%E3%82%80%E5%87%A6%E7%90%86%E3%81%AB%E3%82%82%0A%20%20%20%20backpropagation%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20q_%5Cphi(z%5Cmid%20x)%0A%20%20%20%20%20%20%26%3D%5Cmathcal%7BN%7D%5C!%5Cleft(%5Cmu_%5Cphi(x)%2C%0A%20%20%20%20%20%20%20%20%5Coperatorname%7Bdiag%7D(%5Csigma_%5Cphi%5E2(x))%5Cright)%20%5C%5C%0A%20%20%20%20z%0A%20%20%20%20%20%20%26%3D%5Cmu_%5Cphi(x)%2B%5Csigma_%5Cphi(x)%5Codot%5Cepsilon%2C%0A%20%20%20%20%20%20%20%20%5Cqquad%20%5Cepsilon%5Csim%5Cmathcal%7BN%7D(0%2CI)%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%99%E3%82%8B%20negative%20ELBO%20%E3%81%AF%E3%80%81%E7%94%BB%E7%B4%A0%E3%81%AE%E5%86%8D%E6%A7%8B%E6%88%90%E8%AA%A4%E5%B7%AE%E3%81%A8%E6%BD%9C%E5%9C%A8%E5%88%86%E5%B8%83%E3%82%92%E6%A8%99%E6%BA%96%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%E3%81%B8%E8%BF%91%E3%81%A5%E3%81%91%E3%82%8B%0A%20%20%20%20KL%20divergence%20%E3%81%AE%E5%92%8C%E3%81%A7%E3%81%99%E3%80%82AE%E3%81%AB%E3%81%AF%E5%89%8D%E8%80%85%E3%81%97%E3%81%8B%E3%81%AA%E3%81%8F%E3%80%81VAE%E3%81%AF%E5%BE%8C%E8%80%85%E3%81%A8%E5%86%8D%E6%A7%8B%E6%88%90%E5%93%81%E8%B3%AA%E3%82%92%E4%B8%A1%E7%AB%8B%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20%5Cmathcal%7BL%7D%0A%20%20%20%20%20%20%26%3D%20%5Coperatorname%7BBCE%7D(x%2C%5Chat%7Bx%7D)%20%5C%5C%0A%20%20%20%20%20%20%26%5Cquad%20%2B%20D_%7B%5Cmathrm%7BKL%7D%7D%5C!%5Cleft(q_%5Cphi(z%5Cmid%20x)%5C%2C%5CVert%5C%2C%5Cmathcal%7BN%7D(0%2CI)%5Cright)%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%24%0A%20%20%20%20D_%7B%5Cmathrm%7BKL%7D%7D%0A%20%20%20%20%20%20%3D%20-%5Cfrac%7B1%7D%7B2%7D%5Csum_j%0A%20%20%20%20%20%20%20%20%5Cleft(1%2B%5Clog%5Csigma_j%5E2-%5Cmu_j%5E2-%5Csigma_j%5E2%5Cright)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E4%B8%A1%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%90%8C%E3%81%98mini-batch%E3%80%81Adam%EF%BC%88learning%20rate%20%601e-3%60%EF%BC%89%E3%80%8120%20epoch%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20BCE%E3%81%A8KL%E3%81%AFbatch%E5%86%85%E3%81%A7%E5%8A%A0%E7%AE%97%E3%81%97%E3%80%81%E5%B1%A5%E6%AD%B4%E3%81%A7%E3%81%AFdataset%E4%BB%B6%E6%95%B0%E3%81%A7%E5%89%B2%E3%81%A3%E3%81%9F1%E7%94%BB%E5%83%8F%E3%81%82%E3%81%9F%E3%82%8A%E3%81%AE%E5%80%A4%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%AF%94%E8%BC%83%E3%81%AB%E3%81%AF%E5%90%8C%E3%81%98test%20data%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF%E3%83%A2%E3%83%87%E3%83%AB%E9%81%B8%E6%8A%9E%E3%82%92%E7%9B%AE%E7%9A%84%E3%81%A8%E3%81%97%E3%81%9F%E7%8B%AC%E7%AB%8B%E8%A9%95%E4%BE%A1%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%0A%20%20%20%202%E3%81%A4%E3%81%AE%E5%AD%A6%E7%BF%92%E7%9B%AE%E6%A8%99%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%95%99%E6%9D%90%E4%B8%8A%E3%81%AE%E6%AF%94%E8%BC%83%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20vae_loss_components(logits%2C%20x%2C%20mu%2C%20logvar)%3A%0A%20%20%20%20%20%20%20%20reconstruction%20%3D%20F.binary_cross_entropy_with_logits(logits%2C%20x.view(-1%2C%20784)%2C%20reduction%3D%22sum%22)%0A%20%20%20%20%20%20%20%20kl_divergence%20%3D%20-0.5%20*%20torch.sum(1%20%2B%20logvar%20-%20logvar.exp()%20-%20mu.pow(2))%0A%20%20%20%20%20%20%20%20return%20reconstruction%2C%20kl_divergence%0A%0A%20%20%20%20def%20evaluate_models(ae_model%2C%20vae_model%2C%20device%2C%20loader)%3A%0A%20%20%20%20%20%20%20%20ae_model.eval()%0A%20%20%20%20%20%20%20%20vae_model.eval()%0A%20%20%20%20%20%20%20%20totals%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ae_reconstruction_bce%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22ae_reconstruction_mse%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22vae_test_negative_elbo%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22vae_reconstruction_bce%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22vae_reconstruction_mse%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22vae_kl%22%3A%200.0%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20batch%2C%20_%20in%20loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch%20%3D%20batch.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_logits%2C%20_%20%3D%20ae_model(batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_logits%2C%20mu%2C%20logvar%20%3D%20vae_model(batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_bce%2C%20vae_kl%20%3D%20vae_loss_components(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_logits%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mu%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20logvar%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_deterministic_logits%20%3D%20vae_model.decode(mu)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totals%5B%22ae_reconstruction_bce%22%5D%20%2B%3D%20F.binary_cross_entropy_with_logits(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_logits%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch.view(-1%2C%20784)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reduction%3D%22sum%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totals%5B%22ae_reconstruction_mse%22%5D%20%2B%3D%20F.mse_loss(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.sigmoid(ae_logits)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch.view(-1%2C%20784)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reduction%3D%22sum%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totals%5B%22vae_test_negative_elbo%22%5D%20%2B%3D%20(vae_bce%20%2B%20vae_kl).item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totals%5B%22vae_kl%22%5D%20%2B%3D%20vae_kl.item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totals%5B%22vae_reconstruction_bce%22%5D%20%2B%3D%20F.binary_cross_entropy_with_logits(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_deterministic_logits%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch.view(-1%2C%20784)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reduction%3D%22sum%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).item()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20totals%5B%22vae_reconstruction_mse%22%5D%20%2B%3D%20F.mse_loss(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.sigmoid(vae_deterministic_logits)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20batch.view(-1%2C%20784)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reduction%3D%22sum%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).item()%0A%20%20%20%20%20%20%20%20sample_count%20%3D%20len(loader.dataset)%0A%20%20%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20key%3A%20value%20%2F%20(sample_count%20*%20784)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20key.endswith(%22_mse%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20value%20%2F%20sample_count%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20key%2C%20value%20in%20totals.items()%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20evaluate_models%2C%20vae_loss_components%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ae_model%2C%0A%20%20%20%20ae_optimizer%2C%0A%20%20%20%20device%2C%0A%20%20%20%20evaluate_models%2C%0A%20%20%20%20test_loader%2C%0A%20%20%20%20train_loader%2C%0A%20%20%20%20vae_loss_components%2C%0A%20%20%20%20vae_model%2C%0A%20%20%20%20vae_optimizer%2C%0A)%3A%0A%20%20%20%20history_rows%20%3D%20%5B%5D%0A%20%20%20%20for%20epoch%20in%20range(1%2C%2021)%3A%0A%20%20%20%20%20%20%20%20ae_model.train()%0A%20%20%20%20%20%20%20%20vae_model.train()%0A%20%20%20%20%20%20%20%20ae_train_bce%20%3D%200.0%0A%20%20%20%20%20%20%20%20vae_train_negative_elbo%20%3D%200.0%0A%20%20%20%20%20%20%20%20for%20_batch%2C%20_%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_batch%20%3D%20_batch.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_optimizer.zero_grad()%0A%20%20%20%20%20%20%20%20%20%20%20%20_ae_logits%2C%20_%20%3D%20ae_model(_batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20_ae_loss%20%3D%20F.binary_cross_entropy_with_logits(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_ae_logits%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_batch.view(-1%2C%20784)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20reduction%3D%22sum%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20_ae_loss.backward()%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_optimizer.step()%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_train_bce%20%2B%3D%20_ae_loss.item()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_optimizer.zero_grad()%0A%20%20%20%20%20%20%20%20%20%20%20%20_vae_logits%2C%20_mu%2C%20_logvar%20%3D%20vae_model(_batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20_vae_bce%2C%20_vae_kl%20%3D%20vae_loss_components(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_vae_logits%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_batch%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_mu%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_logvar%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20_vae_loss%20%3D%20_vae_bce%20%2B%20_vae_kl%0A%20%20%20%20%20%20%20%20%20%20%20%20_vae_loss.backward()%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_optimizer.step()%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_train_negative_elbo%20%2B%3D%20_vae_loss.item()%0A%20%20%20%20%20%20%20%20history_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22epoch%22%3A%20epoch%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22ae_train_bce%22%3A%20ae_train_bce%20%2F%20len(train_loader.dataset)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22vae_train_negative_elbo%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_train_negative_elbo%20%2F%20len(train_loader.dataset)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20**evaluate_models(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_model%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_model%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20device%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20test_loader%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20history_frame%20%3D%20pd.DataFrame(history_rows)%0A%20%20%20%20return%20(history_frame%2C)%0A%0A%0A%40app.cell%0Adef%20_(history_frame)%3A%0A%20%20%20%20history_frame.loc%5B%0A%20%20%20%20%20%20%20%20(history_frame%5B%22epoch%22%5D%20%3D%3D%201)%20%7C%20(history_frame%5B%22epoch%22%5D%20%25%205%20%3D%3D%200)%0A%20%20%20%20%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%86%8D%E6%A7%8B%E6%88%90%E6%80%A7%E8%83%BD%E3%81%AE%E6%AF%94%E8%BC%83%0A%0A%20%20%20%20AE%E3%81%AFencode%E3%81%97%E3%81%9F%E7%82%B9%E3%80%81VAE%E3%81%AFsampling%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%8A%A0%E3%81%88%E3%81%AA%E3%81%84%E5%B9%B3%E5%9D%87%20%24%5Cmu%24%20%E3%82%92decode%E3%81%97%E3%81%A6%E6%AF%94%E8%BC%83%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20MSE%E3%81%AF%E5%85%A8%E7%94%BB%E5%83%8F%E3%83%BB%E5%85%A8784%E7%94%BB%E7%B4%A0%E3%81%AE%E5%B9%B3%E5%9D%87%E3%81%A7%E3%80%81%E5%B0%8F%E3%81%95%E3%81%84%E3%81%BB%E3%81%A9%E5%85%A5%E5%8A%9B%E3%82%92%E5%BF%A0%E5%AE%9F%E3%81%AB%E5%BE%A9%E5%85%83%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20VAE%E3%81%AEKL%E9%A0%85%E3%81%AF%E7%94%9F%E6%88%90%E5%8F%AF%E8%83%BD%E3%81%AA%E6%BD%9C%E5%9C%A8%E7%A9%BA%E9%96%93%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E5%88%B6%E7%B4%84%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E5%86%8D%E6%A7%8B%E6%88%90%E6%8C%87%E6%A8%99%E3%81%A0%E3%81%91%E3%81%AA%E3%82%89AE%E3%81%8C%E6%9C%89%E5%88%A9%E3%81%A7%E3%82%82%0A%20%20%20%20VAE%E3%81%AE%E5%A4%B1%E6%95%97%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E5%B1%A5%E6%AD%B4%E3%81%AE%60vae_test_negative_elbo%60%E3%81%AFsampling%E3%81%97%E3%81%9F%20%24z%24%20%E3%81%A7%E8%A8%88%E7%AE%97%E3%81%97%E3%80%81%0A%20%20%20%20%E6%AF%94%E8%BC%83%E8%A1%A8%E3%81%AE%60reconstruction_bce%60%E3%81%AF%E6%B1%BA%E5%AE%9A%E8%AB%96%E7%9A%84%E3%81%AA%60decode(mu)%60%E3%81%A7%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%BE%8C%E8%80%85%E3%81%A8KL%E3%81%AE%E5%92%8C%E3%81%AB%E3%81%AF%0A%20%20%20%20%E4%B8%80%E8%87%B4%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(history_frame)%3A%0A%20%20%20%20_last_epoch%20%3D%20history_frame.iloc%5B-1%5D%0A%20%20%20%20final_quality_metrics%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22model%22%3A%20%5B%22AE%22%2C%20%22VAE%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22reconstruction_bce%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_last_epoch%5B%22ae_reconstruction_bce%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_last_epoch%5B%22vae_reconstruction_bce%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22reconstruction_mse%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_last_epoch%5B%22ae_reconstruction_mse%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_last_epoch%5B%22vae_reconstruction_mse%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22kl_per_sample%22%3A%20%5Bnp.nan%2C%20_last_epoch%5B%22vae_kl%22%5D%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20final_quality_metrics%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(history_frame)%3A%0A%20%20%20%20_fig%2C%20(_loss_ax%2C%20_mse_ax)%20%3D%20plt.subplots(1%2C%202%2C%20figsize%3D(11%2C%204))%0A%20%20%20%20_loss_ax.plot(%0A%20%20%20%20%20%20%20%20history_frame%5B%22epoch%22%5D%2C%0A%20%20%20%20%20%20%20%20history_frame%5B%22ae_reconstruction_bce%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22AE%20reconstruction%20BCE%22%2C%0A%20%20%20%20)%0A%20%20%20%20_loss_ax.plot(%0A%20%20%20%20%20%20%20%20history_frame%5B%22epoch%22%5D%2C%0A%20%20%20%20%20%20%20%20history_frame%5B%22vae_reconstruction_bce%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22VAE%20reconstruction%20BCE%22%2C%0A%20%20%20%20)%0A%20%20%20%20_loss_ax.set_xlabel(%22epoch%22)%0A%20%20%20%20_loss_ax.set_ylabel(%22BCE%20per%20sample%22)%0A%20%20%20%20_loss_ax.set_title(%22Deterministic%20reconstruction%22)%0A%20%20%20%20_loss_ax.legend()%0A%20%20%20%20_mse_ax.plot(%0A%20%20%20%20%20%20%20%20history_frame%5B%22epoch%22%5D%2C%0A%20%20%20%20%20%20%20%20history_frame%5B%22ae_reconstruction_mse%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22AE%22%2C%0A%20%20%20%20)%0A%20%20%20%20_mse_ax.plot(%0A%20%20%20%20%20%20%20%20history_frame%5B%22epoch%22%5D%2C%0A%20%20%20%20%20%20%20%20history_frame%5B%22vae_reconstruction_mse%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22VAE%22%2C%0A%20%20%20%20)%0A%20%20%20%20_mse_ax.set_xlabel(%22epoch%22)%0A%20%20%20%20_mse_ax.set_ylabel(%22MSE%20per%20pixel%22)%0A%20%20%20%20_mse_ax.set_title(%22Reconstruction%20error%22)%0A%20%20%20%20_mse_ax.legend()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%86%8D%E6%A7%8B%E6%88%90%E7%B5%90%E6%9E%9C%0A%0A%20%20%20%20%E8%A9%95%E4%BE%A1%E7%94%A8loader%E3%81%AE%E5%85%88%E9%A0%AD8%E6%9E%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%81%E5%85%A5%E5%8A%9B%E3%80%81AE%E3%80%81VAE%E3%81%AE%E6%B1%BA%E5%AE%9A%E8%AB%96%E7%9A%84%E3%81%AA%E5%86%8D%E6%A7%8B%E6%88%90%E3%82%92%E4%B8%A6%E3%81%B9%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E5%9B%B3%E3%81%AF%E6%97%A2%E7%9F%A5%E7%94%BB%E5%83%8F%E3%82%92%E5%9C%A7%E7%B8%AE%E3%83%BB%E5%BE%A9%E5%85%83%E3%81%99%E3%82%8B%E8%83%BD%E5%8A%9B%E3%81%AE%E6%AF%94%E8%BC%83%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E6%96%B0%E3%81%97%E3%81%84%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E8%83%BD%E5%8A%9B%E3%81%AF%E3%81%BE%E3%81%A0%E6%B8%AC%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ae_model%2C%20device%2C%20test_loader%2C%20vae_model)%3A%0A%20%20%20%20preview_batch%2C%20preview_labels%20%3D%20next(iter(test_loader))%0A%20%20%20%20preview_batch%20%3D%20preview_batch%5B%3A8%5D.to(device)%0A%20%20%20%20preview_labels%20%3D%20preview_labels%5B%3A8%5D%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20preview_ae_latents%20%3D%20ae_model.encode(preview_batch.view(-1%2C%20784))%0A%20%20%20%20%20%20%20%20preview_vae_mu%2C%20_%20%3D%20vae_model.encode(preview_batch.view(-1%2C%20784))%0A%20%20%20%20%20%20%20%20ae_reconstructions%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_model.decode(preview_ae_latents)%0A%20%20%20%20%20%20%20%20).view(-1%2C%201%2C%2028%2C%2028).cpu()%0A%20%20%20%20%20%20%20%20vae_reconstructions%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_model.decode(preview_vae_mu)%0A%20%20%20%20%20%20%20%20).view(-1%2C%201%2C%2028%2C%2028).cpu()%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ae_reconstructions%2C%0A%20%20%20%20%20%20%20%20preview_batch%2C%0A%20%20%20%20%20%20%20%20preview_labels%2C%0A%20%20%20%20%20%20%20%20vae_reconstructions%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(ae_reconstructions%2C%20preview_batch%2C%20preview_labels%2C%20vae_reconstructions)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(3%2C%208%2C%20figsize%3D(12%2C%204.5))%0A%20%20%20%20_originals%20%3D%20preview_batch.cpu()%0A%20%20%20%20for%20_idx%20in%20range(8)%3A%0A%20%20%20%20%20%20%20%20_axes%5B0%2C%20_idx%5D.imshow(_originals%5B_idx%2C%200%5D%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axes%5B0%2C%20_idx%5D.set_title(f%22x%3D%7Bpreview_labels%5B_idx%5D.item()%7D%22)%0A%20%20%20%20%20%20%20%20_axes%5B0%2C%20_idx%5D.axis(%22off%22)%0A%20%20%20%20%20%20%20%20_axes%5B1%2C%20_idx%5D.imshow(ae_reconstructions%5B_idx%2C%200%5D%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axes%5B1%2C%20_idx%5D.axis(%22off%22)%0A%20%20%20%20%20%20%20%20_axes%5B2%2C%20_idx%5D.imshow(vae_reconstructions%5B_idx%2C%200%5D%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axes%5B2%2C%20_idx%5D.axis(%22off%22)%0A%20%20%20%20_fig.text(0.01%2C%200.82%2C%20%22input%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.51%2C%20%22AE%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.20%2C%20%22VAE%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.tight_layout(rect%3D(0.03%2C%200%2C%201%2C%201))%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E6%BD%9C%E5%9C%A8%E5%88%86%E5%B8%83%EF%BC%9AVAE%E3%82%92%E4%BD%BF%E3%81%86%E7%90%86%E7%94%B1%0A%0A%20%20%20%20%E8%A9%95%E4%BE%A1%E7%94%A8%E7%94%BB%E5%83%8F5%2C000%E6%9E%9A%E3%82%92encode%E3%81%97%E3%81%BE%E3%81%99%E3%80%82AE%E3%81%AE%E6%BD%9C%E5%9C%A8%E7%82%B9%E3%81%AB%E3%81%AF%E5%88%86%E5%B8%83%E3%81%AE%E5%88%B6%E7%B4%84%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82VAE%E3%81%A7%E3%81%AF%0A%20%20%20%20%E5%90%84%20%24q_%5Cphi(z%5Cmid%20x)%24%20%E3%82%92%E7%9B%AE%E6%A8%99prior%20%24%5Cmathcal%7BN%7D(0%2CI)%24%20%E3%81%B8%E8%BF%91%E3%81%A5%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E9%9B%86%E7%B4%84%E3%81%97%E3%81%9F%E5%88%86%E5%B8%83%E3%82%82%0A%20%20%20%200%E4%B8%AD%E5%BF%83%E3%83%BB%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE1%E3%81%AB%E8%BF%91%E3%81%84%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82VAE%E3%81%AE%E9%9B%86%E7%B4%84%E5%88%86%E6%95%A3%E3%81%AB%E3%81%AF%E3%80%81%E5%B9%B3%E5%9D%87%20%24%5Cmu%24%20%E3%81%AE%E3%81%B0%E3%82%89%E3%81%A4%E3%81%8D%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AA%E3%81%8F%0A%20%20%20%20%E5%90%84%E7%94%BB%E5%83%8F%E3%81%AE%20%24%5Csigma%5E2%24%20%E3%82%82%E5%90%AB%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ae_model%2C%20device%2C%20test_loader%2C%20vae_model)%3A%0A%20%20%20%20ae_latent_batches%20%3D%20%5B%5D%0A%20%20%20%20latent_images%20%3D%20%5B%5D%0A%20%20%20%20latent_labels%20%3D%20%5B%5D%0A%20%20%20%20vae_logvar_batches%20%3D%20%5B%5D%0A%20%20%20%20vae_mu_batches%20%3D%20%5B%5D%0A%20%20%20%20ae_model.eval()%0A%20%20%20%20vae_model.eval()%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20for%20_batch%2C%20_labels%20in%20test_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_batch%20%3D%20_batch.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20_flat_batch%20%3D%20_batch.view(-1%2C%20784)%0A%20%20%20%20%20%20%20%20%20%20%20%20_ae_latents%20%3D%20ae_model.encode(_flat_batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20_vae_mu%2C%20_vae_logvar%20%3D%20vae_model.encode(_flat_batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_latent_batches.append(_ae_latents.cpu())%0A%20%20%20%20%20%20%20%20%20%20%20%20latent_images.append(_batch.cpu())%0A%20%20%20%20%20%20%20%20%20%20%20%20latent_labels.append(_labels)%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_logvar_batches.append(_vae_logvar.cpu())%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_mu_batches.append(_vae_mu.cpu())%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20sum(item.shape%5B0%5D%20for%20item%20in%20vae_mu_batches)%20%3E%3D%205_000%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20ae_latent_points%20%3D%20torch.cat(ae_latent_batches%2C%20dim%3D0)%5B%3A5_000%5D.numpy()%0A%20%20%20%20latent_images%20%3D%20torch.cat(latent_images%2C%20dim%3D0)%5B%3A5_000%5D%0A%20%20%20%20latent_labels%20%3D%20torch.cat(latent_labels%2C%20dim%3D0)%5B%3A5_000%5D.numpy()%0A%20%20%20%20vae_logvar_points%20%3D%20torch.cat(vae_logvar_batches%2C%20dim%3D0)%5B%3A5_000%5D.numpy()%0A%20%20%20%20vae_latent_points%20%3D%20torch.cat(vae_mu_batches%2C%20dim%3D0)%5B%3A5_000%5D.numpy()%0A%0A%20%20%20%20ae_latent_mean%20%3D%20ae_latent_points.mean(axis%3D0)%0A%20%20%20%20ae_latent_std%20%3D%20ae_latent_points.std(axis%3D0)%0A%20%20%20%20vae_aggregate_mean%20%3D%20vae_latent_points.mean(axis%3D0)%0A%20%20%20%20vae_aggregate_variance%20%3D%20(%0A%20%20%20%20%20%20%20%20np.exp(vae_logvar_points)%20%2B%20np.square(vae_latent_points)%0A%20%20%20%20).mean(axis%3D0)%20-%20np.square(vae_aggregate_mean)%0A%20%20%20%20vae_aggregate_std%20%3D%20np.sqrt(vae_aggregate_variance)%0A%20%20%20%20latent_moment_summary%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22representation%22%3A%20%5B%22AE%20codes%22%2C%20%22VAE%20aggregate%20q(z)%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mean_abs_average%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.abs(ae_latent_mean).mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.abs(vae_aggregate_mean).mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22std_average%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_latent_std.mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_aggregate_std.mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22std_min%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_latent_std.min()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_aggregate_std.min()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22std_max%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_latent_std.max()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_aggregate_std.max()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ae_latent_points%2C%0A%20%20%20%20%20%20%20%20latent_images%2C%0A%20%20%20%20%20%20%20%20latent_labels%2C%0A%20%20%20%20%20%20%20%20latent_moment_summary%2C%0A%20%20%20%20%20%20%20%20vae_latent_points%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(latent_moment_summary)%3A%0A%20%20%20%20latent_moment_summary%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%90%8C%E3%81%98%E6%A8%99%E6%BA%96%E6%AD%A3%E8%A6%8F%E4%B9%B1%E6%95%B0%E3%81%8B%E3%82%89%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%E4%B8%A1decoder%E3%81%B8%E5%90%8C%E3%81%98%20%24z%5Csim%5Cmathcal%7BN%7D(0%2CI)%24%20%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82AE%E3%81%AF%E3%81%93%E3%81%AE%E5%88%86%E5%B8%83%E3%81%8B%E3%82%89%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E7%B5%90%E6%9E%9C%E3%81%8C%E4%B8%8D%E8%87%AA%E7%84%B6%E3%81%A7%E3%82%82%E5%86%8D%E6%A7%8B%E6%88%90%E5%99%A8%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82VAE%E3%81%A7%E3%81%AFKL%E9%A0%85%E3%81%AB%E3%82%88%E3%82%8A%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E6%99%82%E3%81%AE%E6%BD%9C%E5%9C%A8%E5%88%86%E5%B8%83%E3%81%A8%E3%81%93%E3%81%AEprior%E3%82%92%E8%BF%91%E3%81%A5%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%83%A9%E3%83%99%E3%83%AB%E3%82%84%E5%85%A5%E5%8A%9B%E7%94%BB%E5%83%8F%E3%81%AA%E3%81%97%E3%81%A7%E6%95%B0%E5%AD%97%E3%82%89%E3%81%97%E3%81%84%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%8C%E5%86%8D%E6%A7%8B%E6%88%90%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AA%E3%81%8F%E7%94%9F%E6%88%90%E3%82%92%E7%9B%AE%E7%9A%84%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%ABVAE%E3%82%92%E9%81%B8%E3%81%B6%E4%B8%AD%E5%BF%83%E7%9A%84%E3%81%AA%E7%90%86%E7%94%B1%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ae_model%2C%20device%2C%20vae_model)%3A%0A%20%20%20%20prior_generator%20%3D%20torch.Generator().manual_seed(43)%0A%20%20%20%20prior_latents%20%3D%20torch.randn((10%2C%2016)%2C%20generator%3Dprior_generator).to(device)%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20ae_prior_samples%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_model.decode(prior_latents)%0A%20%20%20%20%20%20%20%20).view(-1%2C%201%2C%2028%2C%2028).cpu()%0A%20%20%20%20%20%20%20%20vae_prior_samples%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_model.decode(prior_latents)%0A%20%20%20%20%20%20%20%20).view(-1%2C%201%2C%2028%2C%2028).cpu()%0A%20%20%20%20return%20ae_prior_samples%2C%20vae_prior_samples%0A%0A%0A%40app.cell%0Adef%20_(ae_prior_samples%2C%20vae_prior_samples)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(2%2C%2010%2C%20figsize%3D(14%2C%203.2))%0A%20%20%20%20for%20_index%20in%20range(10)%3A%0A%20%20%20%20%20%20%20%20_axes%5B0%2C%20_index%5D.imshow(%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_prior_samples%5B_index%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22gray%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vmin%3D0.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vmax%3D1.0%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_axes%5B1%2C%20_index%5D.imshow(%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_prior_samples%5B_index%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22gray%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vmin%3D0.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vmax%3D1.0%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20_axes%5B0%2C%20_index%5D.axis(%22off%22)%0A%20%20%20%20%20%20%20%20_axes%5B1%2C%20_index%5D.axis(%22off%22)%0A%20%20%20%20_fig.text(0.01%2C%200.72%2C%20%22AE%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.27%2C%20%22VAE%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.suptitle(%22Decode%20the%20same%20samples%20from%20N(0%2C%20I)%22)%0A%20%20%20%20_fig.tight_layout(rect%3D(0.03%2C%200%2C%201%2C%200.92))%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20VAE%E6%BD%9C%E5%9C%A8%E5%B9%B3%E5%9D%87%E3%81%AESVD%E3%83%BBt-SNE%E5%8F%AF%E8%A6%96%E5%8C%96%0A%0A%20%20%20%20VAE%E3%81%AE%E6%BD%9C%E5%9C%A8%E5%B9%B3%E5%9D%87%20%24%5Cmu%24%20%E3%82%922%E6%AC%A1%E5%85%83%E3%81%AB%E5%B0%84%E5%BD%B1%E3%81%97%E3%80%81%E6%95%B0%E5%AD%97%E3%81%AE%E5%B1%80%E6%89%80%E7%9A%84%E3%81%AA%E3%81%BE%E3%81%A8%E3%81%BE%E3%82%8A%E3%82%92%E8%A3%9C%E5%8A%A9%E7%9A%84%E3%81%AB%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20SVD%E3%81%AF%E5%88%86%E6%95%A3%E3%81%8C%E6%9C%80%E5%A4%A7%E3%81%AE2%E8%BB%B8%E3%82%92%E4%BD%BF%E3%81%86%E7%B7%9A%E5%BD%A2%E6%89%8B%E6%B3%95%E3%80%81t-SNE%E3%81%AF%E8%BF%91%E5%82%8D%E9%96%A2%E4%BF%82%E3%82%92%E5%BC%B7%E8%AA%BF%E3%81%99%E3%82%8B%E9%9D%9E%E7%B7%9A%E5%BD%A2%E6%89%8B%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%A9%E3%81%A1%E3%82%89%E3%82%8216%E6%AC%A1%E5%85%83%E3%81%AEprior%E6%95%B4%E5%90%88%E6%80%A7%E3%82%92%E8%A8%BC%E6%98%8E%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81t-SNE%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E9%96%93%E8%B7%9D%E9%9B%A2%E3%82%84%E9%85%8D%E7%BD%AE%E3%81%AB%E3%82%82%0A%20%20%20%20%E7%9B%B4%E6%8E%A5%E7%9A%84%E3%81%AA%E6%84%8F%E5%91%B3%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E5%BE%8C%E6%AE%B5%E3%81%AE%E8%A3%9C%E9%96%93%E3%81%AF2%E6%AC%A1%E5%85%83%E5%BA%A7%E6%A8%99%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E5%85%83%E3%81%AE16%E6%AC%A1%E5%85%83%E7%A9%BA%E9%96%93%E3%81%A7%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(vae_latent_points)%3A%0A%20%20%20%20from%20sklearn.manifold%20import%20TSNE%0A%0A%20%20%20%20centered_latent_points%20%3D%20(%0A%20%20%20%20%20%20%20%20vae_latent_points%20-%20vae_latent_points.mean(axis%3D0)%0A%20%20%20%20)%0A%20%20%20%20_%2C%20latent_singular_values%2C%20latent_components%20%3D%20np.linalg.svd(%0A%20%20%20%20%20%20%20%20centered_latent_points%2C%0A%20%20%20%20%20%20%20%20full_matrices%3DFalse%2C%0A%20%20%20%20)%0A%20%20%20%20latent_projection%20%3D%20centered_latent_points%20%40%20latent_components%5B%3A2%5D.T%0A%20%20%20%20svd_explained_variance%20%3D%20(%0A%20%20%20%20%20%20%20%20np.square(latent_singular_values%5B%3A2%5D).sum()%0A%20%20%20%20%20%20%20%20%2F%20np.square(latent_singular_values).sum()%0A%20%20%20%20)%0A%20%20%20%20tsne_projection%20%3D%20TSNE(%0A%20%20%20%20%20%20%20%20n_components%3D2%2C%0A%20%20%20%20%20%20%20%20perplexity%3D30%2C%0A%20%20%20%20%20%20%20%20learning_rate%3D%22auto%22%2C%0A%20%20%20%20%20%20%20%20init%3D%22pca%22%2C%0A%20%20%20%20%20%20%20%20random_state%3D42%2C%0A%20%20%20%20).fit_transform(centered_latent_points)%0A%20%20%20%20return%20latent_projection%2C%20svd_explained_variance%2C%20tsne_projection%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20latent_labels%2C%0A%20%20%20%20latent_projection%2C%0A%20%20%20%20svd_explained_variance%2C%0A%20%20%20%20tsne_projection%2C%0A)%3A%0A%20%20%20%20from%20matplotlib.colors%20import%20BoundaryNorm%0A%0A%20%20%20%20_fig%2C%20(_svd_ax%2C%20_tsne_ax)%20%3D%20plt.subplots(%0A%20%20%20%20%20%20%20%201%2C%0A%20%20%20%20%20%20%20%202%2C%0A%20%20%20%20%20%20%20%20figsize%3D(12%2C%205)%2C%0A%20%20%20%20%20%20%20%20layout%3D%22constrained%22%2C%0A%20%20%20%20)%0A%20%20%20%20_color_norm%20%3D%20BoundaryNorm(np.arange(-0.5%2C%2010.5)%2C%20ncolors%3D10)%0A%20%20%20%20_scatter%20%3D%20_svd_ax.scatter(%0A%20%20%20%20%20%20%20%20latent_projection%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20latent_projection%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20c%3Dlatent_labels%2C%0A%20%20%20%20%20%20%20%20cmap%3D%22tab10%22%2C%0A%20%20%20%20%20%20%20%20norm%3D_color_norm%2C%0A%20%20%20%20%20%20%20%20s%3D10%2C%0A%20%20%20%20)%0A%20%20%20%20_svd_ax.set_title(f%22SVD%20(%7Bsvd_explained_variance%3A.1%25%7D%20variance)%22)%0A%20%20%20%20_svd_ax.set_xlabel(%22component%201%22)%0A%20%20%20%20_svd_ax.set_ylabel(%22component%202%22)%0A%20%20%20%20_tsne_ax.scatter(%0A%20%20%20%20%20%20%20%20tsne_projection%5B%3A%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20tsne_projection%5B%3A%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20c%3Dlatent_labels%2C%0A%20%20%20%20%20%20%20%20cmap%3D%22tab10%22%2C%0A%20%20%20%20%20%20%20%20norm%3D_color_norm%2C%0A%20%20%20%20%20%20%20%20s%3D10%2C%0A%20%20%20%20)%0A%20%20%20%20_tsne_ax.set_title(%22t-SNE%22)%0A%20%20%20%20_tsne_ax.set_xlabel(%22dimension%201%22)%0A%20%20%20%20_tsne_ax.set_ylabel(%22dimension%202%22)%0A%20%20%20%20_fig.colorbar(%0A%20%20%20%20%20%20%20%20_scatter%2C%0A%20%20%20%20%20%20%20%20ax%3D%5B_svd_ax%2C%20_tsne_ax%5D%2C%0A%20%20%20%20%20%20%20%20ticks%3Drange(10)%2C%0A%20%20%20%20%20%20%20%20shrink%3D0.9%2C%0A%20%20%20%20%20%20%20%20pad%3D0.02%2C%0A%20%20%20%20)%0A%20%20%20%20_fig.suptitle(%22VAE%20latent%20mean%20vectors%22)%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20checkpoint%20%E3%81%AE%20round-trip%0A%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%20%60state_dict%60%20%E3%82%92%E3%83%A1%E3%83%A2%E3%83%AA%E4%B8%8A%E3%81%AE%20buffer%20%E3%81%B8%E4%BF%9D%E5%AD%98%E3%81%97%E3%80%81%E6%96%B0%E3%81%97%E3%81%84%20%60VAE%60%20instance%20%E3%81%B8%E8%AA%AD%E3%81%BF%E6%88%BB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%85%A8%20parameter%20%E3%81%AE%E6%9C%80%E5%A4%A7%E7%B5%B6%E5%AF%BE%E5%B7%AE%E3%81%A8%E3%80%81%E5%90%8C%E3%81%98%E6%BD%9C%E5%9C%A8%E5%B9%B3%E5%9D%87%E3%81%8B%E3%82%89%E5%BE%97%E3%81%9F%E5%86%8D%E6%A7%8B%E6%88%90%20logit%20%E3%81%AE%E6%9C%80%E5%A4%A7%E7%B5%B6%E5%AF%BE%E5%B7%AE%E3%82%92%E6%B8%AC%E3%82%8A%E3%80%81%0A%20%20%20%20%E4%BF%9D%E5%AD%98%E5%89%8D%E5%BE%8C%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E5%90%8C%E3%81%98%E8%A8%88%E7%AE%97%E7%B5%90%E6%9E%9C%E3%82%92%E8%BF%94%E3%81%99%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(VAE%2C%20device%2C%20preview_batch%2C%20vae_model)%3A%0A%20%20%20%20buffer%20%3D%20io.BytesIO()%0A%20%20%20%20torch.save(vae_model.state_dict()%2C%20buffer)%0A%20%20%20%20buffer.seek(0)%0A%20%20%20%20reloaded_vae_model%20%3D%20VAE().to(device)%0A%20%20%20%20reloaded_vae_model.load_state_dict(torch.load(buffer%2C%20map_location%3Ddevice))%0A%20%20%20%20reloaded_vae_model.eval()%0A%20%20%20%20vae_model.eval()%0A%20%20%20%20max_param_diff%20%3D%20max(%0A%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_model.state_dict()%5Bname%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20reloaded_vae_model.state_dict()%5Bname%5D%0A%20%20%20%20%20%20%20%20).abs().max().item()%0A%20%20%20%20%20%20%20%20for%20name%20in%20vae_model.state_dict()%0A%20%20%20%20)%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20original_mu%2C%20_%20%3D%20vae_model.encode(preview_batch.view(-1%2C%20784))%0A%20%20%20%20%20%20%20%20reloaded_mu%2C%20_%20%3D%20reloaded_vae_model.encode(preview_batch.view(-1%2C%20784))%0A%20%20%20%20%20%20%20%20original_logits%20%3D%20vae_model.decode(original_mu)%0A%20%20%20%20%20%20%20%20reloaded_logits%20%3D%20reloaded_vae_model.decode(reloaded_mu)%0A%20%20%20%20roundtrip_metrics%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22metric%22%3A%20%5B%22max_param_diff%22%2C%20%22deterministic_recon_max_abs_diff%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_param_diff%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(original_logits%20-%20reloaded_logits).abs().max().item()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%20(roundtrip_metrics%2C)%0A%0A%0A%40app.cell%0Adef%20_(roundtrip_metrics)%3A%0A%20%20%20%20roundtrip_metrics%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%82%AF%E3%83%A9%E3%82%B9%E9%87%8D%E5%BF%83%E3%81%A816%E6%AC%A1%E5%85%83%E7%A9%BA%E9%96%93%E3%81%A7%E3%81%AE%E8%A3%9C%E9%96%93%0A%0A%20%20%20%20AE%E3%81%AE%E6%BD%9C%E5%9C%A8%E7%82%B9%E3%81%A8VAE%E3%81%AE%E6%BD%9C%E5%9C%A8%E5%B9%B3%E5%9D%87%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%81%E6%95%B0%E5%AD%97%E3%81%94%E3%81%A8%E3%81%AE%E9%87%8D%E5%BF%83%E3%82%92%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E6%B1%82%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%E4%B8%8A%E6%AE%B5%E3%81%AFVAE%E9%87%8D%E5%BF%83%E3%81%AB%0A%20%20%20%20%E6%9C%80%E3%82%82%E8%BF%91%E3%81%84%E5%85%A5%E5%8A%9B%E4%BE%8B%E3%80%81%E7%B6%9A%E3%81%8F2%E6%AE%B5%E3%81%AF%E5%90%84%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E8%87%AA%E8%BA%AB%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E9%87%8D%E5%BF%83%E3%82%92decode%E3%81%97%E3%81%9F%E7%B5%90%E6%9E%9C%E3%81%A7%E3%81%99%E3%80%82%E6%9C%80%E5%BE%8C%E3%81%AE2%E6%AE%B5%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E5%85%83%E3%81%AE16%E6%AC%A1%E5%85%83%E7%A9%BA%E9%96%93%E3%81%A7%E6%95%B0%E5%AD%971%E3%81%8B%E3%82%897%E3%81%AE%E9%87%8D%E5%BF%83%E3%81%BE%E3%81%A7%E3%82%92%E7%9B%B4%E7%B7%9A%E8%A3%9C%E9%96%93%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20z(t)%3D(1-t)z_1%2Bt%20z_7%2C%5Cqquad%200%5Cleq%20t%5Cleq%201%0A%20%20%20%20%24%24%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ae_latent_points%2C%0A%20%20%20%20ae_model%2C%0A%20%20%20%20latent_images%2C%0A%20%20%20%20latent_labels%2C%0A%20%20%20%20vae_latent_points%2C%0A%20%20%20%20vae_model%2C%0A)%3A%0A%20%20%20%20ae_class_centroids%20%3D%20np.stack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_latent_points%5Blatent_labels%20%3D%3D%20digit%5D.mean(axis%3D0)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20digit%20in%20range(10)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20vae_class_centroids%20%3D%20np.stack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_latent_points%5Blatent_labels%20%3D%3D%20digit%5D.mean(axis%3D0)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20digit%20in%20range(10)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20representative_indices%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20np.flatnonzero(latent_labels%20%3D%3D%20digit)%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.linalg.norm(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_latent_points%5Blatent_labels%20%3D%3D%20digit%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-%20vae_class_centroids%5Bdigit%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axis%3D1%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).argmin()%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20digit%20in%20range(10)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20representative_inputs%20%3D%20latent_images%5Brepresentative_indices%5D%0A%20%20%20%20interpolation_weights%20%3D%20np.linspace(0.0%2C%201.0%2C%2010)%0A%20%20%20%20ae_interpolation_latents%20%3D%20np.stack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(1.0%20-%20weight)%20*%20ae_class_centroids%5B1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20weight%20*%20ae_class_centroids%5B7%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20weight%20in%20interpolation_weights%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20vae_interpolation_latents%20%3D%20np.stack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20(1.0%20-%20weight)%20*%20vae_class_centroids%5B1%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2B%20weight%20*%20vae_class_centroids%5B7%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20weight%20in%20interpolation_weights%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20model_device%20%3D%20next(vae_model.parameters()).device%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20ae_class_prototypes%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_model.decode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.tensor(ae_class_centroids%2C%20dtype%3Dtorch.float32%2C%20device%3Dmodel_device)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20).cpu()%0A%20%20%20%20%20%20%20%20vae_class_prototypes%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_model.decode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.tensor(vae_class_centroids%2C%20dtype%3Dtorch.float32%2C%20device%3Dmodel_device)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20).cpu()%0A%20%20%20%20%20%20%20%20ae_interpolation_images%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20ae_model.decode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.tensor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ae_interpolation_latents%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dtype%3Dtorch.float32%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20device%3Dmodel_device%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20).cpu()%0A%20%20%20%20%20%20%20%20vae_interpolation_images%20%3D%20torch.sigmoid(%0A%20%20%20%20%20%20%20%20%20%20%20%20vae_model.decode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.tensor(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vae_interpolation_latents%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dtype%3Dtorch.float32%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20device%3Dmodel_device%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20).cpu()%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20ae_class_prototypes%2C%0A%20%20%20%20%20%20%20%20ae_interpolation_images%2C%0A%20%20%20%20%20%20%20%20interpolation_weights%2C%0A%20%20%20%20%20%20%20%20representative_inputs%2C%0A%20%20%20%20%20%20%20%20vae_class_prototypes%2C%0A%20%20%20%20%20%20%20%20vae_interpolation_images%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20ae_class_prototypes%2C%0A%20%20%20%20ae_interpolation_images%2C%0A%20%20%20%20interpolation_weights%2C%0A%20%20%20%20representative_inputs%2C%0A%20%20%20%20vae_class_prototypes%2C%0A%20%20%20%20vae_interpolation_images%2C%0A)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(5%2C%2010%2C%20figsize%3D(14%2C%208))%0A%20%20%20%20for%20_digit%2C%20(_axis%2C%20_image)%20in%20enumerate(%0A%20%20%20%20%20%20%20%20zip(_axes%5B0%5D%2C%20representative_inputs%2C%20strict%3DTrue)%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(_image.view(28%2C%2028)%2C%20cmap%3D%22gray%22%2C%20vmin%3D0.0%2C%20vmax%3D1.0)%0A%20%20%20%20%20%20%20%20_axis.set_title(str(_digit))%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%0A%20%20%20%20for%20_axis%2C%20_image%20in%20zip(_axes%5B1%5D%2C%20ae_class_prototypes%2C%20strict%3DTrue)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(_image.view(28%2C%2028)%2C%20cmap%3D%22gray%22%2C%20vmin%3D0.0%2C%20vmax%3D1.0)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%0A%20%20%20%20for%20_axis%2C%20_image%20in%20zip(_axes%5B2%5D%2C%20vae_class_prototypes%2C%20strict%3DTrue)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(_image.view(28%2C%2028)%2C%20cmap%3D%22gray%22%2C%20vmin%3D0.0%2C%20vmax%3D1.0)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%0A%20%20%20%20for%20_axis%2C%20_image%2C%20_weight%20in%20zip(%0A%20%20%20%20%20%20%20%20_axes%5B3%5D%2C%0A%20%20%20%20%20%20%20%20ae_interpolation_images%2C%0A%20%20%20%20%20%20%20%20interpolation_weights%2C%0A%20%20%20%20%20%20%20%20strict%3DTrue%2C%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(_image.view(28%2C%2028)%2C%20cmap%3D%22gray%22%2C%20vmin%3D0.0%2C%20vmax%3D1.0)%0A%20%20%20%20%20%20%20%20_axis.set_title(f%22%7B_weight%3A.2f%7D%22)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%0A%20%20%20%20for%20_axis%2C%20_image%20in%20zip(%0A%20%20%20%20%20%20%20%20_axes%5B4%5D%2C%0A%20%20%20%20%20%20%20%20vae_interpolation_images%2C%0A%20%20%20%20%20%20%20%20strict%3DTrue%2C%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(_image.view(28%2C%2028)%2C%20cmap%3D%22gray%22%2C%20vmin%3D0.0%2C%20vmax%3D1.0)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%0A%20%20%20%20_fig.text(0.01%2C%200.84%2C%20%22representative%20input%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.67%2C%20%22AE%20centroid%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.50%2C%20%22VAE%20centroid%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.33%2C%20%22AE%3A%201%20to%207%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.text(0.01%2C%200.16%2C%20%22VAE%3A%201%20to%207%22%2C%20rotation%3D90%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.suptitle(%22Class%20centroids%20and%20interpolation%20in%20each%2016D%20latent%20space%22)%0A%20%20%20%20_fig.tight_layout(rect%3D(0.03%2C%200%2C%201%2C%200.96))%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%81%BE%E3%81%A8%E3%82%81%0A%0A%20%20%20%20AE%E3%81%AF%E6%97%A2%E7%9F%A5%E7%94%BB%E5%83%8F%E3%81%AE%E5%9C%A7%E7%B8%AE%E3%81%A8%E5%86%8D%E6%A7%8B%E6%88%90%E3%81%AB%E9%81%A9%E3%81%97%E3%80%81%E5%86%8D%E6%A7%8B%E6%88%90%E8%AA%A4%E5%B7%AE%E3%81%A0%E3%81%91%E3%81%AA%E3%82%89VAE%E3%82%88%E3%82%8A%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20VAE%E3%81%AFKL%E9%A0%85%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%BD%9C%E5%9C%A8%E5%88%86%E5%B8%83%E3%82%92%E6%97%A2%E7%9F%A5%E3%81%AEprior%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%86%8D%E6%A7%8B%E6%88%90%E3%81%A8%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89%E3%82%AA%E3%83%95%E3%82%92%E6%89%95%E3%81%84%E3%81%AA%E3%81%8C%E3%82%89%0A%20%20%20%20%24z%5Csim%5Cmathcal%7BN%7D(0%2CI)%24%20%E3%81%8B%E3%82%89%E6%96%B0%E3%81%97%E3%81%84%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%E4%BB%8A%E5%9B%9E%E3%81%AE%E3%82%88%E3%81%86%E3%81%ABAE%E3%81%AE%E8%A3%9C%E9%96%93%E3%82%82%E6%BB%91%E3%82%89%E3%81%8B%E3%81%AB%E8%A6%8B%E3%81%88%E3%82%8B%0A%20%20%20%20%E5%A0%B4%E5%90%88%E3%81%8C%E3%81%82%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E8%A3%9C%E9%96%93%E3%82%84t-SNE%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E4%B8%A1%E8%80%85%E3%82%92%E5%8C%BA%E5%88%A5%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E6%97%A2%E7%9F%A5%E3%81%AEprior%E3%81%8B%E3%82%89%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%81%84%E3%81%AA%E3%82%89VAE%E3%80%81%0A%20%20%20%20%E5%86%8D%E6%A7%8B%E6%88%90%E3%81%A0%E3%81%91%E3%81%8C%E7%9B%AE%E7%9A%84%E3%81%AA%E3%82%89AE%E3%81%8C%E8%87%AA%E7%84%B6%E3%81%AA%E9%81%B8%E6%8A%9E%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
14f1a1c53cc3e709ecc1f151ad916acc