改良网络的方法:

1.更改损失函数:将均方差损失函数MSELoss() 更改为 BCEloss。更改后测试数据集的性能分(准确率)从87%提高到91%。但下降速度较MSELoss慢,且噪声更大。

2.更改激活函数:S型激活函数的缺点是:在输入值变大时,梯度会变得非常小甚至消失。这意味着,在训练神经网络时,如果发生这种饱和,我们无法通过梯度来更新链接权重。

pytorch的ssim函数 pytorch slam_pytorch

可选用直线作为激活函数,直线的固定梯度是永远不会消失的

pytorch的ssim函数 pytorch slam_pytorch_02

pytorch的ssim函数 pytorch slam_pytorch_03

3.改良反向传播梯度更新网络权重的方法。

随机梯度下降的缺点之一是,它会陷入损失函数的局部最小值(local minima)

另一个缺点是,它对所有可学习的参数都使用单一的学习率。

最常见的代替优化器是Adam,它直接解决了以上两个缺点。首先,它利用动量(momentum)的概念,减少陷入局部最小值的可能性。同时,它对每个可学习参数使用单独的学习率,这些学习率随着每个参数在训练期间的变化而改变.

4.假设我们用一个被训练用于生成图像的神经网络,取代之前只能用于生成低质量图像的组件。我们称它为生成器(G ).同时,我们把分类器称为鉴别器(D)。

鉴别器的作用是把真实的图像和生成的图像区分开。如果生成器表现不佳,区分工作很容易通过。如果训练生成器,它的表现会越来越好,并且生成越来越逼真的图像。

如何训练生成器。训练的关键在于,我们希望奖励哪些行为,惩罚哪些行为。这也正是损失函数的作业。

如果图像通过了鉴别器的检验,我们就奖励生成器。

如果伪造的图像被识破,我们惩罚生成器。

下面的三步训练循环是实现这一目标的一种方法。

第1步——向鉴别器展示一个真实的数据样本,告诉它该样本的分类应该是1.我们再用损失来更新鉴别器。

pytorch的ssim函数 pytorch slam_机器学习_04

 

第2步——训练鉴别器。向鉴别器显示一个生成器的输出,告诉它该样本的分类应该是0。我们只用损失来更新鉴别器。在这一步我们不要更新生成器。因为我们不希望它因为被鉴别器识破而受到奖励。在编写GAN的代码时,我们要考虑如何防止更新通过计算图回到生成器。

pytorch的ssim函数 pytorch slam_pytorch_05

 

第3步——训练生成器。向鉴别器显示一个生成器的输出,告诉生成器结果应该是1.我们只用结果的损失来更新生成器,而不更新鉴别器。因为我们不希望因为错误分类而奖励鉴别器。

pytorch的ssim函数 pytorch slam_pytorch_06

我们希望生成器和鉴别器是共同学习的,而不是一方快,或者是一方慢。

标准的GAN训练循环有3个步骤。

(1)用真实的训练数据集训练鉴别器;

(2)用生成的数据训练鉴别器;

(3)训练生成器生成数据,并使鉴别器以为它是真实数据。