

環境はcolabを使っています。  
pytorch自然言語処理プログラミングという本で勉強しているのですがエラーが出て解決できません。outputとyのバッチサイズが違うということだと思うのですがどちらも97で揃っていると思います。またどうして1183回目までは問題なかったのに1184回目でエラーが起きるのでしょうか。丸一日考えましたが訳がわかりません。どうかご回答よろしくお願いいたします。

[code]

    class MyLSTM(nn.Module):
        def __init__(self, vocsize, posn, hdim):
            super(MyLSTM, self).__init__()
            self.emdb = nn.Embedding(vocsize, hdim)
            self.lstm = nn.LSTM(hdim, hdim, batch_first=True)
            self.ln = nn.Linear(hdim, posn)
        def forward(self, x):
            ex = self.emdb(x)
            lo = self.lstm(ex)
            lo = lo[0]
            out = self.ln(lo)
            return out
    
    net = MyLSTM(len(dic)+1, len(labels),100)#len(dic)+1で+1がないとエラーになる
    optimizer = optim.SGD(net.parameters(), lr=0.01)
    criterion = nn.CrossEntropyLoss()
    
    for ep in range(10):
        loss1k = 0.0
        for i in range(len(xdata)):
            x = [xdata[i]]
            x = torch.LongTensor(xdata[i]).to(device)
            output = net(x)
            print(f'{ep} {i}')
            y = torch.LongTensor(ydata[i]).to(device)
            loss = criterion(output,y)
            print(output.shape)
            print(y.shape)
            if (i % 1000 == 0):
                print(i,loss1k)
                loss1k = loss.item()
            else:
                loss1k += loss.item()
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
        outfile = 'lstm0-' + str(ep) + '.model'
        torch.save(net.state_dict(),outfile)
    
[/code]

出力

[code]

    0 0
    torch.Size([25, 16])
    torch.Size([25])
    0 0.0
    0 1
    torch.Size([50, 16])
    torch.Size([50])
    ----------省略-------------
    torch.Size([19, 16])
    torch.Size([19])
    0 1181
    torch.Size([28, 16])
    torch.Size([28])
    0 1182
    torch.Size([16, 16])
    torch.Size([16])
    0 1183
    torch.Size([97, 16])
    torch.Size([97])
    0 1184
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-22-955d5dbf2b55> in <module>
          9         print(f'{ep} {i}')
         10         y = torch.LongTensor(ydata[i]).to(device)
    ---> 11         loss = criterion(output,y)
         12         print(output.shape)
         13         print(y.shape)
    
    ------------------------------   2 frames -------------------------------------------------------------------------------------------------
    /usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in cross_entropy(input, target, weight, size_average, ignore_index, reduce, label_smoothing)
       3012     if size_average is not None or reduce is not None:
       3013         reduction = _Reduction.legacy_get_string(size_average, reduce)
    -> 3014     return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing)
       3015
       3016
    
    ValueError: Expected input batch_size (67) to match target batch_size (16).
    
[/code]

![1](https://i.stack.imgur.com/PZNB7.png)  
![2](https://i.stack.imgur.com/R2c09.png)  
![ネットワークの定義](https://i.stack.imgur.com/eAKSe.png)


CC BY-SA 4.0
2022-09-14T03:56:52.207
91095
2023-01-22T05:28:07.133
2022-09-15T10:08:32.920
26370
54387
question
python 機械学習 深層学習 google-colaboratory
Expected input batch_size (67) to match target batch_size (16)のエラーを直したい


時間も経過しており解決済みかもしれませんが御参考です。  
[PyTorch自然言語処理プログラミング ](https://book.impress.co.jp/books/1119101184) の
ZIPファイルを `data_nlp` ディレクトリに展開（解凍）して，Google Colab(GPU使用，Python 3.8.10, torch
1.13.1+cu116) で下記を実行しましたがエラーは生じませんでした。  
このことから，解析するデータに瑕疵がある可能性もあります。とりあえず，`print(output.shape)` と `print(y.shape)` を
`loss = criterion(output,y)` の前に移動してから実行しエラー出力を確認ください。

[code]

    import torch
    from torch import nn
    from torch import optim
    import pickle
    
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
    with open('data_nlp/Chapter3/LSTM/dic.pkl','rb') as f:
        dic = pickle.load(f)
    
    labels = {'名詞': 0, '助詞': 1, '形容詞': 2,
         '助動詞': 3, '補助記号': 4, '動詞': 5, '代名詞': 6,
         '接尾辞': 7, '副詞': 8, '形状詞': 9, '記号': 10,
         '連体詞': 11, '接頭辞': 12, '接続詞': 13,
         '感動詞': 14, '空白': 15}
    
    with open('data_nlp/Chapter3/LSTM/xtrain.pkl','rb') as f:
        xdata = pickle.load(f)
    
    with open('data_nlp/Chapter3/LSTM/ytrain.pkl','rb') as f:
        ydata = pickle.load(f)
    
    
    class MyLSTM(nn.Module):
        def __init__(self, vocsize, posn, hdim):
            super(MyLSTM, self).__init__()
            self.emdb = nn.Embedding(vocsize, hdim)
            self.lstm = nn.LSTM(hdim, hdim, batch_first=True)
            self.ln = nn.Linear(hdim, posn)
    
        def forward(self, x):
            ex = self.emdb(x)
            lo = self.lstm(ex)
            lo = lo[0]
            out = self.ln(lo)
            return out
    
    
    # net = MyLSTM(len(dic)+1, len(labels), 100)  # len(dic)+1で+1がないとエラーになる
    net = MyLSTM(len(dic)+1, len(labels), 100).to(device)
    optimizer = optim.SGD(net.parameters(), lr=0.01)
    criterion = nn.CrossEntropyLoss()
    
    for ep in range(1):  # 10 -> 1
        loss1k = 0.0
        for i in range(len(xdata)):
            x = [xdata[i]]
            x = torch.LongTensor(xdata[i]).to(device)
            output = net(x)
            # print(f'{ep} {i}')
            y = torch.LongTensor(ydata[i]).to(device)
            loss = criterion(output, y)
            # print(output.shape)
            # print(y.shape)
            if (i % 1000 == 0):
                print(i, loss1k)
                loss1k = loss.item()
            else:
                loss1k += loss.item()
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
        outfile = 'lstm0-' + str(ep) + '.model'
        torch.save(net.state_dict(), outfile)
    
[/code]

[code]

    0 0.0
    1000 2156.185638189316
    2000 1557.127596437931
    3000 1287.3680111765862
    ...
    47000 376.6789101790637
    48000 383.22723182849586
    49000 350.0370232462883
    
[/code]


CC BY-SA 4.0
2023-01-22T05:28:07.133
93501
2023-01-22T05:28:07.133
54588
91095
answer