【发布时间】:2023-11-12 01:58:01
【问题描述】:
遵循https://medium.com/mlreview/a-guide-to-receptive-field-arithmetic-for-convolutional-neural-networks-e0f514068807 的指南,我正在尝试使用以下代码计算输出特征的数量:
输出:
%reset -f
import torch
import torch.nn as nn
my_tensor = torch.randn((1, 16, 12, 12), requires_grad=False)
print(my_tensor.shape)
update_1 = nn.Conv2d(16, 16, kernel_size=3, stride=2, padding=1)
print(update_1(my_tensor).shape)
是:
torch.Size([1, 16, 12, 12])
torch.Size([1, 16, 6, 6])
torch.Size([1, 16, 6, 6])在应用公式的上下文中是如何计算的:
尝试通过应用公式手动计算输出特征的数量:
stride = 2
padding = 1
kernel_size = 3
# 2304 as n_in = 1 * 16 * 16 * 12
n_out = ((2304 + (2 * padding) - kernel_size) / stride) + 1
print(n_out)
打印:1152.5
但是产生的输出特征数是print(1 * 16 * 6 *6) = 576。我取了1,16,6,6的乘积,因为这是print(update_1(my_tensor).shape)结果的形状
更新:
根据以下问题,我已将代码更新为:
%reset -f
import torch
import torch.nn as nn
from math import floor
stride_value = 2
padding_value = 1
kernel_size_value = 3
number_channels = 3
width = 10
height = 12
my_tensor = torch.randn((1, number_channels, width, height), requires_grad=False)
print(my_tensor.shape)
update_1 = nn.Conv2d(in_channels=number_channels,
out_channels=16,
kernel_size=kernel_size_value,
stride=stride_value,
padding=padding_value)
print(update_1(my_tensor).shape)
n_out = floor((number_channels + (2 * padding_value) - kernel_size_value) / stride_value) + 1
print(n_out)
print(my_tensor.shape) 产生:
torch.Size([1, 3, 10, 12])
print(update_1(my_tensor).shape) 产生:
torch.Size([1, 16, 5, 6])
print(update_1(n_out).shape) 产生:
2
2 与每个维度中的输出特征数不匹配。我是否正确执行了计算?
由于产生的水平特征数量为 5,而产生的垂直特征数量为 6,这个公式是否不适用于特征数量不同的图像,因此具有不同的 x 和 y 轴值长度没有意义?
【问题讨论】:
-
不,按照惯例,二维卷积是在图像平面中完成的,消耗第一个 Conv2D 参数给定的所有通道,并在第二个 Conv2D 参数中产生通道数。查看更新的答案。
标签: deep-learning conv-neural-network pytorch