yfc1613
@yfc1613

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

LSTMを用いた回帰モデル実装における0D or 1D target tensor expected, multi-target not supportedというエラーについて

解決したいこと

LSTMを用いて株価予測するモデルを作りたいと思っています。
実装中に下記のエラーが発生し、解決方法がわからなかったため教えていただけますと幸いです。
初心者のため、回答するために不足している情報等がありましたらご指示ください!

発生している問題・エラー

RuntimeError: 0D or 1D target tensor expected, multi-target not supported

該当するソースコード

class Net(pl.LightningModule):
    def __init__(self):
        super().__init__()
        
        self.lstm = nn.LSTM(7,10)
        self.fc = nn.Linear(10,1)

    def forward(self, x):
        x =x.contiguous().view(x.size(1), x.size(0), 7)
        out, (h_n, c_n) = self.lstm(x)

        h = h_n.contiguous().view(h_n.size(1), -1)
        h = self.fc(h)
        return h

    def training_step(self, batch, batch_idx):
        x, t = batch
        y = self(x)
        t = t.squeeze_()
        loss = F.cross_entropy(y, t)
        self.log('train_loss', loss, on_step=True, on_epoch=True, prog_bar=True)
        self.log('train_acc', accuracy(y.softmax(dim=1), t), on_step=True, on_epoch=True, prog_bar=True)
        return loss

    def validation_step(self, batch, batch_idx):
        x, t = batch
        y = self(x)
        t = t.squeeze_()
        loss = F.cross_entropy(y, t)
        self.log('val_loss', loss, on_step=False, on_epoch=True)
        self.log('val_acc', accuracy(y.softmax(dim=1), t), on_step=False, on_epoch=True)
        return loss

    def test_step(self, batch, batch_idx):
        x, t = batch
        y = self(x)
        t = t.squeeze_()
        loss = F.cross_entropy(y, t)
        self.log('test_loss', loss, on_step=False, on_epoch=True)
        self.log('test_acc', accuracy(y.softmax(dim=1), t), on_step=False, on_epoch=True)
        return loss

    def configure_optimizers(self):
        optimizer = torch.optim.SGD(self.parameters(),lr=0.01)
        return optimizer

自分で試したこと

しっかりと理解はしていないのですが、似たような事例の解決方法かとおもって下記のURL記載の方法を行いましたが解決できませんでした。
https://stackoverflow.com/questions/49206550/pytorch-error-multi-target-not-supported-in-crossentropyloss/49209628
具体的には、

 loss = F.cross_entropy(y, t)

ここの実行前に
t = t.squeeze_()
を入力しました。
(正直理屈がわかっていないのですが、このコードも不要なんでしょうか?)

0

1Answer

forwardの一行目が違うんじゃないでしょうか
viewはtensorの形を変更する関数で元の大きさと違うものは作れません
xの行列サイズを確認されたほうがいいです

それとコードが無茶苦茶すぎます

まず初っ端からxの形を変更しているのは何故ですか?
t(教師データかな?)をsqueeze_するのも何故ですか?
squeeze_は1つしかない次元を削除する関数です
データに合ったnnにするかデータを整形してから入れましょう

LSTMはRNNです
hは次回のRNNで使用するパラメータです
それを推論しても良いモデルはできません 意図があったとしても間違っています

設計、ファイル構造を見直しましょう 極めて見にくいです
普通にnn.Moduleでnnを設計されたほうが良いと思います
pl.LightningModuleは玄人向けです
文献も少ないですし初心者にそこまでの拡張性は必要ありません

もう少し勉強されてからコードを書いたほうが良いかと思います
書籍で全結合層、内積、誤差逆伝搬を学ばれると理解が早いと思います

0Like

Your answer might help someone💌