webdevqa.jp.net

PyTorchのマルチ出力回帰問題のRMSE損失

出力が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()を間違って使用しているかどうかはわかりません。

2
cronin

デフォルトの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の損失関数と同様に呼び出すことができます。

0