{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30804,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torchvision import datasets, transforms\nfrom torch.autograd import Variable\nfrom torchvision.utils import save_image\n\nfrom torch.utils.data import Dataset, DataLoader","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:48.974837Z","iopub.execute_input":"2024-12-16T12:30:48.975195Z","iopub.status.idle":"2024-12-16T12:30:53.306389Z","shell.execute_reply.started":"2024-12-16T12:30:48.975163Z","shell.execute_reply":"2024-12-16T12:30:53.305698Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 读入数据集\ntrain_data = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest_data = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:53.307992Z","iopub.execute_input":"2024-12-16T12:30:53.308690Z","iopub.status.idle":"2024-12-16T12:30:57.687830Z","shell.execute_reply.started":"2024-12-16T12:30:53.308648Z","shell.execute_reply":"2024-12-16T12:30:57.687145Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 查看train数据集的信息\ntrain_data.isnull().any().describe()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:57.688866Z","iopub.execute_input":"2024-12-16T12:30:57.689225Z","iopub.status.idle":"2024-12-16T12:30:57.717672Z","shell.execute_reply.started":"2024-12-16T12:30:57.689187Z","shell.execute_reply":"2024-12-16T12:30:57.716860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 查看test数据集的信息\ntest_data.isnull().any().describe()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:57.719746Z","iopub.execute_input":"2024-12-16T12:30:57.720111Z","iopub.status.idle":"2024-12-16T12:30:57.731845Z","shell.execute_reply.started":"2024-12-16T12:30:57.720064Z","shell.execute_reply":"2024-12-16T12:30:57.731017Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 定义 MNISTCSV类，将数据转化成vae所需的格式\nclass MNISTCSV(Dataset):\n    def __init__(self, data, labels, transform=None):\n        self.data = data\n        self.labels = labels\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        image = self.data[idx]\n        if self.transform:\n            image = self.transform(image)\n        if self.labels is None:\n            label = torch.zeros(1, dtype=torch.long)\n            return image,label\n\n        label = self.labels[idx]\n        return image, label\n\n\nbs = 100\n\n# train数据集是785,带有label，所以需要单独处理\ntrain_labels = train_data[\"label\"].values\ntrain_images = train_data.drop(labels=[\"label\"], axis=1)\ntrain_images = train_images.values.astype(np.float32).reshape(-1, 28, 28) / 255\n\n\ntest_images = test_data.values.astype(np.float32).reshape(-1, 28, 28) / 255  # 修正 'reshpae' 为 'reshape'\n\ntrain_dataset = MNISTCSV(train_images, train_labels, transform=transforms.ToTensor())\ntest_dataset = MNISTCSV(test_images,labels=None, transform=transforms.ToTensor())\n\ntrain_loader = DataLoader(train_dataset, batch_size=bs, shuffle=True)\ntest_loader = DataLoader(test_dataset, batch_size=bs, shuffle=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:57.732893Z","iopub.execute_input":"2024-12-16T12:30:57.733273Z","iopub.status.idle":"2024-12-16T12:30:57.975475Z","shell.execute_reply.started":"2024-12-16T12:30:57.733245Z","shell.execute_reply":"2024-12-16T12:30:57.974766Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class VAE(nn.Module):\n\n    def __init__(self, x_dim, h_dim1, h_dim2, z_dim):\n\n        super(VAE, self).__init__()\n\n        \n\n        # encoder part\n\n        self.fc1 = nn.Linear(x_dim, h_dim1)\n\n        self.fc2 = nn.Linear(h_dim1, h_dim2)\n\n        self.fc31 = nn.Linear(h_dim2, z_dim)\n\n        self.fc32 = nn.Linear(h_dim2, z_dim)\n\n        # decoder part\n\n        self.fc4 = nn.Linear(z_dim, h_dim2)\n\n        self.fc5 = nn.Linear(h_dim2, h_dim1)\n\n        self.fc6 = nn.Linear(h_dim1, x_dim)\n\n        \n\n    def encoder(self, x):\n\n        h = F.relu(self.fc1(x))\n\n        h = F.relu(self.fc2(h))\n\n        return self.fc31(h), self.fc32(h) # mu, log_var\n\n    \n\n    def sampling(self, mu, log_var):\n\n        std = torch.exp(0.5*log_var)\n\n        eps = torch.randn_like(std)\n\n        return eps.mul(std).add_(mu) # return z sample\n\n        \n\n    def decoder(self, z):\n\n        h = F.relu(self.fc4(z))\n\n        h = F.relu(self.fc5(h))\n\n        return F.sigmoid(self.fc6(h)) \n\n    \n\n    def forward(self, x):\n\n        mu, log_var = self.encoder(x.view(-1, 784))\n\n        z = self.sampling(mu, log_var)\n\n        return self.decoder(z), mu, log_var\n\n\n\n# build model\n\nvae = VAE(x_dim=784, h_dim1= 512, h_dim2=256, z_dim=2)\n\nif torch.cuda.is_available():\n\n    vae.cuda()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:57.976651Z","iopub.execute_input":"2024-12-16T12:30:57.977514Z","iopub.status.idle":"2024-12-16T12:30:58.277297Z","shell.execute_reply.started":"2024-12-16T12:30:57.977472Z","shell.execute_reply":"2024-12-16T12:30:58.276613Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"vae","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:58.278649Z","iopub.execute_input":"2024-12-16T12:30:58.278962Z","iopub.status.idle":"2024-12-16T12:30:58.284463Z","shell.execute_reply.started":"2024-12-16T12:30:58.278921Z","shell.execute_reply":"2024-12-16T12:30:58.283540Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"optimizer = optim.Adam(vae.parameters())\n\n# return reconstruction error + KL divergence losses\n\ndef loss_function(recon_x, x, mu, log_var):\n\n    BCE = F.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum')\n\n    KLD = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())\n\n    return BCE + KLD","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:58.285607Z","iopub.execute_input":"2024-12-16T12:30:58.286216Z","iopub.status.idle":"2024-12-16T12:30:58.295176Z","shell.execute_reply.started":"2024-12-16T12:30:58.286173Z","shell.execute_reply":"2024-12-16T12:30:58.294532Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train(epoch):\n\n    vae.train()\n\n    train_loss = 0\n\n    for batch_idx, (data, _) in enumerate(train_loader):\n\n        data = data.cuda()\n\n        optimizer.zero_grad()\n\n        \n\n        recon_batch, mu, log_var = vae(data)\n\n        loss = loss_function(recon_batch, data, mu, log_var)\n\n        \n\n        loss.backward()\n\n        train_loss += loss.item()\n\n        optimizer.step()\n\n        \n\n        if batch_idx % 100 == 0:\n\n            print('Train Epoch: {} [{}/{} ({:.0f}%)]\\tLoss: {:.6f}'.format(\n\n                epoch, batch_idx * len(data), len(train_loader.dataset),\n\n                100. * batch_idx / len(train_loader), loss.item() / len(data)))\n\n    print('====> Epoch: {} Average loss: {:.4f}'.format(epoch, train_loss / len(train_loader.dataset)))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:58.296244Z","iopub.execute_input":"2024-12-16T12:30:58.296860Z","iopub.status.idle":"2024-12-16T12:30:58.308483Z","shell.execute_reply.started":"2024-12-16T12:30:58.296821Z","shell.execute_reply":"2024-12-16T12:30:58.307780Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def test():\n\n    vae.eval()\n\n    test_loss= 0\n\n    with torch.no_grad():\n\n        for data, _ in test_loader:\n\n            data = data.cuda()\n\n            recon, mu, log_var = vae(data)\n\n            \n\n            # sum up batch loss\n\n            test_loss += loss_function(recon, data, mu, log_var).item()\n\n        \n\n    test_loss /= len(test_loader.dataset)\n\n    print('====> Test set loss: {:.4f}'.format(test_loss))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:58.311012Z","iopub.execute_input":"2024-12-16T12:30:58.311443Z","iopub.status.idle":"2024-12-16T12:30:58.320742Z","shell.execute_reply.started":"2024-12-16T12:30:58.311417Z","shell.execute_reply":"2024-12-16T12:30:58.320095Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for epoch in range(1, 51):\n\n    train(epoch)\n\n    test()","metadata":{"scrolled":true,"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:30:58.321656Z","iopub.execute_input":"2024-12-16T12:30:58.321924Z","iopub.status.idle":"2024-12-16T12:33:16.288078Z","shell.execute_reply.started":"2024-12-16T12:30:58.321900Z","shell.execute_reply":"2024-12-16T12:33:16.287287Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with torch.no_grad():\n\n\n    z = torch.randn(64, 2).cuda()\n\n    # z = torch.tensor([[-2.6312e-01,  9.0727e-02]] * 64).cuda()\n    \n    print(z)  # 打印潜在空间向量 z\n    \n    sample = vae.decoder(z).cuda()\n\n    save_image(sample.view(64, 1, 28, 28), './sample' + '.png')\n\n    print(sample)\n\nfrom PIL import Image\nImage.open('./sample.png')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-16T12:44:57.024253Z","iopub.execute_input":"2024-12-16T12:44:57.024590Z","iopub.status.idle":"2024-12-16T12:44:57.062787Z","shell.execute_reply.started":"2024-12-16T12:44:57.024562Z","shell.execute_reply":"2024-12-16T12:44:57.061938Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}