• 【机器学习】Dropout


    Dropout

    随机失活

              

                       dropout前                                                 dropout后

    Training时,加在每次update参数前。貌似一般多用在FC层,CNN层也可以用,不过也不是必须的。因为FC参数多。

    网上查的说,一般都是在FC层用dropout。一般不用于卷积层,因为在卷积层中图像相邻像素共享很多相同信息,如某些被删除,它们包含的信息仍可通过其他仍活动的相邻像素传递。简而言之,就是在CNN层加了也没用。

    所以卷积层中的dropout只是增加了对噪声输入的鲁棒性,而不是在全连接层中观察到的模型平均效果。

    在【实作】food-11中实验了一下,在这个例子下,CNN中用或不用确实没有显著提升。

    使用方法如下:

    self.cnn = nn.Sequential(
                nn.Conv2d(3, 64, 3, 1, 1), #[64, 128, 128]
                nn.BatchNorm2d(64),
                nn.Dropout(0.1),
                nn.ReLU(),
                nn.MaxPool2d(2, 2, 0), #[64, 64, 64]
                
                .....,     
                )
    
    self.fc = nn.Sequential(
                nn.Linear(512*4*4, 1024),
                nn.Dropout(0.3),
                nn.ReLU(),
                nn.Linear(1024, 512),
                nn.Dropout(0.3),
                nn.Linear(512, 11)
            )    
    View Code
    • Each neuron都有p%的概率被dropout. 被舍去的神经元的输出全部被设置为0.
    • 网络结构会变得更加细长
    • 相当于使用新的network来训练。For each mini-batch, training的network是不一样的。

    所以加dropout后,

    training时的performance会变差,但testing会变好。

    如果training本身就很差,那么会更差。

    为什么testing会变好?

    1)减少神经元之间的共适应关系:阻止了某些特征仅在有其他特定特征下才有效的情况。减少对某些神经元的强依赖,迫使神经网络学习更加鲁棒的特征。

    2)Dropout可以看成是一种ensemble。每次sample一部分出来,相当于:

      train很多个model,再综合起来。像random forest。

      终极emsemble: M neurons -> 2M possible networks ( neurons drop or not drop)

      using one mini-batch to train one network, 参数share

  • 相关阅读:
    Objective-C学习笔记2013(Category 扩展(类目)/分类)(4)
    Objective-C学习笔记(static,self,super)
    Objective-C学习笔记2013(3)[NSArray]数组[在可变数组中,加用add减用remove]
    Objective-C学习笔记2013(2)[NSNumber]
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
    C语言学期总结
    第一次作业
  • 原文地址:https://www.cnblogs.com/YeZzz/p/13092926.html
Copyright © 2020-2023  润新知