Dropout

https://zh-v2.d2l.ai/chapter_multilayer-perceptrons/dropout.html

请问在init_weights中,为什么只对weight初始化而没对bias进行初始化呢?

请问 dropout 公式那里,对于h,为什么要除以一个1-p.
对应的原文是“通过按保留(未丢弃)的节点的分数进行归一化来消除每一层的偏差”。
该如何理解?

1 Like

参考一下nn.Linear()的文档,这个函数自动会对w和b进行uniform的初始化。这里是想要把w改成高斯分布才特意强调的。

1 Like

按照老师的视频的说法,是为了保持期望一致。所以除以1-p

那在实际的使用中, 如果没有特殊的要求, 其实都不需要对 wb 进行初始化?

不,实际使用中,你对weight初始化换成xavier可能都会有20%的精度提升,工程中使用合适的初始化很重要。

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

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

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

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

自己实现的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