teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

errorとコードを編集しました。

2020/09/03 01:46

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -16,13 +16,28 @@
16
16
  ### エラー文
17
17
  以下はtrain.pyを実行したら起きたものです。
18
18
  ```
19
- RuntimeError: size mismatch, m1: [32 x 9216], m2: [2304 x 120] at /pytorch/aten/src/TH/generic/THTensorMath.cpp:41
19
+ RuntimeError: Expected 4-dimensional input for 4-dimensional weight [16, 3, 3, 3], but got 2-dimensional input of size [32, 196608] instead
20
20
  ```
21
21
 
22
22
  ### コード
23
23
  train.py(実行したコード)です。まだ完成されていませんが、lossやaccの精度なんかを見ようとしてます。
24
24
 
25
25
  ```python
26
+ import torch
27
+ import torch.nn as nn
28
+ import torch.nn.functional as F
29
+
30
+ import torch.optim as optim
31
+ import model,dataset
32
+ from model import *
33
+
34
+ from tqdm import tqdm
35
+ from torch.autograd import Variable
36
+
37
+
38
+
39
+
40
+ #一つの機能を作ったら→pritで確認
26
41
  device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
27
42
 
28
43
 
@@ -60,8 +75,12 @@
60
75
  shuffle= True
61
76
  )
62
77
 
78
+ # batch = len(next(iter(train_loader))) #2
79
+ # for i in train_loader:
80
+ # print(i)
81
+ # for i in valid_loader:
82
+ # print(i)
63
83
 
64
-
65
84
  # iterationの確定
66
85
  sample_size = len(train_dataset) #129
67
86
  num_iters = sample_size // 32 #129 / 32 = 4.03
@@ -70,43 +89,71 @@
70
89
  criterion = nn.CrossEntropyLoss()
71
90
 
72
91
  #start epoch
73
- # 正解率を保持
92
+ #2エポック
74
- for epoch_id in range(2):
93
+ num_epochs = 2
75
94
 
95
+ #最後にlossとaccuracyのグラフをプロットするためのリスト
76
- # データすべてのトータルロス
96
+ train_loss_list = []
77
- running_loss = 0.0
97
+ train_acc_list = []
98
+ val_loss_list = []
99
+ val_acc_list = []
78
100
 
101
+ for epoch in range(num_epochs):
102
+ #エポックごとに初期化
103
+ train_loss = 0
104
+ train_acc = 0
105
+ val_loss = 0
106
+ val_acc = 0
107
+ #train==============================
108
+ #訓練モードへ切り替え
109
+ model.train()
110
+ #ミニバッチで分割して読み込む
79
- for i, data in tqdm(enumerate(train_loader)):
111
+ for i, (images, labels) in enumerate(train_loader):
80
-
112
+ #viewで縦横32ピクセルで3チャンネルの画像を1次元に変換
81
- #入力データ・ラベル分割
113
+ #toでgpu転送
82
- # get the inputs
83
- inputs, labels = data
84
- # Variableに変形
85
- # wrap them in Variable
86
- inputs, labels = Variable(inputs), Variable(labels)
114
+ images, labels = images.view(images.shape[0], -1).to(device), labels.to(device)
87
115
 
88
- # optimizerの初期化
116
+ #勾配をリセット
89
- # zero the parameter gradients
90
117
  optimizer.zero_grad()
91
-
92
- #一連流れ
118
+ #順伝播計算
93
- # forward + backward + optimize
94
- outputs = model(inputs)
119
+ outputs = model(images)
95
-
96
- #ここでラベルデータに対するCross-Entropyがとられる
120
+ #lossの計算
97
121
  loss = criterion(outputs, labels)
122
+ #lossのミニバッチ分を溜め込む
123
+ train_loss += loss.item()
124
+ #accuracyをミニバッチ分を溜め込む
125
+ #正解ラベル(labels)と予測値のtop1(outputs.max(1))が合っている場合に1が返ってきます。
126
+ train_acc += (outputs.max(1)[1] == labels).sum().item()
127
+ #逆伝播の計算
98
128
  loss.backward()
129
+ #重みの更新
99
130
  optimizer.step()
100
-
101
- # ロスの表示
102
- # print statistics
131
+ #平均lossと平均accuracyを計算
132
+ avg_train_loss = train_loss / len(train_loader.dataset)
133
+ avg_train_acc = train_acc / len(train_loader.dataset)
134
+
135
+ #val==============================
136
+ #評価モードへ切り替え
137
+ model.eval()
138
+ #評価するときに必要のない計算が走らないようにtorch.no_gradを使用しています。
139
+ with torch.no_grad():
140
+ for images, labels in valid_loader:
141
+ images, labels = images.view(-1, 32*32*3).to(device), labels.to(device)
142
+ outputs = model(images)
143
+ loss = criterion(outputs, labels)
103
- running_loss += loss.data[0]
144
+ val_loss += loss.item()
145
+ val_acc += (outputs.max(1)[1] == labels).sum().item()
146
+ avg_val_loss = val_loss / len(valid_loader.dataset)
104
- if i % 2000 == 1999: # print every 2000 mini-batches
147
+ avg_val_acc = val_acc / len(valid_loader.dataset)
148
+
105
- print('[%d, %5d] loss: %.3f' %
149
+ #訓練データのlossと検証データのlossとaccuracyをログで出しています。
150
+ print ('Epoch [{}/{}], Loss: {loss:.4f}, val_loss: {val_loss:.4f}, val_acc: {val_acc:.4f}'
106
- (epoch_id + 1, i + 1, running_loss / 2000))
151
+ .format(epoch+1, num_epochs, i+1, loss=avg_train_loss, val_loss=avg_val_loss, val_acc=avg_val_acc))
107
- running_loss = 0.0
152
+ #最後にグラフをプロットするようにリストに格納
108
-
109
- print('Finished Training')
153
+ train_loss_list.append(avg_train_loss)
154
+ train_acc_list.append(avg_train_acc)
155
+ val_loss_list.append(avg_val_loss)
156
+ val_acc_list.append(avg_val_acc)
110
157
  ```
111
158
 
112
159
  以下はmodelの実装です。おそらく、こちらでミスしていると思うのですが、同編集すればいいのか...

1

追記しました。

2020/09/03 01:46

投稿

oinari03
oinari03

スコア59

title CHANGED
File without changes
body CHANGED
@@ -183,6 +183,26 @@
183
183
  print(net)
184
184
 
185
185
  ```
186
+ model.pyの出力結果を示します。
187
+ ここでは最後のLinearでの数値とあっていないように思えます。
188
+ ```ここに言語を入力
189
+ Net(
190
+ (relu): ReLU()
191
+ (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1))
192
+ (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
193
+ (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1))
194
+ (pool2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
195
+ (conv3): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1))
196
+ (pool3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
197
+ (conv4): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1))
198
+ (pool4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
199
+ (conv5): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1))
200
+ (pool5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
201
+ (fc1): Linear(in_features=2304, out_features=120, bias=True)
202
+ (fc2): Linear(in_features=120, out_features=84, bias=True)
203
+ (fc3): Linear(in_features=84
204
+ )
205
+ ```
186
206
 
187
207
  ### まとめ
188
208
  以上の情報から画像のサイズのミスマッチが起きているのがわかるのですが、どこをどう編集すればいいのかがわかりません。