Pytorch CIFAR10影像分類 資料加載與可視化篇
文章目錄
- Pytorch CIFAR10影像分類 資料加載與可視化篇
- 1.資料讀取
- 2. 查看資料(格式,大小,形狀)
- 3. 查看圖片
- np.ndarray轉為torch.Tensor
Pytorch一般有以下幾個流程
- 資料讀取
- 資料處理
- 搭建網路
- 模型訓練
- 模型上線
這里會先講一下關于CIFAR10的資料加載和圖片可視化,之后的模型篇會對網路進行介紹和實作,
1.資料讀取
CIFAR-10 是由 Hinton 的學生 Alex Krizhevsky 和 Ilya Sutskever 整理的一個用于識別普適物體的小型資料集,一共包含 10 個類別的 RGB 彩色圖 片:飛機( arplane )、汽車( automobile )、鳥類( bird )、貓( cat )、鹿( deer )、狗( dog )、蛙類( frog )、馬( horse )、船( ship )和卡車( truck ),圖片的尺寸為 32×32 ,資料集中一共有 50000 張訓練圄片和 10000 張測驗圖片,
與 MNIST 資料集中目比, CIFAR-10 具有以下不同點:
- CIFAR-10 是 3 通道的彩色 RGB 影像,而 MNIST 是灰度影像,
- CIFAR-10 的圖片尺寸為 32×32, 而 MNIST 的圖片尺寸為 28×28,比 MNIST 稍大,
- 相比于手寫字符, CIFAR-10 含有的是現實世界中真實的物體,不僅噪聲很大,而且物體的比例、 特征都不盡相同,這為識別帶來很大困難,

首先使用torchvision加載和歸一化我們的訓練資料和測驗資料,
a、torchvision這個東西,實作了常用的一些深度學習的相關的影像資料的加載功能,比如cifar10、Imagenet、Mnist等等的,保存在torchvision.datasets模塊中,
b、同時,也封裝了一些處理資料的方法,保存在torchvision.transforms模塊中
c、還封裝了一些模型和工具封裝在相應模型中,比如torchvision.models當中就包含了AlexNet,VGG,ResNet,SqueezeNet等模型,
由于torchvision的datasets的輸出是[0,1]的PILImage,所以我們先先歸一化為[-1,1]的Tensor
首先定義了一個變換transform,利用的是上面提到的transforms模塊中的Compose( )把多個變換組合在一起,可以看到這里面組合了ToTensor和Normalize這兩個變換
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))前面的(0.5,0.5,0.5) 是 R G B 三個通道上的均值, 后面(0.5, 0.5, 0.5)是三個通道的標準差,注意通道順序是 R G B ,用過opencv的同學應該知道openCV讀出來的影像是 BRG順序,這兩個tuple資料是用來對RGB 影像做歸一化的,如其名稱 Normalize 所示這里都取0.5只是一個近似的操作,實際上其均值和方差并不是這么多,但是就這個示例而言 影響可不計,精確值是通過分別計算R,G,B三個通道的資料算出來的,
transform = transforms.Compose([
# transforms.CenterCrop(224),
transforms.RandomCrop(32,padding=4), # 資料增廣
transforms.RandomHorizontalFlip(), # 資料增廣
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
trainloader其實是一個比較重要的東西,我們后面就是通過trainloader把資料傳入網路,當然這里的trainloader其實是個變數名,可以隨便取,重點是他是由后面的torch.utils.data.DataLoader()定義的,這個東西來源于torch.utils.data模塊
Batch_Size = 256
trainset = datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
testset = datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=Batch_Size,shuffle=True, num_workers=2)
testloader = torch.utils.data.DataLoader(testset, batch_size=Batch_Size,shuffle=True, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat','deer', 'dog', 'frog', 'horse', 'ship', 'truck')
Files already downloaded and verified Files already downloaded and verified
2. 查看資料(格式,大小,形狀)
首先可以查看類別
classes = trainset.classes
classes
['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
trainset.class_to_idx
{'airplane': 0, 'automobile': 1, 'bird': 2, 'cat': 3, 'deer': 4, 'dog': 5, 'frog': 6, 'horse': 7, 'ship': 8, 'truck': 9}
也可以查看一下訓練集的資料
trainset.data.shape #50000是圖片數量,32x32是圖片大小,3是通道數量RGB
(50000, 32, 32, 3)
查看資料型別
#查看資料型別
print(type(trainset.data))
print(type(trainset))
<class 'numpy.ndarray'> <class 'torchvision.datasets.cifar.CIFAR10'>
總結
trainset.data.shape是標準的numpy.ndarray型別,其中50000是圖片數量,32x32是圖片大小,3是通道數量RGB;
trainset是標準的??型別,其中50000為圖片數量,0表示取前面的資料,2表示3通道數RGB,32*32表示圖片大小
3. 查看圖片
import numpy as np
import matplotlib.pyplot as plt
plt.imshow(trainset.data[0])
im,label = iter(trainloader).next()

np.ndarray轉為torch.Tensor
在深度學習中,原始影像需要轉換為深度學習框架自定義的資料格式,在pytorch中,需要轉為torch.Tensor,
pytorch提供了torch.Tensor 與numpy.ndarray轉換為介面:
| 方法名 | 作用 |
|---|---|
torch.from_numpy(xxx) | numpy.ndarray轉為torch.Tensor |
tensor1.numpy() | 獲取tensor1物件的numpy格式資料 |
torch.Tensor 高維矩陣的表示: N x C x H x W
numpy.ndarray 高維矩陣的表示:N x H x W x C
因此在兩者轉換的時候需要使用numpy.transpose( ) 方法 ,
def imshow(img):
img = img / 2 + 0.5
img = np.transpose(img.numpy(),(1,2,0))
plt.imshow(img)
imshow(im[0])

plt.figure(figsize=(8,12))
imshow(torchvision.utils.make_grid(im[:32]))

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291489.html
標籤:python
上一篇:一文掌握Pandas可視化圖表
