pytorch搭建卷积神经网络【第三课_自己搭建对抗神经网络】
pytorch搭建卷积神经网络【第三课_自己搭建对抗神经网络】
文章目录
- 前言
- 1、网络搭建
- 2、网络架构
- 3、网络架构解析
- 4、网络实例化
- 5、网络权重加载
- 6、网络属性设置
- 7、图像tensor化
- 8、导入测试图
- 9、图像tensor化
- 10、图像传入网络
- 11、生成对抗图
- 12、对抗图解析
- 没有进行全连接,只是对像素点进行的计算
- 总结
前言
AN 的基本理念其实非常简单,其核心由两个目标互相冲突的神经网络组成,这两个网络会以越来越复杂的方法来“蒙骗”对方。这种情况可以理解为博弈论中的极大极小博弈树。以下就是传入马的网络生成斑马。
1、网络搭建
#!/usr/bin/env python
# coding: utf-8
import torch
import torch.nn as nnclass ResNetBlock(nn.Module): # <1>def __init__(self, dim):super(ResNetBlock, self).__init__()self.conv_block = self.build_conv_block(dim)def build_conv_block(self, dim):conv_block = []conv_block += [nn.ReflectionPad2d(1)]conv_block += [nn.Conv2d(dim, dim, kernel_size=3, padding=0, bias=True),nn.InstanceNorm2d(dim),nn.ReLU(True)]conv_block += [nn.ReflectionPad2d(1)]conv_block += [nn.Conv2d(dim, dim, kernel_size=3, padding=0, bias=True),nn.InstanceNorm2d(dim)]return nn.Sequential(*conv_block)def forward(self, x):out = x + self.conv_block(x) # <2>return outclass ResNetGenerator(nn.Module):def __init__(self, input_nc=3, output_nc=3, ngf=64, n_blocks=9): # <3> assert(n_blocks >= 0)super(ResNetGenerator, self).__init__()self.input_nc = input_ncself.output_nc = output_ncself.ngf = ngfmodel = [nn.ReflectionPad2d(3),nn.Conv2d(input_nc, ngf, kernel_size=7, padding=0, bias=True),nn.InstanceNorm2d(ngf),nn.ReLU(True)]n_downsampling = 2for i in range(n_downsampling):mult = 2**imodel += [nn.Conv2d(ngf * mult, ngf * mult * 2, kernel_size=3,stride=2, padding=1, bias=True),nn.InstanceNorm2d(ngf * mult * 2),nn.ReLU(True)]mult = 2**n_downsamplingfor i in range(n_blocks):model += [ResNetBlock(ngf * mult)]for i in range(n_downsampling):mult = 2**(n_downsampling - i)model += [nn.ConvTranspose2d(ngf * mult, int(ngf * mult / 2),kernel_size=3, stride=2,padding=1, output_padding=1,bias=True),nn.InstanceNorm2d(int(ngf * mult / 2)),nn.ReLU(True)]model += [nn.ReflectionPad2d(3)]model += [nn.Conv2d(ngf, output_nc, kernel_size=7, padding=0)]model += [nn.Tanh()]self.model = nn.Sequential(*model)def forward(self, input): # <3>return self.model(input)
2、网络架构
ResNetGenerator((model): Sequential((0): ReflectionPad2d((3, 3, 3, 3))(1): Conv2d(3, 64, kernel_size=(7, 7), stride=(1, 1))(2): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))(5): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(6): ReLU(inplace=True)(7): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))(8): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(9): ReLU(inplace=True
)(10): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(11): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(12): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(13): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(14): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(15): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(16): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(17): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(18): ResNetBlock((conv_block): Sequential((0): ReflectionPad2d((1, 1, 1, 1))(1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(2): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(3): ReLU(inplace=True)(4): ReflectionPad2d((1, 1, 1, 1))(5): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1))(6): InstanceNorm2d(256, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)))(19): ConvTranspose2d(256, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))(20): InstanceNorm2d(128, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(21): ReLU(inplace=True)(22): ConvTranspose2d(128, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), output_padding=(1, 1))(23): InstanceNorm2d(64, eps=1e-05, momentum=0.1, affine=False, track_running_stats=False)(24): ReLU(inplace=True)(25): ReflectionPad2d((3, 3, 3, 3))(26): Conv2d(64, 3, kernel_size=(7, 7), stride=(1, 1))(27): Tanh())
)
3、网络架构解析
4、网络实例化
# 网络实例化
netG = ResNetGenerator()
5、网络权重加载
#
model_path = '../data/p1ch2/horse2zebra_0.4.0.pth'
model_data = torch.load(model_path)
netG.load_state_dict(model_data)
6、网络属性设置
#
netG.eval()
7、图像tensor化
#
from PIL import Image
from torchvision import transforms#
preprocess = transforms.Compose([transforms.Resize(256),transforms.ToTensor()])
8、导入测试图
#
img = Image.open('C:/Users/Administrator/Documents/horse.jpg')
9、图像tensor化
#
img_t = preprocess(img)
batch_t = torch.unsqueeze(img_t, 0)
10、图像传入网络
#
batch_out = netG(batch_t)
11、生成对抗图
#
out_t = (batch_out.data.squeeze() + 1.0) / 2.0
out_img = transforms.ToPILImage()(out_t)
out_img.save('../data/p1ch2/zebra.jpg')
out_img
12、对抗图解析
没有进行全连接,只是对像素点进行的计算
(25): ReflectionPad2d((3, 3, 3, 3))
(26): Conv2d(64, 3, kernel_size=(7, 7), stride=(1, 1))
(27): Tanh()