最近需要训练一个模型,在优化模型时用了dropout函数,为了减少过拟合。
训练的时候用dropout,测试的时候不用dropout。刚开始以为p是保留神经元的比率,训练设置0.5,测试设置1,loss根本没减小过,全设置成1也是一样的效果,后来就考虑到是不是p设置错了。
上网一搜,果然是的!!!p的含义理解错了!不是保留的,而是不保留的!
具体的代码为:
1
|
x2 = F.dropout(x1, p) |
x1是上一层网络的输出,p是需要删除的神经元的比例。
当p=0时,保留全部神经元更新。当p=1时,神经元输出的值都为0。
补充:Pytorch--Dropout笔记
dropout常常用于抑制过拟合,pytorch也提供了很方便的函数。但是经常不知道dropout的参数p是什么意思。
在TensorFlow中p叫做keep_prob,就一直以为pytorch中的p应该就是保留节点数的比例,但是实验结果发现反了,实际上表示的是不保留节点数的比例。
看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
|
a = torch.randn( 10 , 1 ) >>> tensor([[ 0.0684 ], [ - 0.2395 ], [ 0.0785 ], [ - 0.3815 ], [ - 0.6080 ], [ - 0.1690 ], [ 1.0285 ], [ 1.1213 ], [ 0.5261 ], [ 1.1664 ]]) |
p=0.5
1
2
3
4
5
6
7
8
9
10
11
|
torch.nn.Dropout( 0.5 )(a) >>> tensor([[ 0.0000 ], [ - 0.0000 ], [ 0.0000 ], [ - 0.7631 ], [ - 0.0000 ], [ - 0.0000 ], [ 0.0000 ], [ 0.0000 ], [ 1.0521 ], [ 2.3328 ]]) |
p=0
1
2
3
4
5
6
7
8
9
10
11
|
torch.nn.Dropout( 0 )(a) >>> tensor([[ 0.0684 ], [ - 0.2395 ], [ 0.0785 ], [ - 0.3815 ], [ - 0.6080 ], [ - 0.1690 ], [ 1.0285 ], [ 1.1213 ], [ 0.5261 ], [ 1.1664 ]]) |
p=1
1
2
3
4
5
6
7
8
9
10
11
|
torch.nn.Dropout( 0 )(a) >>> tensor([[ 0. ], [ - 0. ], [ 0. ], [ - 0. ], [ - 0. ], [ - 0. ], [ 0. ], [ 0. ], [ 0. ], [ 0. ]]) |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_44125720/article/details/103117556