『AE』一维卷积、转置卷积、自编码

一.一维卷积

1.理论

博客: https://www.cnblogs.com/itmorn/p/11177439.html

类型:

  • full卷积;

  • same卷积;

  • valid卷积。

2.应用场景:

  • 声音、信号、脑电波、心电图可用RNN和一维卷积。

在这里插入图片描述

3.代码:

(1)源码解释

    def __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1,bias=True, padding_mode='zeros'):#输入通道、输出通道、卷积核大小、步长、padding、扩充率(是不是空洞卷积。值为1表示不是空洞卷积)、分组、偏至、0填充padding。

二.转置卷积

1.理论

看这篇博客中“转置卷积”: https://www.sohu.com/a/317166403_394987

2.代码

(1)源码解释

    def __init__(self, in_channels, out_channels, kernel_size, stride=1,padding=0, output_padding=0, groups=1, bias=True,dilation=1, padding_mode='zeros'):输入、输出、卷积核大小、步长、padding、output_padding、分组...

三.自编码

1.理论

看这篇文章就ok: https://blog.csdn.net/abcdrachel/article/details/84024144

2.代码:

代码中,编码解码呈现完整对称。先图片赏阅:

在这里插入图片描述

编码

在这里插入图片描述

解码

(1)训练代码

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision.utils import save_image
import os
from torchvision import datasets,transforms
from NetEncoder import Encoder_Net
from NetDecoder import Decoder_Net


num_epoch = 10
if __name__ == '__main__':

    if not os.path.exists("./params"):
        os.mkdir("./params")
    if not os.path.exists("./img"):
        os.mkdir("./img")
    trans = transforms.Compose([
        transforms.ToTensor()
    ])
    mnist_data = datasets.MNIST("./data",train=True,
                                transform=trans,download=True)
    train_loader = DataLoader(mnist_data, 100,shuffle=True)

    if torch.cuda.is_available():
        device = torch.device("cuda")
    else:
        device = torch.device("cpu")

    en_net = Encoder_Net().to(device)
    de_net = Decoder_Net().to(device)

    en_net.train()
    de_net.train()

    en_net.load_state_dict(
        torch.load("./params/en_net.pth"))
    de_net.load_state_dict(
        torch.load("./params/de_net.pth"))

    loss_fn = nn.MSELoss()
    en_optimizer = torch.optim.Adam(en_net.parameters())
    de_optimizer = torch.optim.Adam(de_net.parameters())
    # de_optimizer = torch.optim.Adam(de_net.parameters(),weight_decay=0.0001)#L2正则化自带。(平方)
    # en_optimizer = torch.optim.SGD(en_net.parameters(),lr=1e-3)
    # de_optimizer = torch.optim.SGD(de_net.parameters(),lr=1e-3)

    en_L1_loss = 0
    for enparam in en_net.parameters():
        en_L1_loss += torch.sum(torch.abs(enparam))  # L1。对参数做绝对值,再求和。
    de_L1_loss = 0
    for deparam in de_net.parameters():
        de_L1_loss += torch.sum(torch.abs(deparam))  # L1。

    for epoch in range(num_epoch):
        for i, (img,label) in enumerate(train_loader):
            img = img.to(device)
            feature = en_net(img)
            out_img = de_net(feature)
            # print(out_img.shape)
            loss = loss_fn(img,out_img)

            losses = loss+0.0001*en_L1_loss+0.0001*de_L1_loss
            en_optimizer.zero_grad()
            de_optimizer.zero_grad()

            losses.backward(retain_graph=True)#重点。默认retain_graph=None:计算图中间的计算变量立马释放。这里不能释放,有正则化项。
            en_optimizer.step()
            de_optimizer.step()

            if i%100 == 0:
                print('Epoch [{}/{}], loss: {:.3f}'
                      .format(epoch, num_epoch, losses))
        images = out_img.cpu().data

        # show_images = images.permute([0,2,3,1])
        # show_images = torch.transpose(images,1,3)
        # plt.imshow(show_images[0].reshape(28,28))
        # plt.pause(1)

        fake_images = out_img.cpu().data
        save_image(fake_images, './img/{}-fake_images.png'
                   .format(epoch + 1),nrow=10)#保存图片。N张图片,保存M行。
        real_images = img.cpu().data
        save_image(real_images, './img/{}-real_images.png'
                   .format(epoch + 1), nrow=10)#保存图片
        # torch.save(en_net.state_dict(), "./params/en_net.pth")
        # torch.save(de_net.state_dict(), "./params/de_net.pth")

发布了29 篇原创文章 · 获赞 45 · 访问量 5035

猜你喜欢

转载自blog.csdn.net/sinat_39783664/article/details/104644212
今日推荐