一、基础知识
-
PyTorch提供简单的计算误差方法。最简单的均方误差:先计算每个输出节点的实际输出和预期输出之差的平方,再计算平均值。
nn.MSELoss()
-
误差函数&&损失函数
- 误差是指预期输出与实际输出之间的差值。
- 损失是指根据误差计算得到的,要考虑实际情况。
1、构建和训练GAN的推荐步骤:
- 从真实数据集预览总数据
- 测试鉴别器至少具备从随机噪声中区分真实数据的能力
- 测试未经训练的生成器能否创建正确格式的数据
- 可视化观察损失值,了解训练进展
-
理想的损失值应该在0.25左右,也就是鉴别器和生成器达到平衡。如果鉴别器的损失值趋近于0,表明该生成器没能学会骗过鉴别器
-
在鉴别器学会向生成器提供良好的反馈之前,生成器率先发现一个一直被判定为真实图像的输出
-
如何解决模式崩溃和图像清晰度低的问题。
1)使用二元交叉熵BCELoss()代替损失函数中的均方误差MSELoss()
2)在鉴别器和生成器中使用LeakyReLU()激活函数。
3)将神经网络中的信号进行标准化,确保它的均值为0.改良后的神经网络的代码如下:
self.model=nn.Sequential( nn.Linear(784,200), nn.LeakyReLU(0.02), nn.LayerNorm(200), nn.Linear(200,1), nn.Sigmoid()
4)使用Adam优化器
上述改良方法并没有改变末世崩溃现象,但是解决了图像清晰度问题。 -
生成器会觉得,讲一个单值转换成784像素来代表一个数字太难了。试着将输入值从1变成100,仍然没有解决模式崩溃问题。
-
输入鉴别器的随机种子和生成器的随机种子可以不一样。因为输入生成器的种子不需要01范围内。而输入鉴别器的种子需要在01范围内,才可以对应真实数据集中的图像像素问题。
-
怎么样选取一个合适的随机种子?
要从一个平均值为0,方差为1的正态分布中抽取种子更加合理。 -
所以最后的改良方法是将鉴别器和生成器的随机种子分别设置不同的范围,并加上之前的所有改良方法,是所有的组合效果。
-
最优BCE损失的理想损失值为ln2或0.693。
11.种子相加也会造成它们生成的图像的叠加。可以试一下种子实验。
-
模式崩溃就是指一个生成器在有多个可能输出类别的情况下,一直生成单一类别的输出。
-
分层数据格式:就是一个组里包含多个数据集,甚至多个组。
-
将这种在图像上移动并汇总新的网格的过程称为卷积。
卷积核将识别低层次特征,并将这些信息汇总在网格中。这些网格的正式名称是特征图。如果将另一层卷积核应用到这些特征图上,我们可以得到中层次的特征。这些特征是低层次的组合。 -
基本上,我们只需要决定使用几个卷积核,比如20个,在训练过程中,我们会对没个卷积核内部的权重进行调整。如果训练成功,最终得到的卷积核会从图像中挑出最有代表性的细节。
16.代码查看当前所分配的内存大小
torch.cuda.memory_allocated(device)/(1024*1024*1024)
代码查看内存消耗
print(torch.cuda.memory_summary(device,abbreviated=True))
-
机器学习的黄金法则是,最大限度地利用与当前问题相关的知识。这些领域知识可以帮助我们排除不成立的选项,从而简化问题空间。
-
应该构建最小的网络,这样训练起来比较容易,但不能小到失去学习能力。
-
遵循一个原则:生成器应该是鉴别器的镜像
-
卷积的反义词:转置卷积。需要调用的模块是nn.ConvTranspose2d
-
鉴别器的过程:
生成器的过程:
-
卷积网络中每一个特征的生成,都是在缺乏上层图像的完整视角的情况下进行的。
-
卷积生成器的一个缺点是,他可能生成由相互不匹配的元素组成的图像,这是因为卷积网络处理的信息是局部化的,而全局关系并没有被学习到。(很重要!!!!)
-
条件式GAN架构
1)将类型作为生成器输入的一部分,如同随机种子一样。
2)鉴别器的工作到了条件式架构上,就不只是将真实的图像与生成的图像分开,而且还要学习将类型标签与图像关联起来。不然它就无法向生成器提供反馈,生成器也就无法将图像与标签关联起来。这就意味着,我们需要将类型标签域图像一起输入鉴别器。