應最近的課程實驗要求,要做lstm和gru的實驗效果對比。lstm的使用和gru十分相似,歡迎參考我的另外一篇介紹搭建雙向gru的blog:
參考pytorch介紹lstm的官方文件:
其中其定義層時的引數宣告方法與gru完全一致:
所以,我定義lstm使用以下**:
torch.nn.lstm(out_channels, hidden_size, n_layers, batch_first=
true
,bidirectional=self.bidirectional)
最關鍵的地方來了,那就是lstm在做forward計算時要求輸入的引數列表和gru是不一樣的!
在官方文件中gru的輸入格式如下:
它只需要 input以及所有gru單元的初始隱藏層狀態
但是對於lstm來說,還需要所有cell的初始狀態,與初始隱藏層狀態構成乙個二元組進行輸入,這是因為lstm這個神經網路結構的引數是比gru要多的,具體的可以去學習下兩者架構的區別,在此就不做具體介紹了。lstm的輸入格式如下:
所以,我們來看看gru與lstm做forward時的**區別:
# lstm
output,
(hidden, cell_state)
= self.lstm(pooled,
(hidden,hidden)
)# gru
output, hidden = self.gru(word_inputs, hidden)
class
homornetv3
(torch.nn.module)
:def
__init__
(self, input_dim,hidden_size, out_size, n_layers=
1, batch_size=
1,window_size=
3,out_channels=
200,bidirectional=
true):
super
(homornetv3, self)
.__init__(
) self.batch_size = batch_size
self.hidden_size = hidden_size
self.n_layers = n_layers
self.out_size = out_size
self.out_channels = out_channels
self.bidirectional = bidirectional
# convolute the word_vectors first
self.conv = nn.conv2d(in_channels=
1, out_channels=out_channels,kernel_size=
(window_size, input_dim)
) self.conv2 = nn.conv2d(in_channels=
1, out_channels=out_channels,kernel_size=(20
, input_dim)
)# 這裡指定了 batch first
# then put it into gru layers
self.lstm = torch.nn.lstm(out_channels, hidden_size, n_layers, batch_first=
true
,bidirectional=self.bidirectional)
# 加了乙個線性層,全連線
if self.bidirectional:
self.fc1 = torch.nn.linear(hidden_size*2,
200)
else
: self.fc1 = torch.nn.linear(hidden_size,
200)
# output_layer
self.fc2 = torch.nn.linear(
200, out_size)
defforward
(self, word_inputs, hidden)
:# hidden 就是上下文輸出,output 就是 rnn 輸出
#print("word_inputs",word_inputs.shape)
embedded = word_inputs.unsqueeze(1)
feature_maps1 = self.conv(embedded)
feature_maps2 = self.conv2(embedded)
feature_maps = torch.cat(
(feature_maps1,feature_maps2),2
) pooled = self.pool_normalize_function(feature_maps)
#print("pooled",pooled)
output,
(hidden, cell_state)
= self.lstm(pooled,
(hidden,hidden)
)#print("gruoutput",output.shape)
output = self.fc1(output)
output = self.fc2(output)
# 僅僅獲取 time seq 維度中的最後乙個向量
# the last of time_seq
output = output[:,
-1,:
]#print("beforesoftmax",output.shape)
output = f.softmax(output,dim=1)
print
("output"
,output)
return output, hidden
definit_hidden
(self)
:# 這個函式寫在這裡,有一定迷惑性,這個不是模型的一部分,是每次第乙個向量沒有上下文,在這裡撈乙個上下文,僅此而已。
if self.bidirectional:
hidden = torch.autograd.variable(torch.zeros(
2*self.n_layers, self.batch_size, self.hidden_size, device=
'cuda'))
else
: hidden = torch.autograd.variable(torch.zeros(self.n_layers, self.batch_size, self.hidden_size, device=
'cuda'))
return hidden
defpool_normalize_function
(self,feature_maps)
:''' pool the vector '''
feature_maps = feature_maps.squeeze(3)
feature_maps = f.relu(feature_maps)
pooled = f.max_pool1d(feature_maps,2)
pooled = pooled.permute(0,
2,1)
# 轉置矩陣
normalized = f.normalize(pooled,p=
2,dim=2)
#normalized = normalized.unsqueeze(2)
return normalized
深度學習 PyTorch實戰計算機視覺2
搭建的模型是否發生過擬合或者欠擬合可作為評價模型擬合程度好壞的指標。欠擬合和過擬合地模型 新資料地準確性都不理想,最顯著的區別就是欠擬合的模型對已有資料地匹配性很差,但是對雜訊不敏感 而過擬合的模型對資料的匹配性太好,對雜訊很敏感。舉例 上圖為已有的房屋面積與 的關係資料。上圖就是乙個欠擬合模型。雖...
利用pytorch進行深度學習(2)
一 資料集 面對問題的時候,我們已知的資料集可以被用來測試,訓練模型,然後再利用模型對未知的資料集來進行推理 其中在學習的時候我們知道輸出的結果,可以通過結果來對模型進行糾正,這種學習過程叫做監督學習。在監督學習的過程中我們可獲得的已知的資料集被分為測試集和訓練集,其中測試集的資料在訓練過程中不能使...
pytorch 深度學習
pytorch深度學習實踐 訓練集 開發集 模型評估 測試集。f x wx b f x wx b f x w x bloss 乙個樣本 cost mean square error training set 區域性最優,不一定全域性最優。鞍點 梯度為0,但無法繼續迭代。w w c ost ww w ...