Pytorch中的VGG实现修改最后一层FC( 二 )


features.2.bias 64
features.5.weight 73728
features.5.bias 128
features.7.weight 147456
features.7.bias 128
features.10.weight 294912
features.10.bias 256
features.12.weight 589824
features.12.bias 256
features.14.weight 589824
features.14.bias 256
features.17.weight 1179648
features.17.bias 512
features.19.weight 2359296
features.19.bias 512
features.21.weight 2359296
features.21.bias 512
features.24.weight 4718592
features.24.bias 512
features.26.weight 9437184
features.26.bias 512
features.28.weight 9437184
features.28.bias 512
classifier.0.weight 102760448
classifier.0.bias 4096
classifier.3.weight 16777216
classifier.3.bias 4096
classifier.6.weight 4096000
classifier.6.bias 1000
```
我们可以看到,VGG16模型共有138,357,544个参数,其中大部分集中在最后一个全连接层 。因此,如果我们想要修改VGG的最后一层,我们需要重新定义一个新的全连接层,并将其替换掉原来的全连接层 。
2. 修改VGG的最后一层全连接层
在Pytorch中,我们可以通过以下代码定义一个新的全连接层:
```python
import torch.nn as nn
num_classes = 10 # 修改为自己的分类数
fc = nn.Linear(4096, num_classes)
```
在以上代码中,我们将输出大小修改为了num_classes,以适应自己的任务 。接下来,我们需要将新的全连接层替换掉原来的全连接层,以便于训练和测试我们的模型 。在Pytorch中,我们可以使用以下代码实现:
```python
vgg16.classifier[6] = fc
```
运行以上代码,我们成功地将VGG16模型的最后一个全连接层替换成了新的全连接层 。现在,我们可以使用新的全连接层来训练和测试我们的模型了 。
3. 修改VGG的其他层
除了最后一个全连接层,我们有时候也需要修改VGG的其他层来适应自己的任务 。例如,在目标检测任务中,我们可以将VGG的最后一层全连接层替换成一个卷积层和一个池化层,以便于生成不同大小的特征图 。在Pytorch中,我们可以使用以下代码实现:
```python
import torch.nn as nn
num_classes = 10 # 修改为自己的分类数
class VGG16(nn.Module):
def __init__(self, num_classes):
super(VGG16, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
)
self.avgpool = nn.AdaptiveAvgPool2d((7, 7))

推荐阅读