質問編集履歴
2
train関数の追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -10,6 +10,39 @@
|
|
10
10
|
- Flatten作業にてimageをvectorに変更
|
11
11
|
- Fully-connected linearレイヤーには10個のアウトプットを生成
|
12
12
|
|
13
|
+
### 現状のエラーメッセージ
|
14
|
+
|
15
|
+
`RuntimeError: shape '[-1, 4900]' is invalid for input of size 140000`
|
16
|
+
|
17
|
+
なお、CNNネットワークは以下のtrain関数で学習させています。以下の通り、CNNを学習させる段階でエラーです。
|
18
|
+
```
|
19
|
+
def train(net, train_loader, test_loader,
|
20
|
+
num_epochs=NUM_EPOCHS, learning_rate=LEARNING_RATE,
|
21
|
+
compute_accs=False):
|
22
|
+
criterion = nn.CrossEntropyLoss()
|
23
|
+
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
|
24
|
+
|
25
|
+
train_accs = []
|
26
|
+
test_accs = []
|
27
|
+
|
28
|
+
for epoch in range(1, num_epochs + 1):
|
29
|
+
batch_num = 1
|
30
|
+
for images, labels in train_loader:
|
31
|
+
|
32
|
+
# If you are using a GPU, speed up computation by moving values to the GPU
|
33
|
+
if torch.cuda.is_available():
|
34
|
+
net = net.cuda()
|
35
|
+
images = images.cuda()
|
36
|
+
labels = labels.cuda()
|
37
|
+
|
38
|
+
|
39
|
+
optimizer.zero_grad()
|
40
|
+
outputs = net(images) # CNNを学習させるこの段階でエラー
|
41
|
+
loss = criterion(outputs, labels)
|
42
|
+
loss.backward()
|
43
|
+
optimizer.step()
|
44
|
+
```
|
45
|
+
|
13
46
|
### 該当のソースコード
|
14
47
|
|
15
48
|
```python
|
@@ -27,11 +60,9 @@
|
|
27
60
|
print(x.shape)
|
28
61
|
# use relu function to x
|
29
62
|
x = self.relu(x)
|
30
|
-
|
31
63
|
# Run max pooling over x
|
32
64
|
x = self.pool(x)
|
33
65
|
print(x.shape)
|
34
|
-
|
35
66
|
# flatten x:おそらくここでエラー発生
|
36
67
|
x = x.view(-1, 25 * 14 * 14)
|
37
68
|
print(x.shape)
|
1
誤字を修正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
-
PyTorchを用いてCNN(畳み込みニューラルネットワーク)の実装を進めております。
|
3
|
+
PyTorchを用いてCNN(畳み込みニューラルネットワーク)の実装を進めておりますが、CNNへの理解が乏しく上手く実装できておりません。
|
4
|
-
その中で、
|
5
4
|
|
6
|
-
###
|
5
|
+
### 前提
|
7
6
|
|
8
|
-
|
7
|
+
- Convolution Layerにはカーネルのサイズを width = 5, depth = 25を利用
|
9
|
-
|
8
|
+
- ReLu活性化関数を利用
|
9
|
+
- max-poolにはカーネルサイズを width = 2, stride = 2を利用
|
10
|
-
|
10
|
+
- Flatten作業にてimageをvectorに変更
|
11
|
+
- Fully-connected linearレイヤーには10個のアウトプットを生成
|
11
12
|
|
12
13
|
### 該当のソースコード
|
13
14
|
|
@@ -17,8 +18,8 @@
|
|
17
18
|
super(NetC, self).__init__()
|
18
19
|
self.relu = nn.ReLU()
|
19
20
|
self.conv1 = torch.nn.Conv2d(3, 25, kernel_size = (5, 25))
|
20
|
-
self.pool = torch.nn.MaxPool2d(kernel_size =
|
21
|
+
self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2)
|
21
|
-
self.fc1 = torch.nn.Linear(25 * 14 * 14, 10)
|
22
|
+
self.fc1 = torch.nn.Linear(25 * 14 * 14, 10)
|
22
23
|
|
23
24
|
def forward(self, x):
|
24
25
|
# pass dataframe into conv1
|
@@ -29,9 +30,9 @@
|
|
29
30
|
|
30
31
|
# Run max pooling over x
|
31
32
|
x = self.pool(x)
|
33
|
+
print(x.shape)
|
32
34
|
|
33
|
-
# flatten x
|
35
|
+
# flatten x:おそらくここでエラー発生
|
34
|
-
|
35
36
|
x = x.view(-1, 25 * 14 * 14)
|
36
37
|
print(x.shape)
|
37
38
|
# pass into fully connected linear layer to 10 outputs
|
@@ -42,9 +43,12 @@
|
|
42
43
|
|
43
44
|
### 試したこと
|
44
45
|
|
45
|
-
|
46
|
+
おそらくflattenする際に`x.view()`を用いているこの点が間違っているのかと思います。PyTorchチュートリアルなどを[見ると](https://pytorch.org/tutorials/recipes/recipes/defining_a_neural_network.html)、`torch.flatten`を用いており、こちらの方が良さそうなのですが、まだ少々曖昧なためご教授いただければ幸いです。
|
46
47
|
|
48
|
+
また、その他の実装段階で前提条件に当てはまっていない箇所があればご指摘いただければと思います。
|
49
|
+
|
50
|
+
|
47
51
|
### 補足情報(FW/ツールのバージョンなど)
|
48
52
|
|
49
|
-
こ
|
53
|
+
こちらがCNNのイメージ図です
|
50
54
|

|