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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

804閲覧

pytorchを用いてCNNによる2種類の画像分類を行いたいがmat1 and mat2 shapes cannot be multipliedというエラーが出てしまう

yukas

総合スコア13

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/16 05:11

編集2023/01/16 05:17

前提

Linux
GPU
python3
pytorch

画像データは正方形、サイズ:512*512に揃えたものを使用しています。

実現したいこと

python3とpytorchを用いてCNNによるYESかNOの画像分類を行いたいです。

発生している問題・エラーメッセージ

mat1 and mat2 shapes cannot be multiplied (32x460800 and 73728x200)
というエラーが起こってしまいます。
それ以外にも長々と出力されているのですがあまり関係ないと思っています。
(もし問題があれば教えていただきたいので念の為載せておきます)

File "/home/u1948029/デスクトップ/learning.py", line 218, in <module> train_net(model, train_loader, test_loader, n_iter=150, device="cuda:0") File "/home/u1948029/デスクトップ/learning.py", line 183, in train_net h = net(xx) File "/home/u1948029/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1194, in _call_impl return forward_call(*input, **kwargs) File "/home/u1948029/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py", line 204, in forward input = module(input) File "/home/u1948029/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1194, in _call_impl return forward_call(*input, **kwargs) File "/home/u1948029/anaconda3/lib/python3.9/site-packages/torch/nn/modules/container.py", line 204, in forward input = module(input) File "/home/u1948029/anaconda3/lib/python3.9/site-packages/torch/nn/modules/module.py", line 1194, in _call_impl return forward_call(*input, **kwargs) File "/home/u1948029/anaconda3/lib/python3.9/site-packages/torch/nn/modules/linear.py", line 114, in forward return F.linear(input, self.weight, self.bias) mat1 and mat2 shapes cannot be multiplied (32x460800 and 73728x200)

該当のソースコード

#CNN学習 #memo7_GPUより import copy import time import os import tqdm import torchvision.transforms as transforms import torchvision.models as models import torchvision from torchvision import transforms from torch.utils.data import (DataLoader,Dataset,TensorDataset) import torch.optim as optim import torch.nn as nn import torch def saveModel(): path="./sim.pth " #modelを保存するファイル名 torch.save(model.state_dict(),path) data_tr_folder = "./learning98"#data写真データのフォルダ(学習) data_vl_folder = "./test1" #data写真データのフォルダ(テスト) transform_dict = { 'train': transforms.Compose([ #transforms.RandomCrop(127),#画像リサイズいろいろ。ramdomarop以外にもあるから調べてみる transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]), 'val': transforms.Compose([ #transforms.CenterCrop(127), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ])} transform = transform_dict["train"] data_tr = torchvision.datasets.ImageFolder(root=data_tr_folder, transform=transform_dict["train"]) data_vl = torchvision.datasets.ImageFolder(root=data_vl_folder, transform=transform_dict["val"]) train_size = int(len(data_tr)) # int()で整数に。 val_size = int(len(data_vl)) data_size = {"train":train_size, "val":val_size} # =>{"train": 4800, "val":800} #data_train = torch.utils.data.random_split(data_tr,train_size) #data_val = torch.utils.data.random_split(data_vl,val_size) batch_size=32 #バッチサイズ train_loader = torch.utils.data.DataLoader(data_tr, batch_size=batch_size, shuffle=True) #val_loaderをtest_loaderに名前かえてみた test_loader = torch.utils.data.DataLoader(data_vl, batch_size=batch_size, shuffle=True) dataloaders = {"train":train_loader, "val":test_loader} #上記データセット作成 # リスト4.2 2層の畳み込み層と2層のMLPをつなげたCNNを作成 # In[ ]: # (N、C、H、W)形式のTensorを(N, C*H*W)に引き伸ばす層 # 畳み込み層の出力をMLPに渡す際に必要 class FlattenLayer(nn.Module): def forward(self, x): sizes = x.size() return x.view(sizes[0], -1) # size = x.size()[1:] # all dimensions except the batch dimension #num_features = 1 #for s in size: # num_features *= s # return num_features #CNNの本体 conv_net = nn.Sequential( nn.Conv2d(3, 32, 5),#カラーなら3でOK、32は画像のサイズによって変更したらうまくいくかも nn.MaxPool2d(2), nn.ReLU(), nn.BatchNorm2d(32), nn.Dropout2d(0.5), ### nn.Conv2d(32, 64, 5), nn.MaxPool2d(2), nn.ReLU(), nn.BatchNorm2d(64), nn.Dropout2d(0.5), ### nn.Conv2d(64, 128, 5), nn.MaxPool2d(2), nn.ReLU(), nn.BatchNorm2d(128), FlattenLayer() ) # 畳み込みによって最終的にどのようなサイズになっているかを、 # 実際にダミーデータを入れてみて確認する test_input = torch.ones(1, 3, 512, 512) #RGBか。画像のサイズ。 conv_output_size = conv_net(test_input).size()[-1] # 2層のMLP mlp = nn.Sequential( nn.Linear(conv_output_size, 200), nn.ReLU(), nn.BatchNorm1d(200), nn.Dropout(0.5), nn.Linear(200, 10) ) # 最終的なCNN net = nn.Sequential( conv_net, mlp ) # リスト4.3 評価と訓練のヘルパー関数を作成 # In[ ]: # 評価のヘルパー関数 def eval_net(net, data_loader, device="cuda:0"): # DropoutやBatchNormを無効化 net.eval() ys = [] ypreds = [] for x, y in data_loader: # toメソッドで計算を実行するデバイスに転送する x = x.to(device) y = y.to(device) # 確率が最大のクラスを予測(リスト2.14参照) # ここではforward(推論)の計算だけなので自動微分に # 必要な処理はoffにして余計な計算を省く with torch.no_grad(): _, y_pred = net(x).max(1) ys.append(y) ypreds.append(y_pred) # ミニバッチごとの予測結果などを1つにまとめる ys = torch.cat(ys) ypreds = torch.cat(ypreds) # 予測精度を計算 acc = (ys == ypreds).float().sum() / len(ys) return acc.item() # 訓練のヘルパー関数 def train_net(net, train_loader, test_loader, optimizer_cls=optim.Adam, loss_fn=nn.CrossEntropyLoss(), n_iter=10, device="cuda:0"): best_accuracy = 1.0 #save?# train_losses = [] train_acc = [] val_acc = [] optimizer = optimizer_cls(net.parameters(),lr=0.00001) ### for epoch in range(n_iter): running_loss = 0.0 # ネットワークを訓練モードにする net.train() n = 0 n_acc = 0 # 非常に時間がかかるのでtqdmを使用してプログレスバーを出す for i, (xx, yy) in tqdm.tqdm(enumerate(train_loader), total=len(train_loader)): xx = xx.to(device) yy = yy.to(device) h = net(xx) loss = loss_fn(h, yy) optimizer.zero_grad() loss.backward() optimizer.step() running_loss += loss.item() n += len(xx) _, y_pred = h.max(1) n_acc += (yy == y_pred).float().sum().item() train_losses.append(running_loss / i) # 訓練データの予測精度 train_acc.append(n_acc / n) # 検証データの予測精度 val_acc.append(eval_net(net, test_loader, device)) # accuracy = train_losses[-1] # if accuracy < best_accuracy: # saveModel() # best_accuracy=accuracy # このepochでの結果を表示 print(epoch, train_losses[-1], train_acc[-1], val_acc[-1], flush=True) # リスト4.4 全パラメータをGPUに転送して訓練を実行 # In[ ]: # ネットワークの全パラメータをGPUに転送 model=net.to("cuda:0") # 訓練を実行 train_net(model, train_loader, test_loader, n_iter=150, device="cuda:0") saveModel()

試したこと

・testとlearningそれぞれのYES、NOの画像の枚数を揃えてみる
・画像データをjpegで揃える
・その他インターネットで調べるもわからずここの掲載することにしました

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/01/16 11:14

行列計算でエラーが発生しているのだと思います。 モデルの構造を可視化して確認されてはどうでしょうか?
guest

回答1

0

自己解決

画像サイズ512と記載できていない部分が見つかり解決しました

投稿2023/01/18 09:01

yukas

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問