pytorch實現(xiàn)下載加載mnist數(shù)據(jù)集
pytorch下載加載mnist數(shù)據(jù)集
1.下載mnist
使用torchvision.datasets,其中含有一些常見的MNIST等數(shù)據(jù)集,
使用方式:
train_data=torchvision.datasets.MNIST(
root='MNIST',
train=True,
transform=torchvision.transforms.ToTensor(),
download=True
)
test_data=torchvision.datasets.MNIST(
root='MNIST',
train=False,
transform=torchvision.transforms.ToTensor(),
download=True
)root:表示下載位置,下載后,會在該位置中新建一個MNIST文件夾,底下還有一個raw文件夾train:True下載就會是訓(xùn)練集,F(xiàn)alse下載就會是測試集transform:表示轉(zhuǎn)換方式download:表示是否下載
下載完后會生成四個壓縮包,分別代表著train的img和label以及test的img和label
變量train_data和test_data的類型分別為'torchvision.datasets.mnist.MNIST',如果想用到pytorch中的進行訓(xùn)練,就必須將變量改為torch
2.torch.utils.data.DataLoader( )
用from torch.utils.data import DataLoader進行導(dǎo)入,
train_load=DataLoader(dataset=train_data,batch_size=100,shuffle=True) test_load=DataLoader(dataset=test_data,batch_size=100,shuffle=True)
隨機加載批量大小為l00數(shù)據(jù)給train_load和test_load,每個變量都由兩部分組成,用迭代器將兩部分分開
train_x,train_y=next(iter(train_load))
其中train_x為屬性值,type(train_x)=torch.Size([100, 1, 28, 28])#100個,channel為1,長寬為28*28,type(train_y)=torch.size([100])
3.opencv顯示圖片
import cv2
img=torchvision.utils.make_grid(train_x,nrow=10)#將train_x賦給一個寬為10的網(wǎng)格
#因為cv2顯示的圖片格式是(size,size,channel),但是img格式為(channel,size,size)
img = img.numpy().transpose(1,2,0)
cv2.imshow('img', img)
cv2.waitKey()mnist手寫數(shù)字識別實踐
MNIST數(shù)據(jù)集是手寫數(shù)字識別領(lǐng)域最常用的數(shù)據(jù)集。它包含60,000個用于訓(xùn)練的示例和10,000個用于測試的示例。這些手寫數(shù)字圖像來自美/國人口/普查局的員工和美國高中學(xué)生。MNIST數(shù)據(jù)集中的每個圖像都是28x28的灰度圖像,包含一個手寫數(shù)字 0-9。所有的數(shù)字都以清晰的黑色位于圖像的中心,背景為白色。
MNIST數(shù)據(jù)集主要用于測試各種手寫數(shù)字識別算法的性能。我們可以使用這個數(shù)據(jù)集構(gòu)建自己的手寫數(shù)字識別模型,并在10,000個測試集圖像上評估其性能。
在MNIST數(shù)據(jù)集上,一個較好的模型可以達到超過99%的識別準(zhǔn)確率。所以,這個數(shù)據(jù)集對初學(xué)者來說比較簡單,可以用來驗證自己構(gòu)建的模型是否工作正常。對專家來說,達到99.9%以上的識別率則需要更復(fù)雜的模型和更高級的技巧。
MNIST數(shù)據(jù)集非常適合作為手寫數(shù)字識別入門數(shù)據(jù)集:
- 它包含一個非常標(biāo)準(zhǔn)的問題定義:識別0-9之間的10個類別
- 數(shù)據(jù)集規(guī)模適中,訓(xùn)練和測試都非??焖?/li>
- 高識別準(zhǔn)確率比較容易達到,可以快速驗證自己的方法
- 數(shù)據(jù)集簡單而標(biāo)準(zhǔn)化,便于比較不同方法的性能
MNIST可以通過TensorFlow和Keras等深度學(xué)習(xí)框架非常簡單地載入使用。我們只需要幾行代碼就可以構(gòu)建一個基本的手寫數(shù)字識別模型并在此數(shù)據(jù)集上訓(xùn)練與評估。
所以,總的來說,MNIST是一個非常典型和流行的手寫數(shù)字識別入門數(shù)據(jù)集。它包含標(biāo)準(zhǔn)化的圖像和問題定義,規(guī)模適中,具有較高的識別準(zhǔn)確率,非常適合初學(xué)者練手和驗證模型。這個數(shù)據(jù)集讓手寫數(shù)字識別變得簡單可學(xué),降低了入門難度,值得傾注時間去理解與實踐。
下面使用Keras訓(xùn)練MNIST數(shù)據(jù)集,Keras具有簡潔而快速的API,可以使用很少的代碼構(gòu)建強大的神經(jīng)網(wǎng)絡(luò)。它降低了深度學(xué)習(xí)的入門難度,讓更多人可以輕松使用。
安裝python環(huán)境,推薦使用Anaconda,Anaconda安裝完畢后可以使用Jupyter編寫python代碼。Jupyter可以一段一段的執(zhí)行代碼,每寫完一句python就可以立即運行并查看結(jié)果,極大提高了效率。
# 導(dǎo)入numpy并為計算機的偽隨機數(shù)生成器設(shè)置種子開始
import numpy as np
np.random.seed(123)
'''
設(shè)置隨機數(shù)種子的主要目的是確保隨機結(jié)果可復(fù)現(xiàn)。
如果不設(shè)置隨機數(shù)種子,每次運行代碼時各種隨機操作的結(jié)果都會略微不同,導(dǎo)致實驗結(jié)果也不同,給實驗帶來不必要的變量。
設(shè)置隨機數(shù)種子后,每次運行代碼時各種隨機操作的初始化結(jié)果都會相同,所以運行結(jié)果也相同,確保了實驗的可復(fù)現(xiàn)性。
'''
#從Keras導(dǎo)入Sequential模型類型
from keras.models import Sequential
#從Keras層模塊中導(dǎo)入Dense、Dropout、Activation和Flatten四種層。
from keras.layers import Dense, Dropout, Activation, Flatten
'''
Sequential是Keras中最簡單的模型,它由多個網(wǎng)絡(luò)層線性堆疊而成。我們只需要將各種Keras層逐個添加到該模型中,即可構(gòu)建自己的網(wǎng)絡(luò)結(jié)構(gòu)。
四種Keras層的作用分別是:
- Dense:全連接層,用于連接網(wǎng)絡(luò)層之間的節(jié)點,實現(xiàn)函數(shù)擬合等作用。在分類和回歸任務(wù)中廣泛使用。
- Dropout:隨機置零層,用于在訓(xùn)練過程中隨機舍棄一定比例的節(jié)點,用于防止過擬合。
- Activation:激活層,用于對上一層的輸出施加非線性激活,如ReLU、sigmoid等。增強模型的表達能力。
- Flatten:展平層,用于將輸入“壓平”,例如將多維輸入壓平為二維,以供全連接層使用。
所以,簡而言之,這四種Keras層的主要作用是:
- Dense:實現(xiàn)網(wǎng)絡(luò)連接,用于擬合和回歸
- Dropout:實現(xiàn)隨機舍棄,用于正則化和防過擬合
- Activation:實現(xiàn)非線性轉(zhuǎn)換,增強表達能力
- Flatten:實現(xiàn)維度壓縮和reshape,以連串網(wǎng)絡(luò)
這些層是構(gòu)建神經(jīng)網(wǎng)絡(luò)的基本模塊,我們可以像搭積木一樣組合這些層,構(gòu)建出自己想要的復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)。
'''
#從Keras導(dǎo)入CNN層,這些卷積層將幫助我們有效地訓(xùn)練圖像數(shù)據(jù)
from keras.layers import Conv2D, MaxPool2D
#導(dǎo)入一些實用程序
from keras.utils import np_utils
#加載keras庫的MNIST數(shù)據(jù)集
from keras.datasets import mnist
#載入數(shù)據(jù)集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
#打印數(shù)據(jù)集的形狀
print(x_train.shape, y_train.shape)
#輸出結(jié)果顯示訓(xùn)練集中有60000個樣本,每個圖像都是28x28
#通過matplotlib繪制第一個樣本
from matplotlib import pyplot as plt
plt.imshow(x_train[0])
#使用Theano后端時,必須聲明輸入圖像的深度
#即將數(shù)據(jù)集的形狀從nx高x寬轉(zhuǎn)換為nx寬x高x深度
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
print(x_train.shape)
#輸入數(shù)據(jù)的最后預(yù)處理步驟是將數(shù)據(jù)類型轉(zhuǎn)換為float32并將我們的數(shù)據(jù)值規(guī)范化為[0, 1]
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
#看看類標(biāo)簽數(shù)據(jù)
print(y_train.shape)
#有十個不同的類,每個數(shù)字一個,看起來只有一個一維數(shù)組
print(y_train[:10])
#將一維類數(shù)組轉(zhuǎn)換為10維類矩陣
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)
print(Y_train.shape)
#定義一個順序模型
model = Sequential()
#在一個模型中添加一個卷積層
'''
filters=32:使用32個卷積濾波器(卷積核)
kernel_size=(3, 3):每個濾波器的大小為3x3
activation='relu':激活函數(shù)采用ReLU
input_shape=(28, 28, 1):輸入數(shù)據(jù)的shape為28x28x1,這里1表示黑白圖像
'''
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
print(model.output_shape)
#再添加一個卷積層
'''
1、Conv2D層:二維卷積層,32個卷積核,核大小為3x3,激活函數(shù)為ReLU
2. MaxPool2D層:二維最大池化層,池化窗口大小為2x2
3. Dropout層:隨機舍棄25%的節(jié)點
'''
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
#添加一個全連接層,然后是輸出層
'''
Flatten層:將輸入“壓平”,例如從三維特征圖變成二維特征向量
Dense層:全連接層,128個節(jié)點,激活函數(shù)為ReLU
Dropout層:隨機舍棄50%的節(jié)點
Dense層:全連接輸出層,10個節(jié)點,激活函數(shù)為softmax
'''
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
#編譯模型
'''
該行代碼為模型指定:
- loss:損失函數(shù),這里為 categorical_crossentropy,用于多分類任務(wù)
- optimizer:優(yōu)化器,這里為Adam算法,是一個較為常用的優(yōu)化器
- metrics:評價指標(biāo),這里為accuracy,用于評價分類準(zhǔn)確度
所以,這個編譯步驟為模型指定:
1. 損失函數(shù):categorical_crossentropy,計算多分類任務(wù)中的交叉熵?fù)p失
2. 優(yōu)化器:Adam,用于更新網(wǎng)絡(luò)權(quán)重,根據(jù)損失函數(shù)更新權(quán)重以最小化損失
3. 評價指標(biāo):accuracy,用于評價模型在訓(xùn)練和測試期間的分類準(zhǔn)確度
這三個specification對模型訓(xùn)練至關(guān)重要:
- 損失函數(shù)決定了模型在訓(xùn)練時要最小化的代價函數(shù)
- 優(yōu)化器決定了模型如何根據(jù)損失函數(shù)更新權(quán)重以最小化損失
- 評價指標(biāo)用于評判模型的訓(xùn)練效果和泛化能力
'''
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
#訓(xùn)練數(shù)據(jù)上擬合模型
'''
該行代碼會使用X_train和Y_train的數(shù)據(jù)對模型進行訓(xùn)練,具體參數(shù)為:
- X_train:訓(xùn)練數(shù)據(jù)的特征值
- Y_train:訓(xùn)練數(shù)據(jù)的標(biāo)簽值
- batch_size:批大小,這里為32,表示每批32個樣本
- epochs:訓(xùn)練輪數(shù),這里為10輪
- verbose:日志顯示,這里為1,顯示一個進度條
- 所以,這行代碼會以以下方式訓(xùn)練模型:
1. X_train和Y_train作為訓(xùn)練集數(shù)據(jù)
2. 以批大小32的mini-batch進行訓(xùn)練,每批選32個樣本進行訓(xùn)練更新
3. 訓(xùn)練10輪,用全部訓(xùn)練集訓(xùn)練10次
4. 訓(xùn)練過程中顯示一個進度條,日志級別為1
'''
model.fit(X_train, Y_train, batch_size=32, epochs=10, verbose=1)
#在測試數(shù)據(jù)上評估模型
score = model.evaluate(X_test, Y_test, verbose=0)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題
今天小編就為大家分享一篇解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python計算三角函數(shù)之a(chǎn)sin()方法的使用
這篇文章主要介紹了Python計算三角函數(shù)之a(chǎn)sin()方法的使用,是Python入門的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
python3 pandas 讀取MySQL數(shù)據(jù)和插入的實例
下面小編就為大家分享一篇python3 pandas 讀取MySQL數(shù)據(jù)和插入的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

