###状況
pytorchを用いて文字認識を行うために、次のサイトに従ってコードを作成したのですが、タイトルのエラーが表示されてしまい、解決方法が分からないため質問しました。データセットは自作のものを使っていて、サイズが256×256のグレースケール画像を使用しています。エラーを調べたところ、エラー文中の(16896x256 and 65536x100)太字の数字を合わせる必要があるというのは分かったのですが、バッチサイズや入力層のパラメータを変えてもエラー文を解決できませんでした。
https://book.mynavi.jp/manatee/detail/id=89498
###該当ソースコード
python
pip install opencv-python import matplotlib.pyplot as plt import os import cv2 import random import numpy as np import torch from torch.utils.data import TensorDataset, DataLoader # 1. 自作データを保存 x = np.array(x) #画像データ y = np.array(y) #ラベル # 2.1 データを訓練とテストに分割(6:1) from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=1/7, random_state=0) # 2.2 データをPyTorchのTensorに変換 x_train = torch.Tensor(x_train) x_test = torch.Tensor(x_test) y_train = torch.LongTensor(y_train) y_test = torch.LongTensor(y_test) # 2.3 データとラベルをセットにしたDatasetを作成 ds_train = TensorDataset(x_train, y_train) ds_test = TensorDataset(x_test, y_test) # 2.4 データセットのミニバッチサイズを指定した、Dataloaderを作成 loader_train = DataLoader(ds_train, batch_size=64, shuffle=True) loader_test = DataLoader(ds_test, batch_size=64, shuffle=False) # 3. ネットワークの構築 from torch import nn model = nn.Sequential() model.add_module('fc1', nn.Linear(256*256, 100)) model.add_module('relu1', nn.ReLU()) model.add_module('fc2', nn.Linear(100, 100)) model.add_module('relu2', nn.ReLU()) model.add_module('fc3', nn.Linear(100, 92)) #92 = ラベルの数 print(model) # 4. 誤差関数と最適化手法の設定 from torch import optim # 誤差関数の設定 loss_fn = nn.CrossEntropyLoss() # 変数名にはcriterionも使われる # 重みを学習する際の最適化手法の選択 optimizer = optim.Adam(model.parameters(), lr=0.01) # 5-1. 学習と推論の設定 from torch.autograd import Variable def train(epoch): model.train() # ネットワークを学習モードに切り替える # データローダーから1ミニバッチずつ取り出して計算する for data, target in loader_train: data, target = Variable(data), Variable(target) # 微分可能に変換 optimizer.zero_grad() # 一度計算された勾配結果を0にリセット output = model(data) # 入力dataをinputし、出力を求める loss = loss_fn(output, target) # 出力と訓練データの正解との誤差を求める loss.backward() # 誤差のバックプロパゲーションを求める optimizer.step() # バックプロパゲーションの値で重みを更新する print("epoch{}:終了\n".format(epoch)) # 5-2. 学習と推論の設定 def test(): model.eval() # ネットワークを推論モードに切り替える correct = 0 # データローダーから1ミニバッチずつ取り出して計算する for data, target in loader_test: data, target = Variable(data), Variable(target) # 微分可能に変換 output = model(data) # 入力dataをinputし、出力を求める # 推論する pred = output.data.max(1, keepdim=True)[1] # 出力ラベルを求める correct += pred.eq(target.data.view_as(pred)).sum() # 正解と一緒だったらカウントアップ # 正解率を出力 data_num = len(loader_test.dataset) # データの総数 print('\nテストデータの正解率: {}/{} ({:.0f}%)\n'.format(correct, data_num, 100. * correct / data_num)) # 6. 学習と推論の実行 test() #学習をする前に試しにテストを実行
###エラーコード
python
RuntimeError Traceback (most recent call last) <ipython-input-103-4fda56ceff28> in <module>() 1 # 6. 学習と推論の実行 2 ----> 3 test() 5 frames /usr/local/lib/python3.6/dist-packages/torch/nn/functional.py in linear(input, weight, bias) 1690 ret = torch.addmm(bias, input, weight.t()) 1691 else: -> 1692 output = input.matmul(weight.t()) 1693 if bias is not None: 1694 output += bias RuntimeError: mat1 and mat2 shapes cannot be multiplied (16896x256 and 65536x100)
まだ回答がついていません
会員登録して回答してみよう