前提・実現したいこと
畳み込みオートエンコーダの学習コードを書いています。
発生している問題・エラーメッセージ
下記のとおり、self.conv1()に入れたXXがTensorではなく、listで入っているとメッセージが表示されました。
<ipython-input-216-3f11070417ff> in train_net(n_epochs, train_loader, valid_loader, net, optimizer_cls, loss_fn, device) 20 #XX.to(device) 21 optimizer.zero_grad() ---> 22 XX_pred = net.forward(XX) #ネットワークで予測 23 loss = loss_fn(XX, XX_pred) #予測データと元のデータの予測 24 loss.backward() <ipython-input-212-a11ed3b9e4db> in forward(self, x) 32 #コメントに28×28のモノクロ画像をi枚を入力した時の次元を示す 33 #encode# #in [i, 1, 50, 100] ---> 34 x = self.relu(self.conv1(x)) #out [i, 8, 50, 100] 35 x = self.pool(x) #out [i, 8, 25, 50] 36 x = self.relu(self.conv2(x)) #out [i, 16, 24, 50] ~\AppData\Local\conda\conda\envs\highself\lib\site-packages\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs) 725 result = self._slow_forward(*input, **kwargs) 726 else: --> 727 result = self.forward(*input, **kwargs) 728 for hook in itertools.chain( 729 _global_forward_hooks.values(), ~\AppData\Local\conda\conda\envs\highself\lib\site-packages\torch\nn\modules\conv.py in forward(self, input) 421 422 def forward(self, input: Tensor) -> Tensor: --> 423 return self._conv_forward(input, self.weight) 424 425 class Conv3d(_ConvNd): ~\AppData\Local\conda\conda\envs\highself\lib\site-packages\torch\nn\modules\conv.py in _conv_forward(self, input, weight) 417 weight, self.bias, self.stride, 418 _pair(0), self.dilation, self.groups) --> 419 return F.conv2d(input, weight, self.bias, self.stride, 420 self.padding, self.dilation, self.groups) 421 TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not list
該当のソースコード
まず、data_trainという変数に、numpy.ndarray型でデータを格納しております。
これを、3行目によって、pytorchのTensorに変換しました。
4行目、5行目でDataset, DataLoaderを作成しています。
3行目のTensorへの変換前にdata_trainの方を調べても、numpy.ndarrayで出てくるので、なぜこれがリストとして読み込まれることになるのか(なぜ上記のエラーメッセージが表示されるのか)、ご教示いただきたいです。
batch_size = 64 print(data_train.dtype) data_train = torch.FloatTensor(data_train) Dataset_train = torch.utils.data.TensorDataset(data_train) train_loader = torch.utils.data.DataLoader(Dataset_train, batch_size=batch_size, shuffle=True)
オートエンコーダクラスは下記のように定義しています。
forwardアトリビュートで畳み込み演算を決めていますが、この1番最初でエラーが出ているようです。
class ConvAutoencoder(nn.Module): def __init__(self): super(ConvAutoencoder, self).__init__() #Encoder Layers self.conv1 = nn.Conv2d(in_channels = 1, out_channels = 8, kernel_size = 3, padding = 1, stride = 1) self.conv2 = nn.Conv2d(in_channels = 8, out_channels = 16, kernel_size = (4,3), padding = (1,1), stride = (1,1)) self.conv3 = nn.Conv2d(in_channels = 16, out_channels = 16, kernel_size = (3,4), padding = (1,1), stride = (1,1)) self.conv4 = nn.Conv2d(in_channels = 16, out_channels = 8, kernel_size = 3, padding = 1, stride = 1) #Decoder Layers self.t_conv1 = nn.ConvTranspose2d(in_channels = 8, out_channels = 16, kernel_size = 2, stride = 2) self.t_conv2 = nn.ConvTranspose2d(in_channels = 16, out_channels = 16, kernel_size = 2, stride = 2) self.t_conv3 = nn.ConvTranspose2d(in_channels = 16, out_channels = 8, kernel_size = 2, stride = 2) self.t_conv4 = nn.ConvTranspose2d(in_channels = 8, out_channels = 1, kernel_size = (4,6), stride = (2,2)) self.relu = nn.ReLU() self.pool = nn.MaxPool2d(2, 2) self.sigmoid = nn.Sigmoid() self.tanh = nn.Tanh() def forward(self, x): #コメントに28×28のモノクロ画像をi枚を入力した時の次元を示す #encode# #in [i, 1, 50, 100] x = self.relu(self.conv1(x)) #out [i, 8, 50, 100] x = self.pool(x) #out [i, 8, 25, 50] x = self.relu(self.conv2(x)) #out [i, 16, 24, 50] x = self.pool(x) #out [i ,16, 12, 25] x = self.relu(self.conv3(x)) #out [i, 16, 12, 24] x = self.pool(x) #out [i ,16, 6, 12] x = self.relu(self.conv3(x)) #out [i, 8, 6, 12] x = self.pool(x) #out [i ,8, 3, 6] #decode# #in [i ,8, 3, 6] x = self.relu(self.t_conv1(x)) #out [i, 16, 6, 12] x = self.relu(self.t_conv2(x)) #out [i, 16, 12, 24] x = self.relu(self.t_conv3(x)) #out [i, 8, 24, 48] x = self.t_conv4(x) #out [i, 1, 50, 100] return x
補足情報(FW/ツールのバージョンなど)
Pythonのバージョンは3.8.5, Pytorchのバージョンは1.7.1です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。