生活随笔
收集整理的這篇文章主要介紹了
dropout理解(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本節使用的pytorch版本為1.8.1,其中的torch.nn.functional函數中的dropout方法中的參數training默認為True:
下面進入正文,首先創建一個簡單的模型:
import torch
import torch
.nn
as nn
import torch
.nn
.functional
as F
class LinearFC(nn
.Module
):def __init__(self
):super(LinearFC
, self
).__init__
()self
.fc
= nn
.Linear
(3, 2)def forward(self
, input):out
= self
.fc
(input)out
= F
.dropout
(out
, p
=0.5, training
=self
.training
)return outNet
= LinearFC
()
x
= torch
.randint
(10, (2, 3)).float()
Net
.train
()
output
= Net
(x
)
print(output
)
網絡模型很簡單,就是一個線性結構,然后加上一個dropout。
下面一步一步執行:
這里創建了模型Net,Net的對應的參數如下:
Net.fc.weight=tensor([[-0.2141, -0.0099, 0.3015],[-0.4614, -0.1297, 0.3278]], requires_grad=True)
Net.fc.bias=tensor([ 0.5359, -0.3696], requires_grad=True)
Net.training=True
隨機生成不大于10的整數,轉為float, 因為nn.linear需要float類型數據,x的數據內容如下:
x=tensor([[5., 1., 6.],[9., 5., 9.]])
Net.train()的作用是將Net.training=True,如果是在test階段,需要執行Net.eval(),這時Net.training=False接下來要進入網絡模型中的forward了:
這里的out的結果的含義是計算x×WT+bx \times W^T+bx×WT+b,相當于執行torch.mm(x, Net.fc.weight.t()) + Net.fc.bias,從控制臺中可以看出這兩個的執行結果一樣。
接下來將執行dropout,因為當前self.training=True,所以將執行dropout,out的執行結果相當于執行(torch.mm(x, Net.fc.weight.t()) + Net.fc.bias)/(1-0.5),然后以0.5概率去除:
可以看出:
去除前:
tensor([[ 2.5288, -1.6790],[ 2.5452, -4.4408]], grad_fn=<DivBackward0>)
以0.5概率去除后:
tensor([[2.5288, -0.0000],[0.0000, -0.0000]], grad_fn=<MulBackward0>)
返回結果,執行完畢。
如果是test階段,也就是開啟Net.eval()
在執行Net.eval()之前,Net.training=Ture,當執行Net.eval()之后,Net.training=False
然后進入到forward中,執行x×WT+bx \times W^T+bx×WT+b
接下來要準備進入dropout了,但是由于self.traing=Flase所以這一步將不會執行,也就是說,不會執行(torch.mm(x, Net.fc.weight.t()) + Net.fc.bias)/(1-0.5)以及去除操作。而是直接對torch.mm(x, Net.fc.weight.t()) + Net.fc.bias結果進行返回:
總結
在模型中定義好F.dropout(out, p=0.5, training=self.training),根據訓練階段和測試階段傳入的參數Model.training來判斷是否執行dropout。
如果寫成F.dropout(out, p=0.5),那么參數默認training=True,就無法在測試階段正確跳過dropout了。
總結
以上是生活随笔為你收集整理的dropout理解(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。