这不单单是课程设计思路,也是小白由浅入深之路
最近哈工大被禁也是个问题,不得不考虑PYTORCH和TENSORFLOW前途,因此学习paddle也是必要的
官方的全连接层模型虽然经过调参可能达到90大几,但是建议还是尝试别的网络
#定义DNN网络
from paddle.fluid.dygraph import Conv2D
class MyCNN(fluid.dygraph.Layer):
'''
DNN网络
'''
def __init__(self):
super(MyDNN,self).__init__()
self.hidden1_1 = Conv2D(1,28,5,1) #通道数、卷积核个数、卷积核大小
self.hidden1_2 = Pool2D(pool_size=2,pool_type='max',pool_stride=1)
self.hidden2_1 = Conv2D(28,32,3,1)
self.hidden2_2 = Pool2D(pool_size=2,pool_type='max',pool_stride=1)
self.hidden3 = Conv2D(32,32,3,1)
self.hidden4 = Linear(32*10*10,65,act='softmax')
def forward(self,input): # forward 定义执行实际运行时网络的执行逻辑
'''前向计算'''
x = self.hidden1_1(input)
x = self.hidden1_2(x)
x = self.hidden2_1(x)
x = self.hidden2_2(x)
x = self.hidden3(x)
x = fluid.layers.reshape(x, shape=[-1, 32*10*10])
y = self.hidden4(x)
return y
理想状态就是生成器生成的数据让判别网络不能准确判别,达到以假乱真的目的
这个可以理解为你画了一幅贼丑的画,老师为了不伤你的心告诉你很好,然后你就在画丑画的路上一去不复返~
# 通过上采样扩大特征图
class G(fluid.dygraph.Layer):
def __init__(self, name_scope):
super(G, self).__init__(name_scope)
name_scope = self.full_name()
#
self.h1=Linear(100,1024)
self.h2=paddle.fluid.dygraph.BatchNorm(1024,act='tanh')
self.h3=Linear(1024,6272)
self.h4=paddle.fluid.dygraph.BatchNorm(6272,act='tanh')
#
self.h5=Conv2D(128,64,filter_size=5,padding=2)
self.h6=paddle.fluid.dygraph.BatchNorm(64,act='tanh')
self.h7=Conv2D(64,1,filter_size=5,padding=2,act='tanh')
def forward(self, z):
#
# My_G forward的代码
#
z=fluid.layers.reshape(z,shape=[-1,100])
y=self.h1(z)
y=self.h2(y)
y=self.h3(y)
y=self.h4(y)
y=fluid.layers.reshape(y,shape=[-1,128,7,7])
y=fluid.layers.image_resize(y,scale=2)
y=self.h5(y)
y=self.h6(y)
y=fluid.layers.image_resize(y,scale=2)
y=self.h7(y)
return y
class D(fluid.dygraph.Layer):
def __init__(self, name_scope):
super(D, self).__init__(name_scope)
name_scope = self.full_name()
#
# My_D的代码
#
self.h1=Conv2D(1,64,filter_size=3)
self.h2=paddle.fluid.dygraph.BatchNorm(64,act='relu')
self.h3=Pool2D(pool_size=2,pool_stride=2)
self.h4=Conv2D(64,128,filter_size=3)
self.h5=paddle.fluid.dygraph.BatchNorm(128,act='relu')
self.h6=Pool2D(pool_size=2,pool_stride=2)
self.h7=Linear(128*5*5,1024)
self.h8=paddle.fluid.dygraph.BatchNorm(1024,act='relu')
self.h9=Linear(1024,1)
def forward(self, img):
#
# My_G forward的代码
#
y=self.h1(img)
y=self.h2(y)
y=self.h3(y)
y=self.h4(y)
y=self.h5(y)
y=self.h6(y)
y=fluid.layers.reshape(y,shape=[-1,128*5*5])
y=self.h7(y)
y=self.h8(y)
y=self.h9(y)
return y
这是这篇论文的一个生成效果图,第一列是输入图像,后面的是y StarGAN v2生成的图像
提出的模型很好地满足了上面两个要求,并在数据集上得到了验证,然后也给出了github的地址(nice)
简单的介绍了下好的图像到图像模型应该生成包含在多领域多风格的图像
为了解决上述问题提出了StarGAN
但是StarGAN仍旧存在问题,但是次模型仍旧只捕捉到了确定的映射,没有捕捉到分布的多模态性
这个限制的原因来自每个域由确定的标签来表明
对抗损失
使用样式重建损失
引入多样化敏感损失,是G能生成多样化图像
为了保证生成的图像G正确地保留了其输入图像x的域不变特征(例如姿态),使用了循环一致性丢失
总目标函数
FID表示生成图像和真实图像的分布距离,越低越好,LPIPS度量了图像多样化,越高越好
上面除了损失函数都是一些套话和工作介绍,下面开始讲细节
生成器:
映射网络
风格编码器
判别器