GAN 对抗神经网络中遇到的问题

网络的设计

Discriminator
Discriminator(
  (main): Sequential(
    (0): Conv2d(3, 64, kernel_size=(5, 5), stride=(3, 3), padding=(1, 1), bias=False)
    (1): LeakyReLU(negative_slope=0.2, inplace=True)
    (2): Conv2d(64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
    (3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (4): LeakyReLU(negative_slope=0.2, inplace=True)
    (5): Conv2d(128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
    (6): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (7): LeakyReLU(negative_slope=0.2, inplace=True)
    (8): Conv2d(256, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
    (9): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (10): LeakyReLU(negative_slope=0.2, inplace=True)
    (11): Conv2d(512, 1, kernel_size=(4, 4), stride=(1, 1))
    (12): Sigmoid()
  )
)
Generator 刚好于 Discriminator 相反

Vector --> Generator — > image
image — Discriminator —> Vector

损失函数 为啥会选取 BCELOSS

BCELoss 是一个二分类 分类器
使用nn.BCELoss需要在该层前面加上Sigmoid函数
使用nn.CrossEntropyLoss会自动加上Sofrmax层。
参考博客 点击跳转

BatchNorm2d

我们将输入的 feature map shape 记为[N, C, H, W],其中N表示batch size,即N个样本;C表示通道数;H、W分别表示特征图的高度、宽度。这几个方法主要的区别就是在:

  1. BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;
  2. LN在通道方向上,对C、H、W归一化,主要对RNN效果明显
  3. IN在图像像素上,对H、W做归一化,用在风格化迁移;
  4. GN将channel分组,然后再做归一化。
t.load

**torch.load(f, map_location=None, pickle_module=<module ‘pickle’ from ‘/opt/conda/lib/python3.6/pickle.py’>, pickle_load_args)

torch.load('tensor.pt)
#load all tensors to cpu
torch.load("tensor.pt",map_location= torch.device("cpu"))
#load all tensor to cpu  using a function
torch.load("tensor.pt",map_location = lambda storage, loc :storage)
#load all tensor onto gpu1
torch.load("tensor.pt",map_location = lambda storage,loc:storage.cuda(1)
t.save()

t.save(model.save_dict(),“path”)

torch.nn.drop()

drop是用来解决神经网络中过拟合的问题,因为数量集不多时,网络参数较大时,训练样本带来误差影响大,因此在每一层神经网络中引入dropout,具体的实现过程是在每次更新参数的过程中,随机的剔除掉部分(按照比例参数p)神经元,不对其参数进行更新

dropout为什么能够有效解决overfitting的问题?

取平均的作用: 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。(例如 3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果)。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合

减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。 迫使网络去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。(这个角度看 dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高)

参考链接 https://www.jianshu.com/p/ef2a7a78aa83

net().train 和 net().eval() 两种模式是一样的只有当 网络层中出现 normal,dropout() 两者才有区别,训练时为了使网络拥有更大的精度,所以使用noraml,dropout 而在测试的时候这需要关掉,因为我们的目的是为了测试训练好的网络而不是训练网络

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章