Dropout

请问第六问,为什么把dropout放到relu前面后会这样啊
upload

1 Like

这个是不是随机出现的?我试了几次没有发生这种情况哎 按理说放前后是一样的 你再试试Snipaste_2021-11-09_12-54-19

2 Likes

Q1,做出来的结果,在调换D1和D2层概率后,基本没有什么变化,但是改变第一层和第二层的概率总和后,结果会有明显的变化,猜想是在概率总和一样的情况下,不会对最后的准确率造成太大的影响?(对此我不太敢相信我的结论,希望大家指点)
Q2,没有dropout的训练效果会更好,但是泛化性不够好。
Q3,没画出来,求大佬帮助实现代码
Q4,因为测试的时候更关注整个模型的泛化度
Q5,同时使用效果反而会变差
Q6,train_loss会下降的比较慢,达不到原本的train_loss。

2 Likes

请问自己实现Net类里,def 的forward()函数是怎样被调用的?在训练的代码里没有找到调用,但是实际训练时却被运行了

3 Likes

自己实现的Net类继承了nn.Module类,这是PyTorch中所有网络的父类。在nn.Module中有一个__call__()方法,它相当于C++中的重载()运算符,当我们执行 类名() 这种样式的语句时就会调用__call__(),而在该方法中就有调用forward()。在自定义Net类中我们def的forward()相当于重载了父类nn.Module中的forward()方法,同时自定义Net类也继承了父类的__call__(),因此在执行Net(input)这样的语句时Net类的__call__()被调用,连带着其中的forward()也被调用了,表现出来的就是使用Net(input)forward()被运行。

参考链接: https://blog.csdn.net/weixin_41912543/article/details/108147378

15 Likes

为什么不显示图片,而是<Figure size 350x250 with 1 Axes>

如果用VS,加一条:d2l.plt.show(),就会显示图片结果。

1 Like

Exercise1:
原始图
4.6.6_exercise1_figure2_original
交换概率


dropout1, dropout2 = 0.5, 0.2 明显比dropout1, dropout2 = 0.2,0.5 好些, 后者Gap在后期训练时增加(过拟合)。

Exercise2: Adding Epoch to 30
没有Dropout


有Dropout

后者比前者好,前者有明显gap (过拟合)

1 Like

您好,有没有简单的方法,将现在这个程序改到GPU上面运行呢,我修改了模型.to.cuda,但是数据改不过去,经过调试发现模型在gpu上面,但是数据不知道如何修改,我确保CUDA是可用的,其他代码已经试验过

在交换概率的时候并没有发生明显的变化,你的是不是可接受误差范围内?

1 Like

对模型训练和测试,出现报错:
RuntimeError: DataLoader worker (pid(s) 12512, 9888, 10924, 12184) exited unexpectedly

请问如何处理

为啥我没有train loss 的曲线啊

我可不可以理解,暂退法是在复杂模型计算时,降低模型的复杂性,从而降低过拟合的可能性

2 Likes

在自定义的 dropout_layer

mask = (torch.rand(X.shape) > dropout).float()

使用如下:

mask = torch.where(torch.rand(X.shape) > dropout, 1.0, 0.0)

或更直观?

class Net(nn.Module)

if self.training == True:
    pass

直接写成:

if self.training:
    pass

或可?

1 Like

net = nn.Sequential(nn.Flatten(),
nn.Linear(784,256),
nn.ReLU(),
# 在第一个全连接层之后添加一个dropout层
nn.Dropout(dropout1),
nn.Linear(256,256),
nn.ReLU(),
# 在第二个全连接层之后添加一个dropout层
nn.Dropout(dropout2),
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128,10),
)
老师同学们好,我把两个隐藏层改成三个隐藏层,想请问一下:
1.为什么第一次运行和第二次运行差别这么大?
2.怎么修改图片的坐标轴啊?第一次的结果loss和acc的初始值都不在图片之内?
非常感谢!!!
第一次:

image

第二次运行结果:
image

前面的章节有提过在初始化时偏置的初始化一般为0

1 Like

我个人的理解权重衰减法是降低模型的复杂性,因为如果模型越复杂,也就是阶数越高,L2范数正则项就会越大,这种方法使得阶数越高权重衰减越快,从而减低模型的复杂性。

而暂退法我认为实际上可以理解是一种脱敏法,也就是说你的输出结果不能完美拟合所有的输入,换句话说你的拟合效果不能对于每个数据都过分敏感。这种过分敏感会导致过拟合。因此加入Dropout层,在每一次遍历你的数据的时候,模型不会完全依靠所有神经元的激活结果进行调整,而是扔掉其中的一部分,用新的神经元组合来进行拟合。就像书中说的,暂退法的核心理念其实是加入噪声,从而增加模型的平滑度。

9 Likes

将dropout1和dropout2的概率值互换后(0.5, 0.2)感觉差别不是很大(当次数为8)

2 Likes

这是因为你在第一训练的基础上进行了第二次训练,这就会导致你的结果会继续上一次的模型参数进行继续训练,如果你想得到和第一次训练一样的结果,那就把参数重新初始化一下,然后在进行训练

2 Likes