やりたいこと
以下の記事を参考にしてcifar10の精度向上を測ったところ80%を超える精度を確認できた
該当記事
しかし、わからない該当箇所などを調べたり使い方なんかを見ていましたが、自分の無知かつググり力のなさからこの構造がどうなっているのかが理解できないので、ある程度の解説をしていただけるとありがたいと思っています。
該当ソースコード(ネットワーク部分のみ)
class Net(nn.Module): def __init__(self, input_size, num_class): super(Net, self).__init__() self.conv1 = nn.Conv2d(3, 64, 3) self.bn1 = nn.BatchNorm2d(64) self.conv2 = nn.Conv2d(64, 64, 3) self.conv3 = nn.Conv2d(64, 64, 3) self.do1 = nn.Dropout2d(p=0.3) self.pool = nn.MaxPool2d(2, 2) self.conv4 = nn.Conv2d(64, 128, 3) self.bn2 = nn.BatchNorm2d(128) self.conv5 = nn.Conv2d(128, 128, 3) self.conv6 = nn.Conv2d(128, 128, 3) #self.pool = nn.Maxpool2d(2,2) self.conv7 = nn.Conv2d(128, 256, 3) self.conv8 = nn.Conv2d(256, 256, 3) self.conv9 = nn.Conv2d(256, 256, 3) #self.pool = nn.Maxpool2d(2,2) self.conv10 = nn.Conv2d(256,100,1) self.bn3 = nn.BatchNorm2d(256) self.conv11 = nn.Conv2d(100, 10, 4) self.zeropad = nn.ConstantPad2d(1, 0) def forward(self, x): x = F.relu(self.conv1(self.zeropad(x)))#32*32 x = self.bn1(x) x = F.relu(self.conv2(self.zeropad(x))) x = self.do1(x) x = self.pool(F.relu(self.conv3(self.zeropad(x))))#16*16 x = F.relu(self.conv4(self.zeropad(x))) x = self.bn2(x) x = self.do1(x) x = F.relu(self.conv5(self.zeropad(x))) x = self.pool(F.relu(self.conv6(self.zeropad(x))))#8*8 x = F.relu(self.conv7(self.zeropad(x))) x = self.bn3(x) x = self.do1(x) x = F.relu(self.conv8(self.zeropad(x))) x = self.pool(F.relu(self.conv9(self.zeropad(x))))#4*4 x = self.bn3(x) x = self.do1(x) x = F.relu(self.conv10(x)) x = self.conv11(x) x = x.view(-1, 10) return x net = Net(32,10).to(device) #Netクラスのインスタンスを生成、to(device)でどこで計算するかを指定 summary(net, (3, 32, 32)) # ネットワークのサマリを出力
疑問点(解消したいこと)
全部を全部というわけにもいかないので、以下に主な疑問点をまとめました。
すべてでなくて構いませんのでどうかよろしくお願いします
<主な疑問点>
<initにおいて>
・conv1,bn1,conv2ときたらconv3,そしてdo1,ここでpool
というように並びに法則性がなく、どういうタイミングでbn、doなどを入れるべきなのかわかりません。
・batchnorm2dやdropoutの使う意味や、どういう使い方をすればいいのかがわかりません。
・最後にself.zeropad = nn.ConstantPad2d(1,0)
と入れていますが、どういう意図でこの関数を使うのかがわかりません
<forwardにおいて>
基本的にinitとつながるところがあります。
・zeropad →conv1 → relu → bn1 と来たと思ったら、次では、zeropad →conv2 → relu → do1 と来ています。疑問です。
このときの流れというか、やっぱりbachnorm2d,doropoutの使うタイミングや使用方法がわからないです。
・そのあとのなんかは、bn2→do1とつながっていたりします。もう訳が分かりません。
自分なりに調べたこと
・batchnorm2d
・dropout
・ConstantPad2d
この辺がわからなかったので調べてみました。
こちらの記事でbatchnorm2dとdropoutについては何となくわかりましたが、今回の構造でどう働いているのかがわからないです。
公式document
batchnorm2d
dropout
ConstantPad2d
文法上、関数の使い方はわかりましたが今回の構造では、どこにどう組み込めばいいのかわかりません
あなたの回答
tips
プレビュー