前提・実現したいこと
torch.nn.RNN
(LSTMではなく)を用いて系列ラベリングモデルを作成したいのですが、lossの計算の方法が分かりません。
タイプステップ毎にそれぞれCrossEntropyLossを計算し、総和を計算してパラメータ更新したいのですが、どのように実装するのでしょうか?
以下のように書いてみたのですが、エラーが発生しました。
該当のソースコード
python
1# Bidirectional recurrent neural network 2class BiRNN(nn.Module): 3 def __init__(self, input_size, hidden_size, num_layers, num_classes): 4 super(BiRNN, self).__init__() 5 self.hidden_size = hidden_size 6 self.num_layers = num_layers 7 self.embedding = nn.Embedding(word_vocab_size, word_vec_size, padding_idx=0) 8 self.rnn = nn.RNN(input_size, hidden_size, num_layers, bidirectional=True) 9 self.linear = nn.Linear(hidden_size*2, num_classes) 10 11 def forward(self, input, hidden): 12 input_embedded = self.embedding(input) # [batch_size * seq_len * vector_size] 13 input_embedded = torch.transpose(input_embedded, 0, 1) # [seq_len * batch_size * vector_size] 14 output, hidden = self.rnn(input_embedded, hidden) 15 output = self.linear(output) 16 output = F.softmax(output, dim=2) 17 return output, hidden
python
1batch_size = 5 2seq_len = 20 3hidden_size=200 4model = BiRNN(input_size=300, hidden_size=hidden_size, num_layers=2, num_classes=7) 5input = torch.randn(batch_size, seq_len) # input data 6label = torch.randn(seq_len, batch_size) # label data 7h0 = torch.randn(4, batch_size, hidden_size) 8output, hidden = model(batch, h0) # 疑問:このoutput,hiddenは最終状態のもの?? 9 10criterion = nn.CrossEntropyLoss() 11optimizer = torch.optim.Adam(model.parameters(), lr=0.1) 12loss = criterion(output, label) # ERROR
発生している問題・エラーメッセージ
ValueError: Expected target size (20, 7), got torch.Size([20 , 5])
各タイムステップ(t0~t19)の出力に対してそれぞれ正解ラベルと比較しlossをかけるには、どのような実装が必要なのでしょうか。
よろしくお願いいたします。
あなたの回答
tips
プレビュー