日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等)

發(fā)布時間:2024/9/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

版權聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/whut_ldz/article/details/78845947
一、pytorch中的pre-train模型
卷積神經網絡的訓練是耗時的,很多場合不可能每次都從隨機初始化參數開始訓練網絡。
pytorch中自帶幾種常用的深度學習網絡預訓練模型,如VGG、ResNet等。往往為了加快學習的進度,在訓練的初期我們直接加載pre-train模型中預先訓練好的參數,model的加載如下所示:

import torchvision.models as models
?
#resnet
model = models.ResNet(pretrained=True)
model = models.resnet18(pretrained=True)
model = models.resnet34(pretrained=True)
model = models.resnet50(pretrained=True)
?
#vgg
model = models.VGG(pretrained=True)
model = models.vgg11(pretrained=True)
model = models.vgg16(pretrained=True)
model = models.vgg16_bn(pretrained=True)
二、預訓練模型的修改
1.參數修改
對于簡單的參數修改,這里以resnet預訓練模型舉例,resnet源代碼在Github點擊打開鏈接。
resnet網絡最后一層分類層fc是對1000種類型進行劃分,對于自己的數據集,如果只有9類,修改的代碼如下:
# coding=UTF-8
import torchvision.models as models
?
#調用模型
model = models.resnet50(pretrained=True)
#提取fc層中固定的參數
fc_features = model.fc.in_features
#修改類別為9
model.fc = nn.Linear(fc_features, 9)

2.增減卷積層
前一種方法只適用于簡單的參數修改,有的時候我們往往要修改網絡中的層次結構,這時只能用參數覆蓋的方法,即自己先定義一個類似的網絡,再將預訓練中的參數提取到自己的網絡中來。這里以resnet預訓練模型舉例。
# coding=UTF-8
import torchvision.models as models
import torch
import torch.nn as nn
import math
import torch.utils.model_zoo as model_zoo
?
class CNN(nn.Module):
?
? ? def __init__(self, block, layers, num_classes=9):
? ? ? ? self.inplanes = 64
? ? ? ? super(ResNet, self).__init__()
? ? ? ? self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bias=False)
? ? ? ? self.bn1 = nn.BatchNorm2d(64)
? ? ? ? self.relu = nn.ReLU(inplace=True)
? ? ? ? self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
? ? ? ? self.layer1 = self._make_layer(block, 64, layers[0])
? ? ? ? self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
? ? ? ? self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
? ? ? ? self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
? ? ? ? self.avgpool = nn.AvgPool2d(7, stride=1)
? ? ? ? #新增一個反卷積層
? ? ? ? self.convtranspose1 = nn.ConvTranspose2d(2048, 2048, kernel_size=3, stride=1, padding=1, output_padding=0, groups=1, bias=False, dilation=1)
? ? ? ? #新增一個最大池化層
? ? ? ? self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
? ? ? ? #去掉原來的fc層,新增一個fclass層
? ? ? ? self.fclass = nn.Linear(2048, num_classes)
?
? ? ? ? for m in self.modules():
? ? ? ? ? ? if isinstance(m, nn.Conv2d):
? ? ? ? ? ? ? ? n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
? ? ? ? ? ? ? ? m.weight.data.normal_(0, math.sqrt(2. / n))
? ? ? ? ? ? elif isinstance(m, nn.BatchNorm2d):
? ? ? ? ? ? ? ? m.weight.data.fill_(1)
? ? ? ? ? ? ? ? m.bias.data.zero_()
?
? ? def _make_layer(self, block, planes, blocks, stride=1):
? ? ? ? downsample = None
? ? ? ? if stride != 1 or self.inplanes != planes * block.expansion:
? ? ? ? ? ? downsample = nn.Sequential(
? ? ? ? ? ? ? ? nn.Conv2d(self.inplanes, planes * block.expansion,
? ? ? ? ? ? ? ? ? ? ? ? ? kernel_size=1, stride=stride, bias=False),
? ? ? ? ? ? ? ? nn.BatchNorm2d(planes * block.expansion),
? ? ? ? ? ? )
?
? ? ? ? layers = []
? ? ? ? layers.append(block(self.inplanes, planes, stride, downsample))
? ? ? ? self.inplanes = planes * block.expansion
? ? ? ? for i in range(1, blocks):
? ? ? ? ? ? layers.append(block(self.inplanes, planes))
?
? ? ? ? return nn.Sequential(*layers)
?
? ? def forward(self, x):
? ? ? ? x = self.conv1(x)
? ? ? ? x = self.bn1(x)
? ? ? ? x = self.relu(x)
? ? ? ? x = self.maxpool(x)
?
? ? ? ? x = self.layer1(x)
? ? ? ? x = self.layer2(x)
? ? ? ? x = self.layer3(x)
? ? ? ? x = self.layer4(x)
?
? ? ? ? x = self.avgpool(x)
? ? ? ? #新加層的forward
? ? ? ? x = x.view(x.size(0), -1)
? ? ? ? x = self.convtranspose1(x)
? ? ? ? x = self.maxpool2(x)
? ? ? ? x = x.view(x.size(0), -1)
? ? ? ? x = self.fclass(x)
?
? ? ? ? return x
?
#加載model
resnet50 = models.resnet50(pretrained=True)
cnn = CNN(Bottleneck, [3, 4, 6, 3])
#讀取參數
pretrained_dict = resnet50.state_dict()
model_dict = cnn.state_dict()
# 將pretrained_dict里不屬于model_dict的鍵剔除掉
pretrained_dict = ?{k: v for k, v in pretrained_dict.items() if k in model_dict}
# 更新現有的model_dict
model_dict.update(pretrained_dict)
# 加載我們真正需要的state_dict
cnn.load_state_dict(model_dict)
# print(resnet50)
print(cnn)

以上就是相關的內容,本人剛入門的小白一枚,請輕噴~
————————————————
版權聲明:本文為CSDN博主「whut_ldz」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/whut_ldz/article/details/78845947

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的pytorch中的pre-train函数模型引用及修改(增减网络层,修改某层参数等)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91av日本 | 色哟哟国产 | 黄网站免费在线观看 | 久久不射网 | 色综合色综合 | 波多野结衣之潜藏淫欲 | 欧美a在线看 | 国产免费视频 | 3级黄色片| 国产无套精品一区二区三区 | 欧美激情伊人 | 亚洲天堂一区在线 | 99视频网站 | 午夜第一页 | 欧美精品久久久久久久自慰 | 亚洲电影在线看 | 一级大片免费观看 | 欧美r级在线观看 | 丰满大肥婆肥奶大屁股 | 色吧婷婷 | 婷婷婷色 | 国产精品无码999 | 欧美激情精品久久 | 国产三级播放 | 欧美日韩国产一区二区 | 欧美日韩女优 | 欧美黄色片免费看 | 日产精品久久久久久久蜜臀 | 91日日夜夜| 无码国产69精品久久久久同性 | 91九色国产视频 | 极品少妇av | 久操亚洲| 高清一区在线观看 | 欧美不卡三区 | www..com黄色 | 牛牛影视免费观看 | 欧美高清视频一区二区三区 | 浮力影院草草 | 中文字幕第七页 | 国产日韩一区二区三免费高清 | 两性午夜免费视频 | 欧美激情一区二区三区免费观看 | www.黄色大片 | 中文字幕一区二区三区在线播放 | 少妇精品高潮欲妇又嫩中文字幕 | 午夜一级视频 | 暖暖日本在线 | 日本大尺度做爰呻吟舌吻 | 在线看v片 | 亚洲欧洲视频在线观看 | 韩国无码一区二区三区精品 | 美脚の诱脚舐め脚视频播放 | 1024手机在线观看 | 国产88av | 我要看免费的毛片 | 国产www精品 | 91喷水| av性在线 | 欧美一区三区二区在线观看 | 17c精品麻豆一区二区免费 | 欧美丝袜一区二区三区 | 视频在线观看网站免费 | 91网站免费 | 2019中文在线观看 | 狠狠干少妇 | 日本免费一区二区三区四区五六区 | 天堂最新资源在线 | 强制高潮抽搐哭叫求饶h | 在线观看免费黄网站 | 中文字幕日韩欧美一区二区三区 | 狂躁美女大bbbbbb黑人 | 日本a视频在线观看 | 日韩激情视频在线 | 国产精品一区在线观看 | 在线无遮挡 | 欧美色亚洲 | 中文人妻熟女乱又乱精品 | 亚洲国产传媒 | 国产真实老熟女无套内射 | 香蕉午夜视频 | 日韩精品在线免费观看 | 好吊一区二区三区视频 | 一本久久综合 | 亚洲国产aⅴ精品一区二区的游戏 | 三级免费 | 国产乱子伦精品 | 国产精品久久久久久久av福利 | 黄色aaa毛片 | 那里可以看毛片 | 亚洲 欧美 成人 | 东北少妇高潮抽搐 | 欧美骚少妇 | 久久久久人妻一区二区三区 | 污污网站在线播放 | 俺也去五月婷婷 | 青青草国产精品视频 | 五月天社区 | 亚洲私人网站 |