PytorchでCNNの全結合層の入力サイズ(shape)を確かめる方法
Pytorchでは、CNNで畳み込み層の最終層の出力=全結合層の入力のサイズ(shape)を自動的に決めてくれません。
Kerasの場合は、自動的に求めてくれるので、楽です。
では、CNNで畳み込み層の最終層の出力のshapeはどのように求めればよいでしょうか。
CNNの畳み込み演算のサイズ変換は次のページで紹介しています。
畳み込み演算のサイズ変換式
実際に学習させるプログラムは、PytorchでCNNで紹介しています。
畳み込み層だけのネットワークで順伝播
畳み込み層だけのネットワークを定義します。
そのあとに、そのネットワークで順伝播させ、その出力から、shapeを確認します。
下のクラスでは、畳み込み層の出力のshapeを確認するためのメソッドも用意しています。
ネットワークの定義
ネットワークの定義は、conv層とdence層に分けて、Sequentialを使って定義します。
そのあと、このconv層を利用して、畳み込み層の出力サイズを確認します。(check_cnn_sizeメソッド)
#ネットワークの定義 class net(nn.Module): def __init__(self): super(net,self).__init__() #畳み込み層 self.conv_layers = nn.Sequential( nn.Conv2d(in_channels = 1, out_channels = 16, kernel_size = 2, stride=1, padding=0), nn.Conv2d(in_channels = 16, out_channels = 32, kernel_size = 2, stride=1, padding=0), ) #全結合層 self.dence = nn.Sequential( #ここの入力サイズがわからない。 nn.Linear('わからない', 128), nn.Dropout(p=0.2), nn.Linear(128, 64), nn.Dropout(p=0.2), nn.Linear(64, 10), ) #順伝播 def forward(self,x): out = self.conv_layers(x) #Flatten out = out.view(out.size(0), -1) #全結合層 out = self.dence(out) return out #畳み込み層の出力サイズのチェック def check_cnn_size(self, size_check): out = self.conv_layers(size_check) return out
畳み込み層の出力サイズを確認する
ネットワークの定義で作った、check_cnn_sizeメソッドで、畳み込み層の出力サイズを確認します。
#デバイスの選択 device = 'cuda' if torch.cuda.is_available() else 'cpu' #ネットワークの初期化 net = net().to(device) #畳み込み層の入力サイズと同じサイズのデータを用意 size_check = torch.FloatTensor(10, 1, 8, 8) size_check = size_check.to(device) #畳み込み層の出力サイズを確認 print(net.check_cnn_size(size_check).size())
以上のプログラムを実行すると、
torch.Size([10, 32, 6, 6])
と出力されます。
CNNのshapeは、(batch_size, channel, W, H)となっています。
全結合層の入力サイズは、channel*W*Hとなることが確認できました。
全結合層の入力サイズを計算する
前の手順で、
畳み込み層サイズ(shape)は、(batch_size, channel, W, H)となっています。
したがって、全結合層の入力サイズは、channel*W*Hとなることが確認できました。
なので、このプログラムにおいて、全結合層の入力サイズは、(32 * 6 * 6)になります。
全結合層の定義を決定しましょう。
#全結合層 self.dence = nn.Sequential( #ここの入力サイズがわからない。 #nn.Linear('わからない', 128), #(32 * 6 * 6)だとわかった! nn.Linear(32*6*6, 128), nn.Dropout(p=0.2), nn.Linear(128, 64), nn.Dropout(p=0.2), nn.Linear(64, 10), )