VGG(
(features): Sequential(
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(1): ReLU(inplace=True)
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(3): ReLU(inplace=True)
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(6): ReLU(inplace=True)
(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(8): ReLU(inplace=True)
(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(11): ReLU(inplace=True)
(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(13): ReLU(inplace=True)
(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(15): ReLU(inplace=True)
(16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(18): ReLU(inplace=True)
(19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(20): ReLU(inplace=True)
(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(22): ReLU(inplace=True)
(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
(24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(25): ReLU(inplace=True)
(26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(27): ReLU(inplace=True)
(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
(29): ReLU(inplace=True)
(30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
)
(avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
(classifier): Sequential(
(0): Linear(in_features=25088, out_features=4096, bias=True)
(1): ReLU(inplace=True)
(2): Dropout(p=0.5, inplace=False)
(3): Linear(in_features=4096, out_features=4096, bias=True)
(4): ReLU(inplace=True)
(5): Dropout(p=0.5, inplace=False)
(6): Linear(in_features=4096, out_features=1000, bias=True)
(add_linear): Linear(in_features=1000, out_features=10, bias=True)
)
)
1、特征层(Features):
顺序层(Sequential),其中包含一系列的卷积层、激活函数和最大池化层。
网络的输入是一个3通道(RGB)图像。
第一个卷积层(Conv2d)具有64个滤波器,卷积核大小为3x3,步长为1x1,填充为1x1。
使用的激活函数是ReLU(修正线性单元)。
这种卷积层后跟ReLU激活的模式被重复多次。
每两个卷积层之后,应用一个最大池化层(MaxPool2d),池化核大小为2x2,步长为2x2。
随着网络加深,滤波器的数量逐渐增加:64、128、256和512。
2、平均池化层(Avgpool):
AdaptiveAvgPool2d层执行自适应平均池化。
它将输入张量调整为固定大小的7x7,同时保持其空间维度。
3、分类器层(Classifier):
顺序层,包含一系列全连接层(Linear)、激活函数(ReLU)和Dropout层。
输入特征的形状是25088,该值来自前面层的输出。
第一个全连接层将输入特征映射到4096维。
然后是ReLU激活和Dropout层,用于增强模型的泛化能力和减少过拟合。
第二个全连接层将输入映射到4096维。
再次应用ReLU激活和Dropout层。
最后一个全连接层将输入映射到1000维,对应于VGG模型最初设计用于ImageNet数据集上的1000个类别。
在模型的末尾,添加了一个额外的线性层(Linear),将1000维的输出映射到10维,用于解决一个10类别的特定任务。