Tensorflow 计算卷积中填充的公式pytorch(googlenet)
我正在pytorch中从头开始实现googlenet(较小的版本)。架构如下: 对于下采样模块,我有以下代码:Tensorflow 计算卷积中填充的公式pytorch(googlenet),tensorflow,deep-learning,computer-vision,pytorch,Tensorflow,Deep Learning,Computer Vision,Pytorch,我正在pytorch中从头开始实现googlenet(较小的版本)。架构如下: 对于下采样模块,我有以下代码: class DownSampleModule(nn.Module): def __init__(self, in_channel, ch3, w): super(DownSampleModule, self).__init__() kernel_size = 3 padding = (kernel_size-1)/2
class DownSampleModule(nn.Module):
def __init__(self, in_channel, ch3, w):
super(DownSampleModule, self).__init__()
kernel_size = 3
padding = (kernel_size-1)/2
self.branch1 = nn.Sequential(
ConvBlock(in_channel, ch3, kernel_size = 3,stride=2, padding=int(padding))
)
self.branch2 = nn.Sequential(
nn.MaxPool2d(3, stride=2, padding=0, ceil_mode=True)
)
def forward(self, x):
branch1 = self.branch1(x)
branch2 = self.branch2(x)
return torch.cat([padded_tensor, branch2], 1)
ConvBlock来自此模块
class ConvBlock(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride, padding):
super(ConvBlock, self).__init__()
#padding = (kernel_size -1 )/2
#print(padding)
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
self.bn = nn.BatchNorm2d(out_channels)
self.act = nn.ReLU()
def forward(self, x):
x = self.conv(x)
x = self.bn(x)
x = self.act(x)
return x
基本上,我们创建了两个分支:卷积模块和最大池。然后,这两个分支的输出在通道维度上连接
但是,我有以下问题:
- 首先,我们调用
。这两个分支的尺寸相似。这些是:self.pool1=DownSampleModule(in_channel=80,ch3=80,w=30)
- 然而,当我们调用
。维度不同,因此无法将其连接起来self.pool2=DownSampleModule时(在_通道=144,ch3=96,w=15)
在Keras中,您可以只设置padding=“same”或“valid”,但pytorch上不支持它。您的
maxpool
和conv
分支具有相同的输入,如果您为它们提供相同的内核大小、步长和填充参数,它们将产生相同的输出。因此,只需将padding=0
替换为padding=int(padding)
就足以使这两个分支兼容
ceil\u模式
也应设置为False
。当结果维度不是整数时,conv2d
的舍入行为是使用floor
,因此您希望您的maxpool
也这样做
顺便说一下,您可以删除
nn.Sequential
。你的图层“序列”只由一个图层组成,所以。。。不是很连续:)太棒了!非常感谢。你帮了大忙。之前,尽管添加了类似的填充,但尺寸却不相同。我刚刚删除了ceil_mode=True。非常感谢。谢谢你指出,我错过了那个细节。更新了我关于ceil_模式的回答
Downsample Convolution:torch.Size([1, 80, 15, 15])
Maxpool Convolution:torch.Size([1, 80, 15, 15])
Downsample Convolution:torch.Size([1, 96, 8, 8])
Maxpool Convolution:torch.Size([1, 144, 7, 7])