最近在学习搭建VGG16模块时,发现使用nn.Sequential()
一个不明白的点.代码如下
def vgg_block(conv_nums, in_channels, out_channels):
block = []
for i in range(conv_nums):
if i == 0:
block.append(nn.Conv2d(in_channels, out_channels, 3, 1, 1))
else:
block.append(nn.Conv2d(out_channels, out_channels, 3, 1, 1))
block.append(nn.ReLU())
# 每一个block块结束之后加上最大池化层
block.append(nn.MaxPool2d(2, 2))
return nn.Sequential(*block)
上面没有任何问题,然而当我改写成
def vgg_block(conv_nums, in_channels, out_channels):
block = []
net = nn.Sequential()
for i in range(conv_nums):
if i == 0:
block.append(nn.Conv2d(in_channels, out_channels, 3, 1, 1))
else:
block.append(nn.Conv2d(out_channels, out_channels, 3, 1, 1))
block.append(nn.ReLU())
# 每一个block块结束之后加上最大池化层
block.append(nn.MaxPool2d(2, 2))
return net(*block)
到后面就会报错, python语法还是不牢固,这里net实例化之后,最后的net(*block)
实际上已经开始调用forward()
函数开始前向传播了,我却理解成了继续调用构造方法了.