初めに
たびたび申し訳ございません。
何度もこちらにお世話になっているのですが、一向にわからないことがあります。
やろうと思っていることは以下のディレクトリ構成から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)
参考
上記、様々に見ましたがいまいちわかりませんでした。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。