一.一维卷积
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)训练代码
扫描二维码关注公众号,回复:
11128928 查看本文章
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")