AlexNet 研究论文 VS PytTorch 和 Tensorflow 实现

数据挖掘 深度学习 张量流 火炬 亚历克斯网
2022-02-11 21:48:50

我正在研究深度学习研究论文,从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)

以及Tensorflow 的实现

# 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 的内核

0个回答
没有发现任何回复~