1.为什么使用汇聚层:用来减小网络输出大小,同时进行相应的特征提取
1-1:平均汇聚层和最大汇聚层:平均用于对更加细化的特征进行提取检测,最大用于对突出特征进行提取检测。平均:图像分割(需要细致描形),场景分类(一个场景由大量细小特征构成):细,广。最大:识别场景中的物体(具有突出特征),图像分类(特征较少,且鲜明):特征少而突出
1-2:为什么不在做卷积层的时候把输出做少从而不使用汇聚层:1.汇聚层相当于对细化程度更高的特征图进行浓缩,而不是直接减少特征图细化程度2.还可以有效增大感应视野(层数越多,感应视野越大)
2.一般都是一个卷积加激活再加一个汇聚,也有例外:
nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(), nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=3, stride=2),
三层卷积才加汇聚,保持了网络输入输出通道,图形尺寸一致,又增加了网络深度,提高了性能。
3.可以循环生成自定义输出通道以及可指定层数的卷积块——vgg:可以用于轻松构建更复杂的网络。
def vgg_block(num_convs, in_channels, out_channels): layers = [] for _ in range(num_convs): layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)) layers.append(nn.ReLU()) in_channels = out_channels layers.append(nn.MaxPool2d(kernel_size=2,stride=2)) return nn.Sequential(*layers)
参数1,指定卷积层数目,参数二指定输入层数目,参数三指定输出层数目。
块的特定:一:kernel_size=3, padding=1,使得输入输出图片尺寸不变,使得输出结果具有规律性。
二:in_channels = out_channels,确保每两个卷积层之间可以衔接。
三:layers.append(nn.MaxPool2d(kernel_size=2,stride=2)),使得每次块的输出结果图片尺寸为原来的一半。
解释:问题1:这里作者在之后选择了
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))这样一组参数构造了想要的含有五个vgg块的vgg网络,为什么书本作者选择了使得通道数越来越多的策略:
区分:通道数递增:增加网络的特征识别能力,可以提取更多的更丰富的特征,增加模型精确度
通道数递减:防止过拟合,加快运算
两种策略都可&