質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

pytorchのRuntimeError: mat1 and mat2 shapes cannot be multiplied (16896x256 and 65536x100)を解決したい

hamusuke
hamusuke

総合スコア4

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0評価

0クリップ

5786閲覧

投稿2021/01/07 06:07

編集2021/01/07 06:08

###状況
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)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jbpb0

2021/01/07 10:08 編集

x = np.array(x)の次元が分からないのですが、x_trainが256x256の2次元のままなのではないですか? ネットワークの入力は、256*256=65536個の数値が1次元で並んでいるのを入力するようになってますけど
hamusuke

2021/01/07 16:23

データセットの作成には次のサイトのコードを使用しました。 x = np.array(x) のあとに一次元配列化するために x = x.ravel() を追加してみましたが、データセットを学習用とテスト用に分割するところで新たなエラーが発生しました。 ###新たなエラー ValueError: Found input variables with inconsistent numbers of samples: [30146560, 460] ###サイト https://intellectual-curiosity.tokyo/2019/07/02/%E3%82%AA%E3%83%AA%E3%82%B8%E3%83%8A%E3%83%AB%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9/
jbpb0

2021/01/07 22:11

私の書き方が悪かったです 上で2次元、1次元と書いたのは、一つのサンプルに付いてです サンプルの次元は別にあるので、全サンプルでは、それぞれ3次元、2次元です ravel()だと、サンプルの次元も無くなってしまいます
jbpb0

2021/01/07 23:45 編集

https://book.mynavi.jp/manatee/detail/id=89498 では、mnistデータをsklearn.datasets.fetch_mldata()で入手してます このデータに合わせて以降で解説されてるネットワークが設計されてますので、そのネットワークを(画素数だけ変えて)流用するのなら、自作データの形式を上記mnistデータに合わせる必要があります https://note.nkmk.me/python-scikit-learn-svm-mnist/ の「データ読み込み」の「データとラベルをそれぞれ取り出す。」と書かれてるところの下にあるように、そのmnistデータのmnist_data.shapeは(70000, 784)です 70000はサンプル数、784は画像の画素数(28x28)です それに合わせて、自作データのx.shapeが(サンプル数, 65536)となるようにしてください
hamusuke

2021/01/08 05:10

詳しく教えてくださり、ありがとうございます。 xをreshapeすることで、mnistと同様の形式にすることができました。 また、学習とテストも問題なく実行することができました、ありがとうございます。 ぜひ、jbpb0さんをベストアンサーとして選択させていただきたいのですが、改めて回答をしていただけますでしょうか。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。