官方文档的torchvision截图,classification分类、Semantic Segmentation语义分割、Object Detection目标检测
VGG
一个分类模型
如果pretrained设置为true,就是说这个VGG模型用他们官方的一个数据集ImageNet预训练好了,预训练好了的效果是什么呢?就是里面的一些模型参数被改好了,那就需要一些时间加载/下载这个模型。
如下
Downloading: "https://download.pytorch.org/models/vgg16-397923af.pth"
to /Users/bbing517/.cache/torch/hub/checkpoints/vgg16-397923af.pth
4%|██▍ |
19.4M/528M [00:08<03:48, 2.33MB/s]
如果pretrained是false,那模型的参数就是默认的参数。
不用download
对比,第一张是输出true的
输出false
发现输出一样,不知道为啥。??
但是可以知道VGG16是一个1000类的分类器,然后我们之前用的数据集是CIFAR10,是把数据分成10类。
那如何用现有的网络VGG,完成10类分类呢?
方法一:把VGG的最后的out_features改成10
方法二:在VGG后面再加多一个东西,1000的输入,10的输出
很多论文也会把VGG16作为一个前置网络,通过它来提取数据的一些特征。
import scipy
import torchvision
vgg16_false = torchvision.models.vgg16(pretrained=False)
vgg16_true = torchvision.models.vgg16(pretrained=True)
print(vgg16_true)
train_data = torchvision.datasets.CIFAR10("./神经网络",train = False,
transform = torchvision.transforms.ToTensor(),
download = True)
#在整个vgg16外面加
vgg16_true.add_module('add_linear',nn.Linear(1000,10))#这层名字叫'add_linear'
print(vgg16_true)
#在那个classifier里面加
vgg16_true.classifier.add_module('7add_linear',nn.Linear(1000,10))#这层名字叫'7add_linear'
#print(vgg16_true)
原来的VGG16
在整个vgg16外面加
在classifier里加
如果用那个方法1呢?就是把classifier的6的out_feature改成10呢
也可以,我们用flase那版改
vgg16_false.classifier[6] = nn.Linear(4096,10)