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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

4144閲覧

RuntimeError: size mismatch, m1: [32 x 9216], m2: [256 x 120] のエラーがわからない

oinari03

総合スコア59

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

PyTorch

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2020/09/03 03:15

編集2020/09/03 04:34

初めに

たびたび申し訳ございません。
何度もこちらにお世話になっているのですが、一向にわからないことがあります。

やろうと思っていることは以下のディレクトリ構成からpytorchで256x256x3の画像を2値に画像分類をしようとしています。

├─animal_dataset ├─train │ ├─cat(70枚くらい) │ └─dog(70枚くらい) └─val ├─cat(30枚くらい) └─dog(30枚くらい)

今回train.pyでlossとaccの精度を見たくて,train.pyを実行しています。

わからない点は、エラーの内容です。

また、そもそも学習するという実装の流れがイメージできていないのもあります。
今回はcnnを用いて画像分類を達成したいと考えているのですが、どうにも、lossとaccの精度がどれくらいなのかを確認するコードが書けません。
どうか、erorrの内容も含めて、目的を達成するための流れや、実装する際のアドバイスなどあればよろしくお願いいたします。

初心者であり、わからない点もあるので不明な点があれば追記いたします。
改めてお願いしたいこと
①errorの解消
②loss,accの精度を確認するときの流れというか、実装のアドバイス
③model.pyのforwardの中身を見てfc1のあたりがおかしそうなので中身をどうにかしてみたいのですが、
xに何を与えて確認したらいいのかわかりません

error

error

1RuntimeError: size mismatch, m1: [32 x 9216], m2: [2304 x 120] at /pytorch/aten/src/THC/generic/THCTensorMathBlas.cu:283

画像サイズがあっていないと思われます。

model.py

以下モデルの実装を示します。

python

1class Net(nn.Module): 2 3 def __init__(self): 4 super(Net, self).__init__() 5 self.relu = nn.ReLU() 6 7 # input: RGB 3 ,output : 16, kernel 3(default) 8 self.conv1 = nn.Conv2d(3, 16, 3) 9 # print(self.conv1.weight) 10 self.pool1 = nn.MaxPool2d(2,stride=2) 11 12 self.conv2 = nn.Conv2d(16, 32, 3) 13 self.pool2 = nn.MaxPool2d(2,stride=2) 14 15 self.conv3 = nn.Conv2d(32, 64, 3) 16 self.pool3 = nn.MaxPool2d(2,stride=2) 17 18 self.conv4 = nn.Conv2d(64, 128, 3) 19 self.pool4 = nn.MaxPool2d(2,stride=2) 20 21 self.conv5 = nn.Conv2d(128, 256, 3) 22 self.pool5 = nn.MaxPool2d(2,stride=2) 23 24 25 26 # an affine operation: y = Wx + b 27 self.fc1 = nn.Linear(256 * 3 * 3, 120) 28 self.fc2 = nn.Linear(120, 84) 29 self.fc3 = nn.Linear(84, 2) 30 31 def forward(self, x): 32 # conv relu poolの流れを実行してみる 33 34 x = self.conv1(x) 35 x = self.relu(x) 36 x = self.pool1(x) 37 38 x = self.conv2(x) 39 x = self.relu(x) 40 x = self.pool2(x) 41 42 x = self.conv3(x) 43 x = self.relu(x) 44 x = self.pool3(x) 45 46 x = self.conv4(x) 47 x = self.relu(x) 48 x = self.pool4(x) 49 50 x = self.conv5(x) 51 x = self.relu(x) 52 x = self.pool5(x) 53 54 x = x.view(x.size()[0], -1) 55 x = self.fc1(x) 56 x = self.relu(x) 57 x = self.fc2(x) 58 x = self.relu(x) 59 x = self.fc3(x) 60 61 return F.log_softmax(x,dim=1) 62 63 64 65if __name__ == "__main__": 66 67 net = Net() 68 print(net)

train.py

こちらのコードを実行しました。

import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import model,dataset from model import * from tqdm import tqdm from torch.autograd import Variable #一つの機能を作ったら→pritで確認 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 上でgpuの設定device if __name__ == "__main__": # modelの定義 model = model.Net().to(device) # optimizerの定義 optimizer = torch.optim.SGD( model.parameters(), lr=0.001, momentum=0.9, weight_decay=0.0001) # datasetの定義 # training train_dataset = dataset.MyDatasets( root_dir="./animal_dataset", key="train", ) train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=32, shuffle= True ) # validation valid_dataset = dataset.MyDatasets( root_dir="./animal_dataset", key="val", ) valid_loader = torch.utils.data.DataLoader( valid_dataset, batch_size=32, shuffle= True ) # batch = len(next(iter(train_loader))) #2 # for i in train_loader: # print(i) # for i in valid_loader: # print(i) # iterationの確定 sample_size = len(train_dataset) #129 num_iters = sample_size // 32 #129 // 32 = 4.03 #loss criterion = nn.CrossEntropyLoss() #start epoch #2エポック num_epochs = 10 #最後にlossとaccuracyのグラフをプロットするためのリスト train_loss_list = [] train_acc_list = [] val_loss_list = [] val_acc_list = [] for epoch in range(num_epochs): #エポックごとに初期化 train_loss = 0 train_acc = 0 val_loss = 0 val_acc = 0 #train============================== #訓練モードへ切り替え model.train() #ミニバッチで分割して読み込む for i, (images, labels) in enumerate(train_loader): #toでgpuに転送 images, labels = images.to(device), labels.to(device) #勾配をリセット optimizer.zero_grad() #順伝播の計算 outputs = model(images) #lossの計算 loss = criterion(outputs, labels) #lossのミニバッチ分を溜め込む train_loss += loss.item() #accuracyをミニバッチ分を溜め込む #正解ラベル(labels)と予測値のtop1(outputs.max(1))が合っている場合に1が返ってきます。 train_acc += (outputs.max(1)[1] == labels).sum().item() #逆伝播の計算 loss.backward() #重みの更新 optimizer.step() #平均lossと平均accuracyを計算 avg_train_loss = train_loss / len(train_loader.dataset) avg_train_acc = train_acc / len(train_loader.dataset) print(avg_train_loss)

参考

画像分類参考
errorについて

上記、様々に見ましたがいまいちわかりませんでした。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

①fowardの中身にfc1の前にprint(fc1)してみるとわかる
model.pyで
x = torch.randn(1,3,256,256)
net = Net()
print(net(x))
で呼び出す。
するとtorchサイズがわかるので、
initのfc1が違うとわかる
結果を言うと
25633を9216に変えたら大丈夫そうです。

投稿2020/09/03 06:00

oinari03

総合スコア59

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問