概述
问题描述:
pytoch中没有像tensorflow里面,卷积层的padding设置为same之类的操作。而且论文当中很多都不会写padding设置是多少。现在我来记录一下如何根据模型来计算出每个卷积层的padding值的设置。
一般来讲,根据卷积的原理,输入的大小和输出的大小之间的关系由如下公式表示:
out_size=(input_size - kernerl_size + 2*padding)/stride +1
在GitHub上我看到一个模型,标注了每个输入的size大小。可以很好的作为一个例子:
class NetD(nn.Module):
def __init__(self):
super(_NetD, self).__init__()
self.features = nn.Sequential(
# input is (3) x 96 x 96
nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
# state size. (64) x 96 x 96
nn.Conv2d(in_channels=64, out_channels=64, kernel_size=4, stride=2, padding=1, bias=False),
nn.BatchNorm2d(64),
nn.LeakyReLU(0.2, inplace=True),
# state size. (64) x 48 x 48
nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1, bias=False),
nn.BatchNorm2d(128),
nn.LeakyReLU(0.2, inplace=True),
# state size. (64) x 48 x 48
nn.Conv2d(in_channels=128, out_channels=128, kernel_size=4, stride=2, padding=1, bias=False),
nn.BatchNorm2d(128),
nn.LeakyReLU(0.2, inplace=True),
# state size. (128) x 24 x 24
nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1, padding=1, bias=False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace=True),
# state size. (256) x 24 x 24
nn.Conv2d(in_channels=256, out_channels=256, kernel_size=4, stride=2, padding=1, bias=False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace=True),
# state size. (256) x 12 x 12
nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, stride=1, padding=1, bias=False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace=True),
# state size. (512) x 12 x 12
nn.Conv2d(in_channels=512, out_channels=512, kernel_size=4, stride=2, padding=1, bias=False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace=True),
# out size. (512) x 6 x 6
)
self.LeakyReLU = nn.LeakyReLU(0.2, inplace=True)
self.fc1 = nn.Linear(512 * 6 * 6, 1024)
self.fc2 = nn.Linear(1024, 1)
self.sigmoid = nn.Sigmoid()
for m in self.modules():
if isinstance(m, nn.Conv2d):
m.weight.data.normal_(0.0, 0.02)
elif isinstance(m, nn.BatchNorm2d):
m.weight.data.normal_(1.0, 0.02)
m.bias.data.fill_(0)
def forward(self, input):
out = self.features(input)
# state size. (512) x 6 x 6
out = out.view(out.size(0), -1)
# state size. (512 x 6 x 6)
out = self.fc1(out)
# state size. (1024)
out = self.LeakyReLU(out)
out = self.fc2(out)
out = self.sigmoid(out)
return out.view(-1, 1).squeeze(1)
上面的注释,都标注了当前的每一个图像经过卷积之后的大小。
model= NetD()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
summary(model,input_size=(3,96,96))
我用summary输入(3,96,96)大小的数据,输出每个层数的大小,结果如下所示:
padding计算
如果论文或者模型的结构数据只给了卷积核kernel大小和步长stride.那么我们可以根据公式和输入输出的大小,设置padding值为未知数,反解出来即可。
最后
以上就是外向小猫咪为你收集整理的Pytorch的padding值确定方法问题描述:padding计算的全部内容,希望文章能够帮你解决Pytorch的padding值确定方法问题描述:padding计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复