小白學PyTorch | 5 torchvision預訓練模型與數據集全覽

2021-02-19 天池大數據科研平臺

文章目錄:

1 torchvision.datssets

2 torchvision.models

模型比較

本文建議複製代碼去跑跑看,增加一下手感。公眾號回復【torchvision】獲取代碼和數據。

torchvision

官網上的介紹:The torchvision package consists of popular datasets, model architectures, and common image transformations for computer vision.

翻譯過來就是:torchvision包由流行的數據集、模型體系結構和通用的計算機視覺圖像轉換組成。簡單地說就是常用數據集+常見模型+常見圖像增強方法

這個torchvision中主要有包組成:

1 torchvision.datssets

包含賊多的數據集,包含下面的:

官方說明了:All the datasets have almost similar API. They all have two common arguments: transform and target_transform to transform the input and target respectively.

翻譯過來就是:每一個數據集的API都是基本相同的。他們都有兩個相同的參數:transform和target_transform(後面細講)

我們就用最經典最簡單的MNIST手寫數字數據集作為例子,先看這個的API:

包含5個參數:

root:就是你想要保存MNIST數據集的位置,如果download是Flase的話,則會從目標位置讀取數據集;download:True的話就會自動從網上下載這個數據集,到root的位置;train:True的話,數據集下載的是訓練數據集;False的話則下載測試數據集(真方便,都不用自己劃分了)transform:這個是對圖像進行處理的transform,比方說旋轉平移縮放,輸入的是PIL格式的圖像(不是tensor矩陣);target_transform:這個是對圖像標籤進行處理的函數(這個我沒用過不太確定,也許是做標籤平滑那種的處理?)

【下面用代碼進一步理解】

import torchvision
mydataset = torchvision.datasets.MNIST(root='./',
                                      train=True,
                                      transform=None,
                                      target_transform=None,
                                      download=True)

運行結果如下,表示下載完畢。

之後我們需要用到上一節課講到的dataloader的內容:

from torch.utils.data import Dataset,DataLoader
myloader = DataLoader(dataset=mydataset,
                     batch_size=16)
for i,(data,label) in enumerate(myloader):
    print(data.shape)
    print(label.shape)
    break

這時候會拋出一個錯誤:

大致看一看,就是pytorch的這個dataloader不是可以把數據集分成batch嘛,這個dataloder只能把tensor或者numpy這樣的組合成batch,而現在的數據集的格式是PIL格式。這裡驗證了之前說到的,transform這個輸入是PIL格式的圖片,解決方法是:transform不能是None,我們需要將PIL轉化成tensor才可以

所以我們把上面的transform稍作修改:

mydataset = torchvision.datasets.MNIST(root='./',
                                      train=True,        
                                      transform=torchvision.transforms.ToTensor(),
                                      target_transform=None,
                              ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/071a7b749c094d30b482c29f16f8ec08~tplv-k3u1fbpfcp-zoom-1.image)        download=True)

重新運行的時候可以得到結果:結果中,16表示一個batch有16個樣本,1表示這是單通道的灰度圖片,28表示MNIST數據集圖片是

想要獲取其他的數據集也是一樣的,不過這裡就用MNIST作為舉例,其他的相同。

2 torchvision.models

預訓練模型中torchvision提供了很多種,大體分成下面四類:

分別是分類模型,語義模型,目標檢測模型和視頻分類模型。這裡呢因為分類模型比較常見也比較基礎,就主要介紹這個好啦。

在torch1.6.0版本中(應該是比較近的版本),主要包含下面的預訓練模型:

構建模型可以通過下面的代碼:

import torchvision.models as models
resnet18 = models.resnet18()
alexnet = models.alexnet()
vgg16 = models.vgg16()
squeezenet = models.squeezenet1_0()
densenet = models.densenet161()
inception = models.inception_v3()
googlenet = models.googlenet()
shufflenet = models.shufflenet_v2_x1_0()
mobilenet = models.mobilenet_v2()
resnext50_32x4d = models.resnext50_32x4d()
wide_resnet50_2 = models.wide_resnet50_2()
mnasnet = models.mnasnet1_0()

這樣構建的模型的權重值是隨機的,只有結構是保存的。想要獲取預訓練的模型,則需要設置參數pretrained:

import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
squeezenet = models.squeezenet1_0(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
densenet = models.densenet161(pretrained=True)
inception = models.inception_v3(pretrained=True)
googlenet = models.googlenet(pretrained=True)
shufflenet = models.shufflenet_v2_x1_0(pretrained=True)
mobilenet = models.mobilenet_v2(pretrained=True)
resnext50_32x4d = models.resnext50_32x4d(pretrained=True)
wide_resnet50_2 = models.wide_resnet50_2(pretrained=True)
mnasnet = models.mnasnet1_0(pretrained=True)

我看官網的英文講解,提到了一點:似乎這些模型的預訓練數據集都是ImageNet的那個數據集,輸入圖片都是3通道的,並且要求輸入圖片的寬高不小於224像素,並且要求輸入圖片像素值的範圍在0到1之間,然後做一個normalization標準化。

不知道各位在看一些案例的時候,有沒有看到這個標準化:mean = [0.485, 0.456, 0.406] 和 std = [0.229, 0.224, 0.225],這個應該是ImageNet的圖片的標準化的參數。

這些預訓練的模型參數不確定能不能直接下載,我也就把這些模型存起來一併放在了公眾號的後臺,依然是回復【torchvision】獲取。

得到了.pth文件之後使用torch.load來加載即可。

# torch.save(model, 'model.pth')
model = torch.load('model.pth')

模型比較

最後呢,torchvision官方提供了一個不同模型在Imagenet 1-crop 的一個錯誤率的比較。可以一起來看看到底哪個模型比較好使。這裡我放了一些常見的模型。。像是Wide ResNet這種變種我就不放了。

網絡Top-1 errorTop-5 errorAlexNet43.4520.91VGG-1130.9811.37VGG-1330.0710.75VGG-1628.419.62VGG-1927.629.12VGG-13 with BN28.459.63VGG-19 with BN25.768.15Resnet-1830.2410.92Resnet-3426.708.58Resnet-5023.857.13Resnet-10122.636.44Resnet-15221.695.94SqueezeNet 1.141.8119.38Densenet-16122.356.2

整體來看,還是Resnet殘差網絡效果好。不過EfficientNet效果更好,不過這個模型在Torchvision中沒有提供,會在之後專門講解和提供代碼模板。(先挖坑)。

點讚+在看+轉發

相關焦點

  • 【小白學PyTorch】5.torchvision預訓練模型與數據集全覽
    翻譯過來就是:torchvision包由流行的數據集、模型體系結構和通用的計算機視覺圖像轉換組成。簡單地說就是常用數據集+常見模型+常見圖像增強方法這個torchvision中主要有包組成: 1 torchvision.datssets 包含賊多的數據集,包含下面的:官方說明了:All the datasets have almost
  • 視覺工具包torchvision重大更新:支持分割模型、檢測模型,還有許多數據集
    現在,來仔細觀察一下,新的torchvision都有哪裡變強了。哪些功能是新來的?訓練/評估腳本現在,reference/文件夾地下,提供了訓練和評估用的腳本,支持許多任務:分類、語義分割、目標檢測、實例分割,以及人物關鍵點檢測。這些腳本可以當做log:寫著某一個特定的模型要怎樣訓練,並且提供了基線。
  • PyTorch 視覺工具包 torchvision 重大更新:支持分割模型、檢測模型,還有許多數據集
    現在,來仔細觀察一下,新的torchvision都有哪裡變強了。哪些功能是新來的?訓練/評估腳本現在,reference/文件夾地下,提供了訓練和評估用的腳本,支持許多任務:分類、語義分割、目標檢測、實例分割,以及人物關鍵點檢測。這些腳本可以當做log:寫著某一個特定的模型要怎樣訓練,並且提供了基線。
  • TorchVision0.3來了!支持多種目標檢測、語義與實例分割模型等
    現在,來仔細觀察一下,新的torchvision都有哪裡變強了。哪些功能是新來的?訓練/評估腳本現在,reference/文件夾地下,提供了訓練和評估用的腳本,支持許多任務:分類、語義分割、目標檢測、實例分割,以及人物關鍵點檢測。這些腳本可以當做log:寫著某一個特定的模型要怎樣訓練,並且提供了基線。
  • Pytorch 加載預訓練模型之ResNet系列
    Pytorch 加載預訓練模型之ResNet系列參考網址:https://github.com/Cadene/pretrained-models.pytorch
  • 使用PyTorch的torchvision處理CIFAR10數據集並顯示
    在訓練圖像分類的時候,我們通常會使用CIFAR10數據集,今天就先寫一下如何展示數據集的圖片及預處理。
  • 【pytorch】常用圖像處理與數據增強方法合集(torchvision.transforms)
    這個基本上每個數據集都會用到。參數不用給參數。標準化torchvision.transforms.Normalize(mean, std, inplace=False)描述用均值和標準差標準化數據,將數據映射到區間[-1, 1],能加快模型的收斂速度,一般加到
  • 輕鬆學Pytorch – 行人檢測Mask-RCNN模型訓練與使用
    大家好,這個是輕鬆學Pytorch的第20篇的文章分享,主要是給大家分享一下,如何使用數據集基於Mask-RCNN訓練一個行人檢測與實例分割網絡。這個例子是來自Pytorch官方的教程,我這裡是根據我自己的實踐重新整理跟解讀了一下,分享給大家。前面一篇已經詳細分享了關於模型本身,格式化輸入與輸出的結果。
  • 微軟發布視覺模型ResNet-50
    微軟在2月3日公開了其視覺模型ResNet-50,該模型是微軟必應的多媒體組創建的一個大型預訓練視覺模型,利用搜尋引擎的網絡尺度圖像數據建立,以便為其圖像搜索和視覺搜索提供動力
  • 小白學PyTorch | 16 TF2讀取圖片的方法
    小白學PyTorch | 8 實戰之MNIST小試牛刀小白學PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解小白學PyTorch | 6 模型的構建訪問遍歷存儲
  • 【小白學PyTorch】7 最新版本torchvision.transforms常用API翻譯與講解
    之前的課程提到了,在torchvision官方的數據集中,提供的數據是PIL格式的數據,然後我們需要轉成FloatTensor形式的數據。因此這裡圖像增強的處理也分成在PIL圖片上操作的和在FloatTensor張量上操作的兩種。
  • 【小白學PyTorch】7.最新版本torchvision.transforms常用API翻譯與講解
    之前的課程提到了,在torchvision官方的數據集中,提供的數據是PIL格式的數據,然後我們需要轉成FloatTensor形式的數據。因此這裡圖像增強的處理也分成在PIL圖片上操作的和在FloatTensor張量上操作的兩種。
  • 輕鬆學 Pytorch:行人檢測 Mask-RCNN 模型訓練與使用
    大家好,這個是輕鬆學Pytorch的第20篇的文章分享,主要是給大家分享一下,如何使用數據集基於Mask-RCNN訓練一個行人檢測與實例分割網絡。這個例子是來自Pytorch官方的教程,我這裡是根據我自己的實踐重新整理跟解讀了一下,分享給大家。前面一篇已經詳細分享了關於模型本身,格式化輸入與輸出的結果。
  • pytorch編程之使用 TensorBoard 可視化模型,數據和訓練
    本教程使用 Fashion-MNIST 數據集說明了其某些功能,可以使用 torchvision.datasets 將其讀取到 PyTorch 中。在本教程中,我們將學習如何:讀取數據並進行適當的轉換(與先前的教程幾乎相同)。設置 TensorBoard。寫入 TensorBoard。使用 TensorBoard 檢查模型架構。
  • 預訓練模型遷移學習
    在計算機視覺領域中,遷移學習通常是通過使用預訓練模型來表示的。預訓練模型是在大型基準數據集上訓練的模型,用於解決相似的問題。由於訓練這種模型的計算成本較高,因此,導入已發布的成果並使用相應的模型是比較常見的做法。2、卷積神經網絡(CNN)在遷移學習中,常用的幾個預訓練模型是基於大規模卷積神經網絡的(Voulodimos)。
  • 【小白學PyTorch】18.TF2構建自定義模型
    6 模型的構建訪問遍歷存儲(附代碼)小白學PyTorch | 5 torchvision預訓練模型與數據集全覽小白學PyTorch | 4 構建模型三要素與權重初始化小白學PyTorch | 3 淺談Dataset和Dataloader
  • 【NLP】Pytorch中文語言模型bert預訓練代碼
    這篇論文做了很多語言模型預訓練的實驗,系統的分析了語言模型預訓練對子任務的效果提升情況。有幾個主要結論:在目標領域的數據集上繼續預訓練(DAPT)可以提升效果;目標領域的語料與RoBERTa的原始預訓練語料越不相關,DAPT效果則提升更明顯。在具體任務的數據集上繼續預訓練(TAPT)可以十分「廉價」地提升效果。
  • 使用google colab訓練YOLOv5模型
    YOLOv5模型訓練來到google drive,點擊左上方的Newcolab_yolov5創建一個新的文件夾colabcolab_yolov5接下來,將準備好的口罩數據集上傳到colab文件夾中,這個數據集,前面我們在YOLOv5模型訓練的時候用過,可以到下面的地址下載原始連結 https://public.roboflow.ai/object-detection
  • Pytorch筆記:02 torchvision.transforms數據增強
    (mean=[0.5,0.5,0.5],std=[0.5,0.5,0.5])(tensor_image)12.填充:transforms.Padtorchvision.transforms.Pad(20)(image)
  • 常見模型加載運行與轉換
    :1)模型網絡結構和參數分別加載import torchimport torchvision.models as models# pretrained為True表示使用預訓練的模型,意思是將模型在之前數據集上訓練的參數作為當前模型的初始參數,在模型二次調優上常常使用,但在推理流程中一般不使用,這裡就沒有使用net = models.resnet34