pytorch mnist的auto encoder

本文介绍了一个使用PyTorch构建的时间检测模型,该模型在MNIST手写数字数据集上进行训练。文章详细展示了模型的构建过程,包括卷积编码器和转置卷积解码器的使用,以及Adam优化器和MSE损失函数的选择。通过批量处理数据,模型能够学习到输入数据的特征并尝试重构输入。每10个批次,模型会保存一次重构的图像,以便观察训练过程中的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import torch

import torch.nn.functional as F

import torch.nn as nn

import torch.optim as optim

from torch.autograd import variable

from scipy import misc

from torchvision import transforms, datasets

from torchvision.utils import save_image

import os

batch_size = 64

train_data = datasets.MNIST(root='./data/', train=True, transform=transforms.ToTensor(), download= True)

test_data = datasets.MNIST(root= './data/', train=True, transform=transforms.ToTensor(), download= True)

train_loader = torch.utils.data.DataLoader(dataset=train_data, batch_size= batch_size, shuffle= True)

test_loader = torch.utils.data.DataLoader(dataset=test_data, batch_size= batch_size, shuffle=True)

if not os.path.exists('./output_image'):

    os.mkdir('./output_image')

def to_img(x):
    x = 0.5 * (x + 1)
    x = x.clamp(0, 1)
    x = x.view(x.size(0), 1, 28, 28)
    return x

def Load_image():

    tif_data = misc.imread('/Users/changxingya/Downloads/UCSD_Anomaly_Dataset.v1p2/UCSDped1/Train/Train001/001.tif')

    tif_data_tensor = torch.from_numpy(tif_data)

    print(tif_data_tensor.size())

    return tif_data_tensor

class TemporalDetection(nn.Module):

    def __init__(self):

        super(TemporalDetection, self).__init__()

        self.encoder = nn.Sequential(

            nn.Conv2d(1, 16, 3, stride=3),

            nn.ReLU(True),

            nn.Conv2d(16, 32, 3, stride=2),

            nn.ReLU(True)
        )

        self.decoder = nn.Sequential(

            nn.ConvTranspose2d(32, 16, 5, stride=3),

            nn.ReLU(True),

            nn.ConvTranspose2d(16, 1, 2, stride=2),

            nn.Tanh()
        )

    def forward(self, x):

        x = self.encoder(x)

        x = self.decoder(x)

        return x

model = TemporalDetection()

print(model)

optimizer = optim.Adam(model.parameters(), lr=0.001)

loss_function = nn.MSELoss()

def train(epoch):

    for i, (data,target) in enumerate(train_loader):

        output = model(data)

        loss = loss_function(output, data)

        print("Temporal Detection Loss = {}".format(loss))

        optimizer.zero_grad()

        loss.backward()

        optimizer.step()

        if i % 10 == 0:

            img = to_img(output)

            save_image(img, './output_image/image_{}.png'.format(i))

for i in range(1, 10):

    #train_data = Load_image()

    train(i)

    print("Done")
### 使用变分自编码器 (VAE) 处理 MNIST 数据集 #### VAE 的基本原理 变分自编码器是一种基于概率图模型的生成模型,它通过引入潜在变量 \( z \),学习输入数据的概率分布。相比于标准自编码器,VAE 不仅能够压缩和重建数据,还能生成新的样本[^2]。 在训练过程中,VAE 将输入图像映射到一个高斯分布上,并从中采样得到潜在向量 \( z \)。随后,\( z \) 被传递给解码器以重构原始输入。为了确保潜在空间具有良好的结构化特性,VAE 添加了一个正则项——Kullback-Leibler 散度损失函数,用于约束潜在分布接近标准正态分布 \( N(0, I) \)。 #### 实现 VAE 的代码示例 以下是使用 PyTorch 构建并训练 VAE 来处理 MNIST 数据集的一个简单实现: ```python import torch from torch import nn, optim from torchvision import datasets, transforms from torch.utils.data import DataLoader # 定义 VAE 结构 class VAE(nn.Module): def __init__(self, latent_dim=20): super(VAE, self).__init__() # 编码器部分 self.encoder = nn.Sequential( nn.Linear(784, 512), nn.ReLU(), nn.Linear(512, 256), nn.ReLU() ) self.fc_mu = nn.Linear(256, latent_dim) self.fc_logvar = nn.Linear(256, latent_dim) # 解码器部分 self.decoder = nn.Sequential( nn.Linear(latent_dim, 256), nn.ReLU(), nn.Linear(256, 512), nn.ReLU(), nn.Linear(512, 784), nn.Sigmoid() # 输出范围 [0, 1] ) def reparameterize(self, mu, logvar): std = torch.exp(0.5 * logvar) eps = torch.randn_like(std) return mu + eps * std def forward(self, x): h = self.encoder(x.view(-1, 784)) mu = self.fc_mu(h) logvar = self.fc_logvar(h) z = self.reparameterize(mu, logvar) recon_x = self.decoder(z) return recon_x, mu, logvar def vae_loss(recon_x, x, mu, logvar): BCE = nn.functional.binary_cross_entropy(recon_x, x.view(-1, 784), reduction='sum') KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) return BCE + KLD # 加载 MNIST 数据集 transform = transforms.ToTensor() train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True) test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True) train_loader = DataLoader(dataset=train_dataset, batch_size=128, shuffle=True) test_loader = DataLoader(dataset=test_dataset, batch_size=128, shuffle=False) # 初始化模型、优化器和设备 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = VAE().to(device) optimizer = optim.Adam(model.parameters(), lr=1e-3) # 训练过程 for epoch in range(10): # 运行 10 个 epochs model.train() total_loss = 0 for batch_idx, (x, _) in enumerate(train_loader): x = x.to(device) optimizer.zero_grad() recon_batch, mu, logvar = model(x) loss = vae_loss(recon_batch, x, mu, logvar) loss.backward() total_loss += loss.item() optimizer.step() avg_loss = total_loss / len(train_loader.dataset) print(f"Epoch {epoch+1}, Loss: {avg_loss:.4f}") ``` 上述代码定义了一个简单的两层全连接网络作为编码器和解码器,并实现了重参数化技巧来计算梯度。 #### 关键点解释 1. **编码器**:将输入图片转换为低维表示(即均值 \( \mu \) 和方差 \( \log\sigma^2 \)),并通过重参数化技术从该分布中抽取随机样本。 2. **解码器**:接收来自潜在空间的样本 \( z \),将其还原成与原输入相似的形式。 3. **损失函数**:由两个部分组成——二元交叉熵衡量重建误差;KL 散度控制潜在分布形状。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值