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

