国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python PyTorch預訓練示例

2020-02-22 23:13:14
字體:
來源:轉載
供稿:網友

前言

最近使用PyTorch感覺妙不可言,有種當初使用Keras的快感,而且速度還不慢。各種設計直接簡潔,方便研究,比tensorflow的臃腫好多了。今天讓我們來談談PyTorch的預訓練,主要是自己寫代碼的經驗以及論壇PyTorch Forums上的一些回答的總結整理。

直接加載預訓練模型

如果我們使用的模型和原模型完全一樣,那么我們可以直接加載別人訓練好的模型:

my_resnet = MyResNet(*args, **kwargs)my_resnet.load_state_dict(torch.load("my_resnet.pth"))

當然這樣的加載方法是基于PyTorch推薦的存儲模型的方法:

torch.save(my_resnet.state_dict(), "my_resnet.pth")

還有第二種加載方法:

my_resnet = torch.load("my_resnet.pth")

加載部分預訓練模型

其實大多數時候我們需要根據我們的任務調節我們的模型,所以很難保證模型和公開的模型完全一樣,但是預訓練模型的參數確實有助于提高訓練的準確率,為了結合二者的優點,就需要我們加載部分預訓練模型。

pretrained_dict = model_zoo.load_url(model_urls['resnet152'])model_dict = model.state_dict()# 將pretrained_dict里不屬于model_dict的鍵剔除掉pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}# 更新現有的model_dictmodel_dict.update(pretrained_dict)# 加載我們真正需要的state_dictmodel.load_state_dict(model_dict)

因為需要剔除原模型中不匹配的鍵,也就是層的名字,所以我們的新模型改變了的層需要和原模型對應層的名字不一樣,比如:resnet最后一層的名字是fc(PyTorch中),那么我們修改過的resnet的最后一層就不能取這個名字,可以叫fc_

微改基礎模型預訓練

對于改動比較大的模型,我們可能需要自己實現一下再加載別人的預訓練參數。但是,對于一些基本模型PyTorch中已經有了,而且我只想進行一些小的改動那么怎么辦呢?難道我又去實現一遍嗎?當然不是。

我們首先看看怎么進行微改模型。

微改基礎模型

PyTorch中的torchvision里已經有很多常用的模型了,可以直接調用:

    AlexNet VGG ResNet SqueezeNet DenseNet
import torchvision.models as modelsresnet18 = models.resnet18()alexnet = models.alexnet()squeezenet = models.squeezenet1_0()densenet = models.densenet_161()

但是對于我們的任務而言有些層并不是直接能用,需要我們微微改一下,比如,resnet最后的全連接層是分1000類,而我們只有21類;又比如,resnet第一層卷積接收的通道是3, 我們可能輸入圖片的通道是4,那么可以通過以下方法修改:

resnet.conv1 = nn.Conv2d(4, 64, kernel_size=7, stride=2, padding=3, bias=False)resnet.fc = nn.Linear(2048, 21)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 连江县| 沽源县| 咸阳市| 博客| 宕昌县| 海南省| 渝中区| 获嘉县| 丰宁| 桑日县| 博湖县| 白沙| 威海市| 九龙城区| 定襄县| 密云县| 曲阳县| 柳林县| 濉溪县| 都昌县| 汉川市| 赤水市| 铜川市| 新宁县| 监利县| 文水县| 瓮安县| 新昌县| 长沙市| 涡阳县| 东阳市| 麟游县| 嵩明县| 宜春市| 河北省| 博湖县| 博罗县| 馆陶县| 呼玛县| 连山| 上思县|