当前位置: 首页>編程日記>正文

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()

总结


https://www.fengoutiyan.com/post/13759.html

相关文章:

  • pytorch搭建自己的神经网络
  • pytorch二均值池化
  • Pytorch卷积神经网络
  • pytorch零基础
  • pytorch自定义卷积
  • pytorch一维卷积
  • pytorch卷积
  • pytorch mnist
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機