(Pytorch)nn.Dropout以及Dropout1d,Dropout2d,Dropout3d是什么意思

文章目录

      • 前言
      • nn.Dropout
      • 1/2/3d

前言

其实nn.Dropout并不是Dropout1d,Dropout2d,Dropout3d中任何一个的特例,他们应用场景并不相同,不是相互包含的关系。

nn.Dropout

我们用得最多的应该是第一个nn.Dropout,这个也是大家一般所默认的。即把输入随机置为0。

这里的输入可能是一个数,也可能是多个数,多个数可能会被组织成向量,矩阵,图片等等。nn.Dropout是对每一个数都来一次随机置为0。例如:

[1, 2]
dropout之后:
[0, 2]

再例如

[[1 2]
 [3 4]]
dropout之后:
[[1 0]
 [3 4]]

总之:是对每一个数都随机置为0。

1/2/3d

这个就不是对每一个数都随机置为0了,nn.Dropout是将输入看成由一个个数字组成,而这里呢?以2d为例,其是将输入看成由一个个矩阵组成。

由于其应用场景常常是图片,所以,Dropout2d要求我们的输入形状是如下:

[bsize,channel,height,weight]

其可以看成是bsize*channel个矩阵组成,现在我们的dropout就是针对这么多个矩阵进行随机置为0,一个矩阵一旦被挑选,那么这个矩阵所有元素都是0。

tensor([[[[ 0.8190,  0.9685,  2.1544],
          [ 0.1041,  2.7761,  0.6758],
          [-0.8275,  2.2277,  0.3848]]],


        [[[ 1.2271, -0.8530,  0.9684],
          [-1.8995,  1.6482, -0.6844],
          [-1.8486, -1.1970,  0.8213]]]])
dropout之后
tensor([[[[ 0.0000,  0.0000,  0.0000],
          [ 0.0000,  0.0000,  0.0000],
          [-0.0000,  0.0000,  0.0000]]],


        [[[ 2.4542, -1.7059,  1.9368],
          [-3.7990,  3.2963, -1.3688],
          [-3.6971, -2.3940,  1.6426]]]])

为啥要发明这种dropout呢?

As described in the paper Efficient Object Localization Using Convolutional Networks , if adjacent pixels within feature maps are strongly correlated (as is normally the case in early convolution layers) then i.i.d. dropout will not regularize the activations and will otherwise just result in an effective learning rate decrease.

In this case, nn.Dropout2d() will help promote independence between feature maps and should be used instead.

你可能感兴趣的:(Pytorch深入理解与实战,python,pytorch)