问题描述

当阅读神经网络代码时,经常会有很多各种各样的层,比如有一个这样的卷积层 nn.Conv2d(3, 48, kernel_size=5, stride=2, padding=0),我想知道在执行完这行代码后,输出的张量维度为多少。

已知输入维度是 (224, 224, 3),分别表示 (width, height, channel)

问题解决

import torch.nn as nn
import torch
conv = nn.Conv2d(3, 48, kernel_size=5, stride=2, padding=0) # 卷积层
# 构建一个维度正确的输入
x = torch.rand(1, 3, 224, 224)
res = conv(x)
print(res.shape) # 输出 torch.Size([1, 48, 110, 110])

卷积层输出张量维度计算公式

Conv2d:output = ((input_size - kernel_size + 2 * padding) / stride ) + 1 向下取整

举例:

如果输入维度是 (224, 224, 3),卷积层为 nn.Conv2d(in_channels=3, out_channels=48, kernel_size=5, stride=2, padding=0),计算公式如下:

(224-5+2*0)/2+1 =110.5

所以输出的维度就是 (110, 110, 48)

最大池化层输出张量维度计算公式

MaxPool2d:(input_size - kernel_size) / stride + 1 向下取整

举例

如果输入维度为 (106, 106, 96),最大池化层为 nn.MaxPool2d(kernel_size=3, stride=2),计算公式如下:

(106-3)/2+1=52.5

所以输出的维度就是 (52, 52, 96)

代码验证如下:
x = torch.rand(96, 106, 106)
maxpooling = nn.MaxPool2d(kernel_size=3, stride=2)
res = maxpooling(x)
print(res.shape)	# 输出结果为 torch.Size([96, 52, 52])

多个卷积或池化层的网络

import torch.nn as nn
import torch

# 网络结构
net = nn.Sequential(
	nn.Conv2d(3, 48, kernel_size=5, stride=2, padding=0), # 卷积层 (224, 224, 3) -> (110, 110, 48)
	nn.MaxPool2d(kernel_size=3, stride=2)	# (110, 110, 48) -> (54, 54, 48)
)
# 构建输入
x = torch.rand(1, 3, 224, 224)
# 将输入特征向量送入网络
res = net (x)	# torch.Size([1, 48, 54, 54])
Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐