文章目录
1. 本周学习主要内容
1.1 深度学习方面
- Kaggle医学影像识别案例
- 生成对抗网络模型(Gan)
- 自动编码器
1.2 信号处理与Matlab实现
- matlab基本操作
- 数字信号处理除
1.3 机器学习基础的回顾
- 基础知识
- 网格搜索
- 重温经典机器学习模型
2. 下周学习内容
- 继续复习传统机器学习模型的一些基础
- 完成一个深度学习案例
- 数字信号处理与matlab实现
3. 本周重点知识
3.1 Kaggle医学影响图像识别案例
- 更多的是关于图像处理的一些知识
- 通过学习图像处学习处理其他格式数据的方法
- 完成的是病理图像识别诊断
- 染色标准化入门:GAN、TransposeConv、DCGAN与cGAN
3.2 生成对抗网络
在生成对抗网络诞生之后数年之中,围绕着如何使用生成对抗网络进行染色标准化的研究层出不穷,最为代表性的作品是Salehi等人在2020年完成的论文:[Salehi2020] P. Salehi, A. Chalechale, Pix2pix-based stain-to-stain translation: A solution for robust stain normalization in histopathology images analysis (2020), International Conference on Machine Vision and Image Processing
这篇论文在经典对抗架构Pix2Pix的基础上做出了改进,创造出架构Stain-to-Stain Translation(STST),并成功实现了目前为止效果最优的染色标准化。如下图所示,a为原始染色载玻片,b为参考用的染色载玻片,c-g为使用不同方式实现染色标准化的生成图像。从颜色、轮廓等各个角度来看,STST的表现肉眼可见地超越了其他经典的染色标准化方法。
- STST的染色标准化方法
- Pix2Pix基本框架
- 基础知识
- 原始GAN的运行原理与代码
- 转置卷积TransposedConv与能够处理图像的DCGAN
- 自动编码器Autoencoders,经典Encoder-Decoder架构
- 深度卷积自动编码器(Convolutional Autoencoders)架构
- cGAN与PatchGAN架构
- Unet的损失函数、运行原理与代码
- STST架构基于Unet做出了怎样的改进
- Gan基本架构
- 核心原理
假设现在存在一组从真实场景中收集的数据RealData,生成对抗网络的关键使用场景之一就是借助真实数据RealData生成一组假数据FakeData,且这组假数据最好能够以假乱真。有时候这组生成的假数据会用于替代真实数据或加入真实数据、用于训练神经网络,有时候这组生成的假数据就是我们最终想要获得的目标(例如,AI生成人脸的技术)。因此大部分时候,生成对抗网络的最终目标就是输出一组以假乱真的假数据。
如上图所示,一个生成对抗网络包含两个基础网络:生成器(generator,简写为G,也被称为生成网络)与判别器(discriminator,简写为D,也被称为判别网络)。其中,生成器用于生成新数据,其生成数据的基础往往是一组噪音或者随机数,而判别器用于判断生成的数据和真实数据哪个才是真的。生成器没有标签,是无监督网络;而判别器有标签,是有监督网络,其标签是“假与真”(0与1)。与普通二分类网络一样,判别器输出的是一类标签下的概率。在GAN官方论文中,我们规定判别器输出当前数据为真的概率(标签为1的概率),因此概率大于0.5时,判别器认为样本是真实数据,当概率小于0.5时,判别器认为样本是由生成器生成的假数据。
在训练过程中,生成器和判别器的目标是相矛盾的,并且这种矛盾可以体现在判别器的判断准确性上。生成器的目标是生成尽量真实的数据(这也是我们对生成对抗网络的要求),最好能够以假乱真、让判别器判断不出来,因此生成器的学习目标是让判别器上的判断准确性越来越低;相反,判别器的目标是尽量判别出真伪,因此判别器的学习目标是让自己的判断准确性越来越高。
当生成器生成的数据越来越真时,判别器为维持住自己的准确性,就必须向判别能力越来越强的方向迭代。当判别器越来越强大时,生成器为了降低判别器的判断准确性,就必须生成越来越真的数据。在这个奇妙的关系中,判别器判断的准确性由GAN论文中定义的特殊交叉熵 𝑉 来衡量,判别器与生成器共同影响交叉熵 𝑉 ,同时训练、相互内卷,对该交叉熵的控制是此消彼长的,这是真正的零和博弈。
- 此处省略一些损失函数与一些公式法则
- 转置卷积(Transposed Convolution) vs 反卷积(Deconvolution)
转置卷积是一种与卷积相对应的操作:卷积是使用卷积核将原本尺寸较大的图像缩小,转置卷积是使用卷积核将原本尺寸较小的图像放大。这一操作在直觉上很容易被理解成是将卷积运算反过来,但需要强调的是:转置卷积不是卷积运算的逆运算(Inverse Convolution),只是一种单纯的、使用卷积核将图像放大的上采样操作而已。
卷积运算的逆运算被称为反卷积(Deconvolution),反卷积是一种能够将某一卷积核的缩小效果完全逆转的运算,这种完全逆转可以将被卷积之前的图像像素极大程度地复原、甚至生成超越原始图像的图像,因此反卷积常被用于提升图像像素、为影像上色等实践领域。相比之下,转置卷积只能够将图像恢复到被卷积之前的尺寸(即恢复空间信息),但不能复原被卷积之前的图像像素信息、甚至还会打乱图像中不同维度的信息、让通道信息混杂在一起,这就非常适合被用于从无到有生成数据。
- 转置卷积层的原理与代码实现
- DCGan架构
- DCGan简单复现
#DCGAN中的判别器
class cGAN_disc(nn.Module):
def __init__(self):
super().__init__()
self.label_embedding = nn.Sequential(nn.Embedding(10,50)
,nn.Linear(50,784)
,nn.ReLU(inplace=True) #在架构图上这里没有激活函数
)
self.main = nn.Sequential(nn.Conv2d(2,128,3,2,1)
,nn.LeakyReLU(0.2,inplace=True)
,nn.Conv2d(128,128,3,2,1)
,nn.LeakyReLU(0.2,inplace=True)
) #由于Fashion-MNIST图像较小,因此在这里使用的卷积层也很少
self.output_ = nn.Sequential(nn.Dropout(0.2)
,nn.Linear(128*7*7,1))
def forward(self,label,realdata): #标签在前,数据在后
label = self.label_embedding(label)
label = label.view(-1,1,28,28)
inputs = torch.cat((realdata,label),dim=1)
features = self.main(inputs)
features = features.view(-1,128*7*7)
outputs = self.output_(features)
return outputs
class cGAN_gen(nn.Module):
def __init__(self):
super().__init__()
#标签的上采样
self.label_upsample = nn.Sequential(nn.Embedding(10,50)
,nn.Linear(50,49)
,nn.ReLU(True)
)
#噪音的上采样
self.noise_upsample = nn.Sequential(nn.Linear(100,6272)
,nn.LeakyReLU(0.2,True)
)
#核心架构
self.main = nn.Sequential(nn.ConvTranspose2d(129,128, kernel_size=4, stride=2, padding=1)
,nn.LeakyReLU(0.2,True)
,nn.ConvTranspose2d(128,128,4,2,1)
,nn.LeakyReLU(0.2,True)
,nn.Conv2d(128,1,kernel_size=3,padding=1)
)
def forward(self,label,noise):
#转化标签
label = self.label_upsample(label)
label = label.view(-1,1,7,7)
#转化噪音
noise = self.noise_upsample(noise)
noise = noise.view(-1,128,7,7)
#合并数据
inputs = torch.cat((noise,label),dim=1)
#将数据输入核心架构,生成假数据
fakedata = self.main(inputs)
return fakedata
3.3 自动编码器
任意自动编码器都是由编码器和解码器共同构成的,在这一架构中,编码器的职责是从原始数据中提取必要的信息,而解码器的职责是将提取出的信息还原为原来的结构,二者共同工作,便能够将原始数据表示成相同结构、但不同数值的另一组数据。值得注意的是,在自动编码器的架构中,编码器的结果Code是原始数据的数据表示,而解码器输出的结果也是原始数据的数据表示。
很显然,如果对深度神经网络足够熟悉,那自动编码器的架构很容易理解。同时,只需要将编码器中的线性层替换成卷积层、解码器中的线性层替换成转置卷积层,我们就可以轻易地实现深度卷积自动编码器的架构:
- 自动编码器种类
1.降噪自动编码器(Denoising Autoencoder)
2.稀疏自动编码器(Sparse Autoencoder)
3.变分自动编码器(Variational Autoencoder,VAE)
- 从无到有生成图像
1.方案1:完全从无到有,即从随机数生成图像
这一方案要求对生成器输入随机数(噪音z),并在训练中令生成器输出具体图像。在输入数据的创造上相对简便,但是训练难度很大,因为在真假数据结构、形态、分布完全不同的情况下,生成器很难战胜判别器。
2.从一组图像生成另一组图像
这一方案需要在生成器中输入与真实图像有相似信息的图像。这一方案训练起来难度会小很多,因为输入数据提供了大量真实图像的相关信息,因此生成器的学习会变得更加容易,判别器也会更容易被骗过。但这一方案要求必须准备至少两组信息像素的图像,并且在输入输出都是同尺寸图像的情况下、整体架构的计算量会变得更大。
3.4 传统机器学习基础知识复习
- 主要复习一些数学原理与代码复现
1.梯度下降
2.网格搜索调参
3.逻辑回归的可解释性等等
3.5 正在学习的内容:信号处理的复习与matlab实现
1.matlab的一些基本语法与操作
2.数字信号处理的一些基本知识