###状況
pytorchを用いて文字認識を行うために、次のサイトに従ってコードを作成したのですが、タイトルのエラーが表示されてしまい、解決方法が分からないため質問しました。データセットは自作のものを使っていて、サイズが256×256のグレースケール画像を使用しています。エラーを調べたところ、エラー文中の(16896x256 and 65536x100)太字の数字を合わせる必要があるというのは分かったのですが、バッチサイズや入力層のパラメータを変えてもエラー文を解決できませんでした。
https://book.mynavi.jp/manatee/detail/id=89498
###該当ソースコード
python
1pip install opencv-python 2import matplotlib.pyplot as plt 3import os 4import cv2 5import random 6import numpy as np 7import torch 8from torch.utils.data import TensorDataset, DataLoader 9 10# 1. 自作データを保存 11x = np.array(x) #画像データ 12y = np.array(y) #ラベル 13 14# 2.1 データを訓練とテストに分割(6:1) 15from sklearn.model_selection import train_test_split 16x_train, x_test, y_train, y_test = train_test_split( 17 x, y, test_size=1/7, random_state=0) 18 19# 2.2 データをPyTorchのTensorに変換 20x_train = torch.Tensor(x_train) 21x_test = torch.Tensor(x_test) 22y_train = torch.LongTensor(y_train) 23y_test = torch.LongTensor(y_test) 24 25# 2.3 データとラベルをセットにしたDatasetを作成 26ds_train = TensorDataset(x_train, y_train) 27ds_test = TensorDataset(x_test, y_test) 28 29# 2.4 データセットのミニバッチサイズを指定した、Dataloaderを作成 30loader_train = DataLoader(ds_train, batch_size=64, shuffle=True) 31loader_test = DataLoader(ds_test, batch_size=64, shuffle=False) 32 33# 3. ネットワークの構築 34 35from torch import nn 36 37model = nn.Sequential() 38model.add_module('fc1', nn.Linear(256*256, 100)) 39model.add_module('relu1', nn.ReLU()) 40model.add_module('fc2', nn.Linear(100, 100)) 41model.add_module('relu2', nn.ReLU()) 42model.add_module('fc3', nn.Linear(100, 92)) #92 = ラベルの数 43 44print(model) 45 46# 4. 誤差関数と最適化手法の設定 47 48from torch import optim 49 50# 誤差関数の設定 51loss_fn = nn.CrossEntropyLoss() # 変数名にはcriterionも使われる 52 53# 重みを学習する際の最適化手法の選択 54optimizer = optim.Adam(model.parameters(), lr=0.01) 55 56# 5-1. 学習と推論の設定 57 58from torch.autograd import Variable 59 60 61def train(epoch): 62 model.train() # ネットワークを学習モードに切り替える 63 64 # データローダーから1ミニバッチずつ取り出して計算する 65 for data, target in loader_train: 66 data, target = Variable(data), Variable(target) # 微分可能に変換 67 optimizer.zero_grad() # 一度計算された勾配結果を0にリセット 68 69 output = model(data) # 入力dataをinputし、出力を求める 70 loss = loss_fn(output, target) # 出力と訓練データの正解との誤差を求める 71 loss.backward() # 誤差のバックプロパゲーションを求める 72 optimizer.step() # バックプロパゲーションの値で重みを更新する 73 74 print("epoch{}:終了\n".format(epoch)) 75 76# 5-2. 学習と推論の設定 77 78def test(): 79 model.eval() # ネットワークを推論モードに切り替える 80 correct = 0 81 82 # データローダーから1ミニバッチずつ取り出して計算する 83 for data, target in loader_test: 84 data, target = Variable(data), Variable(target) # 微分可能に変換 85 output = model(data) # 入力dataをinputし、出力を求める 86 87 # 推論する 88 pred = output.data.max(1, keepdim=True)[1] # 出力ラベルを求める 89 correct += pred.eq(target.data.view_as(pred)).sum() # 正解と一緒だったらカウントアップ 90 91 # 正解率を出力 92 data_num = len(loader_test.dataset) # データの総数 93 print('\nテストデータの正解率: {}/{} ({:.0f}%)\n'.format(correct, 94 data_num, 100. * correct / data_num)) 95 96# 6. 学習と推論の実行 97test() #学習をする前に試しにテストを実行
###エラーコード
python
1RuntimeError Traceback (most recent call last) 2<ipython-input-103-4fda56ceff28> in <module>() 3 1 # 6. 学習と推論の実行 4 2 5----> 3 test() 6 75 frames 8/usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input, weight, bias) 9 1690 ret = torch.addmm(bias, input, weight.t()) 10 1691 else: 11-> 1692 output = input.matmul(weight.t()) 12 1693 if bias is not None: 13 1694 output += bias 14 15RuntimeError: mat1 and mat2 shapes cannot be multiplied (16896x256 and 65536x100)
回答1件
あなたの回答
tips
プレビュー