2017-12-01 3 views
1

私はPyTorchの新機能ですが、損失機能の計算時にターゲットと入力のサイズがtorch.nn.BCELoss()でどのように機能するかを理解しようとしています。PyTorch ValueError:ターゲットと入力の要素数が同じでなければなりません

import torch 
import torch.nn as nn 
from torch.autograd import Variable 

time_steps = 15 
batch_size = 3 
embeddings_size = 100 
num_classes = 2 

model = nn.LSTM(embeddings_size, num_classes) 
input_seq = Variable(torch.randn(time_steps, batch_size, embeddings_size)) 
lstm_out, _ = model(input_seq) 
last_out = lstm_out[-1] 
print(last_out) 

loss = nn.BCELoss() 
target = Variable(torch.LongTensor(batch_size).random_(0, num_classes)) 
print(target) 
err = loss(last_out.long(), target) 
err.backward() 

私は次のエラーを受け取りました:

Warning (from warnings module): 
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/torch/nn/functional.py", line 767 
"Please ensure they have the same size.".format(target.size(), input.size())) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/torch/nn/functional.py", line 770, in binary_cross_entropy 
"!= input nelement ({})".format(target.nelement(), input.nelement())) 
ValueError: Target and input must have the same number of elements. target nelement (3) != input nelement (6) 

このエラーは間違いなくlast_out(サイズ3×2)とターゲット(サイズ3)の種類のサイズから来ています。だから私の質問はどのようにlast_outを(3のサイズとちょうど0と1を含む)ターゲットのようなものに変換することができますか?

答えて

0

nn.BCELoss()のアイデアは、次の式を実現する:(!同じ)

enter image description here

ot両方は、二つのテンソルの各要素を計算するために、任意のサイズ及びi単にインデックスのテンソルであります上記の合計。 およびiは、N x Dの行列になります。 Nは、あなたのデータセットまたはミニデータベースの観測数になります。 Dは、単一のプロパティを分類しようとする場合は1になり、複数のプロパティを分類しようとする場合は1より大きくなります。 tは、ターゲット・マトリックスは0と1しか保持しません。すべてのプロパティーには、2つのクラスしかありません(バイナリー・クロスエントロピー・ロスのバイナリーが由来します)。 oは、すべての観測のすべてのプロパティをクラス1に割り当てる確率を保持します。

上記の設定では、いくつのクラスを検討しているのか、いくつのクラスがあるのか​​は不明です。 targetの形で提案されているプロパティが1つしかない場合は、単一の数量、つまりmodelからクラス1になる確率を出力する必要があります。 2つのプロパティがある場合、targetsは不完全です!複数のクラスがある場合は、torch.nn.BCELoss()の代わりにtorch.nn.CrossEntropyLossを使用する必要があります。

数値安定性のために、一部の出力での代わりにtorch.nn.BCEWithLogitsLossの代わりにnn.Sigmoid()を使用することがよくあります。

関連する問題