一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 關于Pytorch的MNIST數據集的預處理詳解

關于Pytorch的MNIST數據集的預處理詳解

2020-04-29 09:50water&12 Python

今天小編就為大家分享一篇關于Pytorch的MNIST數據集的預處理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

關于PytorchMNIST數據集預處理詳解

MNIST的準確率達到99.7%

用于MNIST的卷積神經網絡(CNN)的實現,具有各種技術,例如數據增強,丟失,偽隨機化等。

操作系統:ubuntu18.04

顯卡:GTX1080ti

python版本:2.7(3.7)

網絡架構

具有4層的CNN具有以下架構。

輸入層:784個節點(MNIST圖像大小)

第一卷積層:5x5x32

第一個最大池層

第二卷積層:5x5x64

第二個最大池層

第三個完全連接層:1024個節點

輸出層:10個節點(MNIST的類數)

用于改善CNN性能的工具

采用以下技術來改善CNN的性能。

1. Data augmentation

通過以下方式將列車數據的數量增加到5倍

隨機旋轉:每個圖像在[-15°,+ 15°]范圍內隨機旋轉。

隨機移位:每個圖像在兩個軸上隨機移動一個范圍為[-2pix,+ 2pix]的值。

零中心歸一化:將像素值減去(PIXEL_DEPTH / 2)并除以PIXEL_DEPTH。

2. Parameter initializers

重量初始化器:xaiver初始化器

偏差初始值設定項:常量(零)初始值設定項

3. Batch normalization

所有卷積/完全連接的層都使用批量標準化。

4. Dropout

The third fully-connected layer employes dropout technique.

5. Exponentially decayed learning rate

A learning rate is decayed every after one-epoch.

代碼部分

第一步:了解MNIST數據集

MNIST數據集是一個手寫體數據集,一共60000張圖片,所有的圖片都是28×28的,下載數據集的地址:數據集官網。這個數據集由四部分組成,分別是:

?
1
2
3
4
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

也就是一個訓練圖片集,一個訓練標簽集,一個測試圖片集,一個測試標簽集;我們可以看出這個其實并不是普通的文本文件

或是圖片文件,而是一個壓縮文件,下載并解壓出來,我們看到的是二進制文件。

第二步:加載MNIST數據集

先引入一些庫文件

?
1
2
3
4
import torchvision,torch
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
import matplotlib.pyplot as plt

加載MNIST數據集有很多方法:

方法一:在pytorch下可以直接調用torchvision.datasets里面的MNIST數據集(這是官方寫好的數據集類)

?
1
train = torchvision.datasets.MNIST(root='./mnist/',train=True, transform= transforms.ToTensor())

返回值為一個元組(train_data,train_target)(這個類使用的時候也有坑,必須用train[i]索引才能使用 transform功能)

一般是與torch.utils.data.DataLoader配合使用

?
1
2
3
4
5
dataloader = DataLoader(train, batch_size=50,shuffle=True, num_workers=4)
for step, (x, y) in enumerate(dataloader):
 b_x = x.shape
 b_y = y.shape
 print 'Step: ', step, '| train_data的維度' ,b_x,'| train_target的維度',b_y

如圖將60000張圖片的數據分為1200份,每份包含50張圖像,這樣并行處理數據能有效加快計算速度

關于Pytorch的MNIST數據集的預處理詳解

看個人喜好,本人不太喜歡這種固定的數據類,所以想要靈活多變,可以開始自己寫數據集類

方法二:自己設置數據集

使用pytorch相關類,API對數據集進行封裝,pytorch中數據集相關的類位于torch.utils.data package中。

本次實驗,主要使用以下類:

torch.utils.data.Dataset

torch.utils.data.DataLoader

Dataset類的使用: 所有的類都應該是此類的子類(也就是說應該繼承該類)。 所有的子類都要重寫(override) len(), getitem() 這兩個方法。

使用到的python package

python package

目的

numpy

矩陣操作,對圖像進行轉置

skimage

圖像處理,圖像I/O,圖像變換

matplotlib

圖像的顯示,可視化

os

一些文件查找操作

torch

pytorch

torvision

pytorch

導入相關的包

?
1
2
3
4
5
6
7
8
9
10
import numpy as np
from skimage import io
from skimage import transform
import matplotlib.pyplot as plt
import os
import torch
import torchvision
from torch.utils.data import Dataset, DataLoader
from torchvision.transforms import transforms
from PIL import Image

第一步:

定義一個子類,繼承Dataset類, 重寫 __len()__, __getitem()__ 方法。

細節:

1.數據集一個樣本的表示:采用字典的形式sample = {'img': img, 'target': target}。

圖像的讀取:采用torch.load進行讀取,讀取之后的結果為torch.Tensor形式。

圖像變換:transform參數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MY_MNIST(Dataset):
 training_file = 'training.pt'
 test_file = 'test.pt'
 def __init__(self, root, transform=None):
  self.transform = transform
  self.data, self.targets = torch.load(root)
 def __getitem__(self, index):
  img, target = self.data[index], int(self.targets[index])
  img = Image.fromarray(img.numpy(), mode='L')
 
  if self.transform is not None:
   img = self.transform(img)
  img =transforms.ToTensor()(img)
 
  sample = {'img': img, 'target': target}
  return sample
 def __len__(self):
  return len(self.data)
  
train = MY_MNIST(root='./mnist/MNIST/processed/training.pt', transform= None)

第二步

實例化一個對象,并讀取和顯示數據集

?
1
2
3
4
5
6
7
8
9
10
for (cnt,i) in enumerate(train):
 image = i['img']
 label = i['target']
 ax = plt.subplot(4, 4, cnt+1)
 # ax.axis('off')
 ax.imshow(image.squeeze(0))
 ax.set_title(label)
 plt.pause(0.001)
 if cnt ==15:
  break

輸出如下 ,這樣就表明,咱們自己寫的數據集讀取圖像,并讀取之后的結果為torch.Tensor形式成功啦!

關于Pytorch的MNIST數據集的預處理詳解

第三步(可選 optional)

對數據集進行變換:一般收集到的圖像大小尺寸,亮度等存在差異,變換的目的就是使得數據歸一化。另一方面,可以通過變換進行數據增強

關于pytorch中的變換transforms,請參考該系列之前的文章

由于數據集中樣本采用字典dicts形式表示。 因此不能直接調用torchvision.transofrms中的方法。

本實驗進行了旋轉,隨機裁剪,調節圖像的色彩飽和明暗等操作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
compose = transforms.Compose([
   transforms.Resize(20),
   transforms.RandomHorizontalFlip(),
   transforms.RandomCrop(20),
   transforms.ColorJitter(brightness=1, contrast=0.1, hue=0.5),
   # transforms.ToTensor(),
   # transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
   ])
train_transformed = MY_MNIST(root='./mnist/MNIST/processed/training.pt', transform= compose)
 
#顯示變換后的圖像
for (cnt,i) in enumerate(train_transformed):
 image = i['img']
 # print image[0].sum()
 # image = compose(image)
 print 'sdsdadfasfasfasf',type(image)
 label = i['target']
 ax = plt.subplot(4, 4, cnt+1)
 # ax.axis('off')
 ax.imshow(image.squeeze(0))
 ax.set_title(label)
 plt.pause(0.001)
 if cnt ==15:
  break

變換后的圖像,和之前對比,你發現了什么不同嗎?

關于Pytorch的MNIST數據集的預處理詳解

第四步: 使用DataLoader進行包裝

為何要使用DataLoader?

① 深度學習的輸入是mini_batch形式

② 樣本加載時候可能需要隨機打亂順序,shuffle操作

③ 樣本加載需要采用多線程

pytorch提供的DataLoader封裝了上述的功能,這樣使用起來更方便。

?
1
2
3
4
5
# 使用DataLoader可以利用多線程,batch,shuffle等
trainset_dataloader = DataLoader(dataset=transformed_trainset,
         batch_size=4,
         shuffle=True,
         num_workers=4)

可視化:

?
1
dataloader = DataLoader(train, batch_size=50,shuffle=True, num_workers=4)

通過DataLoader包裝之后,樣本以min_batch形式輸出,而且進行了隨機打亂順序。

?
1
2
3
4
for step, i in enumerate(dataloader):
 b_x = i['img'].shape
 b_y = i['target'].shape
 print 'Step: ', step, '| train_data的維度' ,b_x,'| train_target的維度',b_y

如圖圖片大小已經裁剪為20*20,而且并行處理讓60000個數據在3秒內就能處理好,效率非常高

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Step: 1186 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1187 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1188 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1189 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1190 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1191 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1192 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1193 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1194 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1195 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1196 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1197 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1198 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)
Step: 1199 | train_data的維度 (50, 1, 20, 20) | train_target的維度 (50,)

未完待續…

以上這篇關于Pytorch的MNIST數據集的預處理詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_32896115/article/details/90311697

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久婷婷电影网 | 蜜桃成人影院 | 精品亚洲视频在线观看 | 高清一级做a爱免费视 | 奇米网在线| 黑人干我| 国产一区二区三区日韩 | a级特黄毛片免费观看 | 催眠 迷j系列小说 | 男男同志videos | 国产精品视频播放 | 日韩欧美一区二区三区免费观看 | 免费xxxxx大片在线观看影视 | 秋霞一级黄色片 | 国产短视频精品一区二区三区 | 99久久精品无码一区二区毛片 | 5g影院成人 | 操动漫美女视频 | 免费370理论片中文字幕 | 边摸边吃奶玩乳尖视频 | 亚飞与亚基国语1080p在线观看 | 久久精品亚洲精品国产欧美 | 成人午夜影院在线观看 | 精品一区二区三区 不卡高清 | chinese老太grandma| 四虎免费看| 亚洲精品人成网在线播放影院 | 亚洲 小说 欧美 激情 另类 | 奇米精品| 国产一卡二卡3卡4卡四卡在线 | 亚洲图片一区二区 | 好湿好紧太硬了我太爽了h 好湿好滑好硬好爽好深视频 | 欧美色成人tv在线播放 | 成人网欧美亚洲影视图片 | 久久久久久免费观看 | 欧美日韩精品一区二区三区视频在线 | 欧美性一区二区三区 | 亚洲精品九色在线网站 | 海角社区在线视频 | 久久精品动漫网一区二区 | 草草在线影院 |