?以分類模型的VGG為例
?
vgg16_false = torchvision.models.vgg16(weights=False)
vgg16_true = torchvision.models.vgg16(weights=True)
- 設(shè)置為 False 的情況,相當(dāng)于網(wǎng)絡(luò)模型中的參數(shù)都是初始化的、默認(rèn)的
- 設(shè)置為 True 時(shí),網(wǎng)絡(luò)模型中的參數(shù)在數(shù)據(jù)集上是訓(xùn)練好的,能達(dá)到比較好的效果
print(vgg16_true)
VGG(
(features): Sequential(
# 輸入圖片先經(jīng)過(guò)卷積,輸入是3通道的、輸出是64通道的,卷積核大小是3×3的
(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)
# 最后線性層輸出為1000(vgg16也是一個(gè)分類模型,能分出1000個(gè)類別)
(6): Linear(in_features=4096, out_features=1000, bias=True)
)
)
CIFAR10 把數(shù)據(jù)分成了10類,而 vgg16 模型把數(shù)據(jù)分成了 1000 類,如何應(yīng)用這個(gè)網(wǎng)絡(luò)模型呢?
- 方法1:把最后線性層的 out_features 從1000改為10
- 方法2:在最后的線性層下面再加一層,in_features為1000,out_features為10
利用現(xiàn)有網(wǎng)絡(luò)去改動(dòng)它的結(jié)構(gòu),避免寫(xiě) vgg16。很多框架會(huì)把 vgg16 當(dāng)做前置的網(wǎng)絡(luò)結(jié)構(gòu),提取一些特殊的特征,再在后面加一些網(wǎng)絡(luò)結(jié)構(gòu),實(shí)現(xiàn)功能。
方法2:添加
vgg16_true.classifier.add_module("add_linear",nn.Linear(1000,10))
print(vgg16_true)
?方法1:修改文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-662952.html
vgg16_false.classifier[6] = nn.Linear(4096,10)
print(vgg16_false)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-662952.html
到了這里,關(guān)于PyTorch學(xué)習(xí)筆記(十三)——現(xiàn)有網(wǎng)絡(luò)模型的使用及修改的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!