質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

Q&A

解決済

1回答

1187閲覧

【Pytorch】conv2dでのエラー

Y_Miz

総合スコア3

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

0グッド

1クリップ

投稿2021/06/18 01:52

前提・実現したいこと

畳み込みオートエンコーダの学習コードを書いています。

発生している問題・エラーメッセージ

下記のとおり、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です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

リストの要素数が1で、この中にtorch.tensorが入っていました。
conv2dに渡す変数を(変数名)から(変数名)[0]に変更して、解決できました。

投稿2021/06/20 23:32

Y_Miz

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問