質問編集履歴
2
errorとコードを編集しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -16,13 +16,28 @@
|
|
16
16
|
### エラー文
|
17
17
|
以下はtrain.pyを実行したら起きたものです。
|
18
18
|
```
|
19
|
-
RuntimeError:
|
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
|
-
|
93
|
+
num_epochs = 2
|
75
94
|
|
95
|
+
#最後にlossとaccuracyのグラフをプロットするためのリスト
|
76
|
-
|
96
|
+
train_loss_list = []
|
77
|
-
|
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,
|
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
|
-
|
114
|
+
images, labels = images.view(images.shape[0], -1).to(device), labels.to(device)
|
87
115
|
|
88
|
-
#
|
116
|
+
#勾配をリセット
|
89
|
-
# zero the parameter gradients
|
90
117
|
optimizer.zero_grad()
|
91
|
-
|
92
|
-
#
|
118
|
+
#順伝播の計算
|
93
|
-
# forward + backward + optimize
|
94
|
-
outputs = model(
|
119
|
+
outputs = model(images)
|
95
|
-
|
96
|
-
#
|
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
|
-
|
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
|
-
|
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
|
-
|
147
|
+
avg_val_acc = val_acc / len(valid_loader.dataset)
|
148
|
+
|
105
|
-
|
149
|
+
#訓練データのlossと検証データのlossとaccuracyをログで出しています。
|
150
|
+
print ('Epoch [{}/{}], Loss: {loss:.4f}, val_loss: {val_loss:.4f}, val_acc: {val_acc:.4f}'
|
106
|
-
(
|
151
|
+
.format(epoch+1, num_epochs, i+1, loss=avg_train_loss, val_loss=avg_val_loss, val_acc=avg_val_acc))
|
107
|
-
|
152
|
+
#最後にグラフをプロットするようにリストに格納
|
108
|
-
|
109
|
-
|
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
追記しました。
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
|
以上の情報から画像のサイズのミスマッチが起きているのがわかるのですが、どこをどう編集すればいいのかがわかりません。
|