出力が20値のテンソルであるPyTorchを使用して回帰問題を解決するためにCNNアーキテクチャをトレーニングしています。私はモデルの損失関数としてRMSEを使用することを計画し、PyTorchのnn.MSELoss()
を使用しようとし、そのためにtorch.sqrt()
を使用して平方根を求めましたが、結果を取得した後、混乱しました。その理由を説明するために最善を尽くします。バッチサイズbs
の場合、出力テンソルの次元は_[bs , 20]
_になることは明らかです。独自のRMSE関数を実装しようとしました:
_ def loss_function (predicted_x , target ):
loss = torch.sum(torch.square(predicted_x - target) , axis= 1)/(predicted_x.size()[1]) #Taking the mean of all the squares by dividing it with the number of outputs i.e 20 in my case
loss = torch.sqrt(loss)
loss = torch.sum(loss)/predicted_x.size()[0] #averaging out by batch-size
return loss
_
しかし、私のloss_function()
の出力と、PyTorchがnn.MSELoss()
でそれを実装する方法は異なりました。私の実装が間違っているかどうか、またはnn.MSELoss()
を間違って使用しているかどうかはわかりません。
デフォルトのPyTorchのMSE(平均二乗誤差)損失関数を複製するには、loss_function
メソッドを次のように変更する必要があります。
def loss_function (predicted_x , target ):
loss = torch.sum(torch.square(predicted_x - target) , axis= 1)/(predicted_x.size()[1])
loss = torch.sum(loss)/loss.shape[0]
return loss
上記の方法が機能する理由は次のとおりです。MSE損失とは、平均二乗誤差損失を意味します。したがって、コードに平方根(torch.sqrt
)を実装する必要はありません。デフォルトでは、PyTorchの損失は、損失を計算するためにバッチ内のすべての例の平均を行います。したがって、メソッドの2行目です。
RMSELossを実装してトレーニングに統合するには、次のようにします。
class RMSELoss(torch.nn.Module):
def __init__(self):
super(RMSELoss,self).__init__()
def forward(self,x,y):
criterion = nn.MSELoss()
loss = torch.sqrt(criterion(x, y))
return loss
そして、このクラスをPyTorchの損失関数と同様に呼び出すことができます。