计算全连接层的尺寸?
Calculating dimensions of fully connected layer?
我正在努力研究如何计算全连接层的尺寸。我正在使用批量大小 (16) 输入 (448x448) 的图像。下面是我的卷积层的代码:
class ConvolutionalNet(nn.Module):
def __init__(self, num_classes=182):
super().__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(3, 16, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer2 = nn.Sequential(
nn.Conv2d(16, 32, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer3 = nn.Sequential(
nn.Conv2d(32, 32, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer4 = nn.Sequential(
nn.Conv2d(32, 64, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer5 = nn.Sequential(
nn.Conv2d(64, 64, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
我要添加一个全连接层:
self.fc = nn.Linear(?, num_classes)
谁能解释计算这个的最佳方法?另外,如果我有多个完全连接的层,例如(self.fc2, self.fc3),第二个参数是否总是等于类的个数。我是编码新手,发现很难解决这个问题。
conv 层不会更改特征的 width/height,因为您已将 padding
设置为 (kernel_size - 1) / 2
。 kernel_size = stride = 2
的最大池化将使 width/height 减少 2
倍(如果输入形状不均匀则向下舍入)。
使用 448
作为输入 width/height,输出 width/height 将是 448 // 2 // 2 // 2 // 2 // 2 = 448/32 = 14
(其中 //
是 floor-divide 运算符)。
通道数完全由最后一个conv层决定,它输出64
个通道。
因此你会有一个 [B,64,14,14]
形状的张量,所以 Linear
层应该有 in_features = 64*14*14 = 12544
.
请注意,您需要事先展平输入,例如。
self.layer6 = nn.Sequential(
nn.Flatten(),
nn.Linear(12544, num_classes)
)
我正在努力研究如何计算全连接层的尺寸。我正在使用批量大小 (16) 输入 (448x448) 的图像。下面是我的卷积层的代码:
class ConvolutionalNet(nn.Module):
def __init__(self, num_classes=182):
super().__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(3, 16, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer2 = nn.Sequential(
nn.Conv2d(16, 32, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer3 = nn.Sequential(
nn.Conv2d(32, 32, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer4 = nn.Sequential(
nn.Conv2d(32, 64, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
self.layer5 = nn.Sequential(
nn.Conv2d(64, 64, kernal_size=5, stride=1, padding=2),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(kernal_size=2, stride=2)
)
我要添加一个全连接层:
self.fc = nn.Linear(?, num_classes)
谁能解释计算这个的最佳方法?另外,如果我有多个完全连接的层,例如(self.fc2, self.fc3),第二个参数是否总是等于类的个数。我是编码新手,发现很难解决这个问题。
conv 层不会更改特征的 width/height,因为您已将 padding
设置为 (kernel_size - 1) / 2
。 kernel_size = stride = 2
的最大池化将使 width/height 减少 2
倍(如果输入形状不均匀则向下舍入)。
使用 448
作为输入 width/height,输出 width/height 将是 448 // 2 // 2 // 2 // 2 // 2 = 448/32 = 14
(其中 //
是 floor-divide 运算符)。
通道数完全由最后一个conv层决定,它输出64
个通道。
因此你会有一个 [B,64,14,14]
形状的张量,所以 Linear
层应该有 in_features = 64*14*14 = 12544
.
请注意,您需要事先展平输入,例如。
self.layer6 = nn.Sequential(
nn.Flatten(),
nn.Linear(12544, num_classes)
)