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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【pytorch torchvision源码解读系列—1】Alexnet

發布時間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【pytorch torchvision源码解读系列—1】Alexnet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近開始學習一個新的深度學習框架PyTorch。

框架中有一個非常重要且好用的包:torchvision,顧名思義這個包主要是關于計算機視覺cv的。這個包主要由3個子包組成,分別是:torchvision.datasets、torchvision.models、torchvision.transforms。

具體介紹可以參考官網:https://pytorch.org/docs/master/torchvision

具體代碼可以參考github:https://github.com/pytorch/vision

torchvision.models這個包中包含alexnet、densenet、inception、resnet、squeezenet、vgg等常用經典的網絡結構,并且提供了預訓練模型,可以通過簡單調用來讀取網絡結構和預訓練模型。

今天我們來解讀一下Alexnet的源碼實現。如果對AlexNet不是很了解 可以查看這里的論文筆記https://blog.csdn.net/sinat_33487968/article/details/83543406

如何使用呢?

import torchvision model = torchvision.models.Alexnet(pretrained=True)

這樣就可以獲得網絡的結構了,pretrained參數的意思是是否預訓練,如果為True就會從網上下載好已經訓練參數的模型。改參數默認是False。

import torch.utils.model_zoo as model_zoo__all__ = ['AlexNet', 'alexnet']model_urls = {'alexnet': 'https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth', }

首先是導入必要的庫,其中model_zoo是和導入預訓練模型相關的包,另外all變量定義了可以從外部import的函數名或類名。這也是前面為什么可以用torchvision.models.alexnet()來調用的原因。model_urls這個字典是預訓練模型的下載地址。

接下來就是Alexnet這個類

class AlexNet(nn.Module):def __init__(self, num_classes=1000):super(AlexNet, self).__init__()self.feature = nn.Sequential(nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True), # inplace為True,將會改變輸入的數據 ,否則不會改變原輸入,只會產生新的輸出nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(64, 192, kernel_size=5, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(192, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),)self.classifer = nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.feature(x)x = x.view(x.size(0), 256 * 6 * 6) # reshapex = self.classifer(x)return x

AlexNet網絡是通過AlexNet這個類實例化的。首先還是繼承PyTorch中網絡的基類:torch.nn.Module,其次主要的是重寫初始化__init__和forward方法。在初始化__init__中主要是定義一些層的參數。forward方法中主要是定義數據在層之間的流動順序,也就是層的連接順序?;旧暇褪俏鍖泳矸e加上三層全連接(不算relu和max max pooling)。注意到ReLU的inplace為True,將會改變輸入的數據 ,否則不會改變原輸入,只會產生新的輸出。而?x = x.view(x.size(0), 256 * 6 * 6) ?的意思是reshape卷積層得到的結果,為了匹配后面的全連接層。

具體結構可以參照下圖:

最后呈現上源碼

import torch.nn as nn import torch.utils.model_zoo as model_zoo__all__ = ['Alexnet', 'alexnet']model_urls = {'alexnet': 'https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth', }class AlexNet(nn.Module):def __init__(self, num_classes=1000):super(AlexNet, self).__init__()self.feature = nn.Sequential(nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),nn.ReLU(inplace=True), # inplace為True,將會改變輸入的數據 ,否則不會改變原輸入,只會產生新的輸出nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(64, 192, kernel_size=5, padding=2),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(192, 384, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(384, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.Conv2d(256, 256, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=3, stride=2),)self.classifer = nn.Sequential(nn.Dropout(),nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_classes),)def forward(self, x):x = self.feature(x)x = x.view(x.size(0), 256 * 6 * 6) # reshapex = self.classifer(x)return xdef alexnet(pretrained = False,**kwargs):r"""AlexNet model architecture from the"One werid trick..."<https://arxiv.org/abs/1404.5997>_papper.Args:pretrained(bool):if True,returns a model pre-trained on ImagetNet"""model = AlexNet(**kwargs)if pretrained:model.load_state_dict(model_zoo.load_url(model_urls['alexnet']))return modelif __name__ == '__main__':alexnet()

?

總結

以上是生活随笔為你收集整理的【pytorch torchvision源码解读系列—1】Alexnet的全部內容,希望文章能夠幫你解決所遇到的問題。

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