2018-summer-DL-training-program / Lab-2-Image-Captioning

Image Captioning
1 stars 1 forks source link

Batch 尺寸與 DecoderRNN.forward() #4

Open pablosun opened 6 years ago

pablosun commented 6 years ago

助教好,

想請教關於 RNN batch size 的問題。

DecoderRNN.forward() 當中我們定義了輸出為 vocab_size 的最終 Linear output layer。就我的認知,這表示 decoder( input ) 的輸出,要麼是

但是,在 train.py 當中,我們計算 loss 的 criterion(output, target) 的 target 卻是一個 緊密排列的 vocabulary index 的 一維 tensor。

這樣兩邊的 dimension 感覺沒有辦法對應起來?為什麼 forward() 裡面最後不需要把 output 再轉回 vocabulary index呢?

還是我有什麼地方理解錯誤了呢? 請助教協助解惑,謝謝。

a514514772 commented 6 years ago

@pablosun ,

在 DecoderRNN.forward() 當中我們定義了輸出為 vocab_size 的最終 Linear output layer。就我的認知,這表示 decoder( input ) 的輸出,要麼是

[batch_size, vocab_size] (有 batch 的情況)

這是正確的。你可以想像這是一個物件辨識像lab1的task,目標有vocab_size這麼多種class,所以model prediction會有[batch_size, vocab_size],代表預測為每個class的機率。而targets只會有[batch_size],每個element會介於0到vocab_size-1表示正確的class index。

但是,在 train.py 當中,我們計算 loss 的 criterion(output, target) 的 target 卻是一個 緊密排列的 vocabulary index 的 一維 tensor。

該問題與pack_padded_sequence的作用有關,基本上可以想成所有timestep的batch,vectorize成一維。[bs, timestep, size] -> [bs*timestep, size]

這樣兩邊的 dimension 感覺沒有辦法對應起來?為什麼 forward() 裡面最後不需要把 output 再轉回 vocabulary index呢?

該問題與第一題的回答有關,至於如何轉成機率跟nn.CrossEntropyLoss()有關,請見pytorch document。

TA

a514514772 commented 6 years ago

該問題與pack_padded_sequence的作用有關,基本上可以想成所有timestep的batch,vectorize成一維。[bs, timestep, size] -> [bs*timestep, size]

補充一下這裡[bs*timestep, size]的時候會把padding的部分去掉,所以其實size不會真的是bs*timestep