前提・実現したいこと
PyTorchを用いてCNN(畳み込みニューラルネットワーク)の実装を進めておりますが、CNNへの理解が乏しく上手く実装できておりません。
前提
- Convolution Layerにはカーネルのサイズを width = 5, depth = 25を利用
- ReLu活性化関数を利用
- max-poolにはカーネルサイズを width = 2, stride = 2を利用
- Flatten作業にてimageをvectorに変更
- Fully-connected linearレイヤーには10個のアウトプットを生成
現状のエラーメッセージ
RuntimeError: shape '[-1, 4900]' is invalid for input of size 140000
なお、CNNネットワークは以下のtrain関数で学習させています。以下の通り、CNNを学習させる段階でエラーです。
def train(net, train_loader, test_loader, num_epochs=NUM_EPOCHS, learning_rate=LEARNING_RATE, compute_accs=False): criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate) train_accs = [] test_accs = [] for epoch in range(1, num_epochs + 1): batch_num = 1 for images, labels in train_loader: # If you are using a GPU, speed up computation by moving values to the GPU if torch.cuda.is_available(): net = net.cuda() images = images.cuda() labels = labels.cuda() optimizer.zero_grad() outputs = net(images) # CNNを学習させるこの段階でエラー loss = criterion(outputs, labels) loss.backward() optimizer.step()
該当のソースコード
python
1class NetC(nn.Module): 2 def __init__(self): 3 super(NetC, self).__init__() 4 self.relu = nn.ReLU() 5 self.conv1 = torch.nn.Conv2d(3, 25, kernel_size = (5, 25)) 6 self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2) 7 self.fc1 = torch.nn.Linear(25 * 14 * 14, 10) 8 9 def forward(self, x): 10 # pass dataframe into conv1 11 x = self.conv1(x) 12 print(x.shape) 13 # use relu function to x 14 x = self.relu(x) 15 # Run max pooling over x 16 x = self.pool(x) 17 print(x.shape) 18 # flatten x:おそらくここでエラー発生 19 x = x.view(-1, 25 * 14 * 14) 20 print(x.shape) 21 # pass into fully connected linear layer to 10 outputs 22 x = self.relu(self.fc1(x)) 23 24 return x
試したこと
おそらくflattenする際にx.view()
を用いているこの点が間違っているのかと思います。PyTorchチュートリアルなどを見ると、torch.flatten
を用いており、こちらの方が良さそうなのですが、まだ少々曖昧なためご教授いただければ幸いです。
また、その他の実装段階で前提条件に当てはまっていない箇所があればご指摘いただければと思います。
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー