我正在研究深度学习研究论文,从AlexNet开始,我发现 PyTorch 和 Tensorflow 的实现存在我无法解释的差异。
在研究论文中,他们定义了模型架构:
第一个卷积层使用96 个大小为 11x11x3的内核过滤224x224x3输入图像, 步长为 4 像素(这是内核映射中相邻神经元的感受野中心之间的距离)。
第二个卷积层将第一个卷积层的(响应归一化和池化)输出作为输入,并使用256 个大小为 5x5x 的内核对其进行过滤。
第三、第四和第五卷积层相互连接,没有任何中间池化层或归一化层。
第三个卷积层有384 个大小为 3x3x256 的内核,连接到第二个卷积层的(归一化、池化)输出。
第四个卷积层有384 个大小为 3x3x192 的内核
第五个卷积层有256 个大小为 3x3x192 的内核。
注意:不包括全连接层
这是模型的PyTorch 实现:
# 1st Layer
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
# 2nd Layer
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
# 3rd Layer
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
# 4th Layer
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
# 5th Layer
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2)
# 1st layer
net = slim.conv2d(inputs, 64, [11, 11], 4, padding='VALID', scope='conv1')
net = slim.max_pool2d(net, [3, 3], 2, scope='pool1')
# 2nd layer
net = slim.conv2d(net, 192, [5, 5], scope='conv2')
net = slim.max_pool2d(net, [3, 3], 2, scope='pool2')
# 3rd layer
net = slim.conv2d(net, 384, [3, 3], scope='conv3')
# 4th layer
net = slim.conv2d(net, 384, [3, 3], scope='conv4')
# 5th layer
net = slim.conv2d(net, 256, [3, 3], scope='conv5')
net = slim.max_pool2d(net, [3, 3], 2, scope='pool5')
注意:Tensorflow 将 ReLU 激活应用于每一层
为什么这两种实现都有一个内核为 64 的第一层,而论文中提到了一个 92 的内核?
为什么这两种实现都有第二层内核为 192,而论文提到内核为 256?
[PyTorch] 为什么第 1 层和第 2 层有 2 的填充?
[PyTorch] 为什么第 4 层有一个 256 的内核,而它应该是大小为 384 的内核