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下載就會是訓練集,F(xiàn)alse下載就會是測試集transform
:表示轉(zhuǎn)換方式download
:表示是否下載
下載完后會生成四個壓縮包,分別代表著train的img和label以及test的img和label
變量train_data和test_data的類型分別為'torchvision.datasets.mnist.MNIST',如果想用到pytorch中的進行訓練,就必須將變量改為torch
2.torch.utils.data.DataLoader( )
用from torch.utils.data import DataLoader進行導入,
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個用于訓練的示例和10,000個用于測試的示例。這些手寫數(shù)字圖像來自美/國人口/普查局的員工和美國高中學生。MNIST數(shù)據(jù)集中的每個圖像都是28x28的灰度圖像,包含一個手寫數(shù)字 0-9。所有的數(shù)字都以清晰的黑色位于圖像的中心,背景為白色。
MNIST數(shù)據(jù)集主要用于測試各種手寫數(shù)字識別算法的性能。我們可以使用這個數(shù)據(jù)集構(gòu)建自己的手寫數(shù)字識別模型,并在10,000個測試集圖像上評估其性能。
在MNIST數(shù)據(jù)集上,一個較好的模型可以達到超過99%的識別準確率。所以,這個數(shù)據(jù)集對初學者來說比較簡單,可以用來驗證自己構(gòu)建的模型是否工作正常。對專家來說,達到99.9%以上的識別率則需要更復雜的模型和更高級的技巧。
MNIST數(shù)據(jù)集非常適合作為手寫數(shù)字識別入門數(shù)據(jù)集:
- 它包含一個非常標準的問題定義:識別0-9之間的10個類別
- 數(shù)據(jù)集規(guī)模適中,訓練和測試都非??焖?/li>
- 高識別準確率比較容易達到,可以快速驗證自己的方法
- 數(shù)據(jù)集簡單而標準化,便于比較不同方法的性能
MNIST可以通過TensorFlow和Keras等深度學習框架非常簡單地載入使用。我們只需要幾行代碼就可以構(gòu)建一個基本的手寫數(shù)字識別模型并在此數(shù)據(jù)集上訓練與評估。
所以,總的來說,MNIST是一個非常典型和流行的手寫數(shù)字識別入門數(shù)據(jù)集。它包含標準化的圖像和問題定義,規(guī)模適中,具有較高的識別準確率,非常適合初學者練手和驗證模型。這個數(shù)據(jù)集讓手寫數(shù)字識別變得簡單可學,降低了入門難度,值得傾注時間去理解與實踐。
下面使用Keras訓練MNIST數(shù)據(jù)集,Keras具有簡潔而快速的API,可以使用很少的代碼構(gòu)建強大的神經(jīng)網(wǎng)絡(luò)。它降低了深度學習的入門難度,讓更多人可以輕松使用。
安裝python環(huán)境,推薦使用Anaconda,Anaconda安裝完畢后可以使用Jupyter編寫python代碼。Jupyter可以一段一段的執(zhí)行代碼,每寫完一句python就可以立即運行并查看結(jié)果,極大提高了效率。
# 導入numpy并為計算機的偽隨機數(shù)生成器設(shè)置種子開始 import numpy as np np.random.seed(123) ''' 設(shè)置隨機數(shù)種子的主要目的是確保隨機結(jié)果可復現(xiàn)。 如果不設(shè)置隨機數(shù)種子,每次運行代碼時各種隨機操作的結(jié)果都會略微不同,導致實驗結(jié)果也不同,給實驗帶來不必要的變量。 設(shè)置隨機數(shù)種子后,每次運行代碼時各種隨機操作的初始化結(jié)果都會相同,所以運行結(jié)果也相同,確保了實驗的可復現(xiàn)性。 ''' #從Keras導入Sequential模型類型 from keras.models import Sequential #從Keras層模塊中導入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:隨機置零層,用于在訓練過程中隨機舍棄一定比例的節(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)建出自己想要的復雜網(wǎng)絡(luò)結(jié)構(gòu)。 ''' #從Keras導入CNN層,這些卷積層將幫助我們有效地訓練圖像數(shù)據(jù) from keras.layers import Conv2D, MaxPool2D #導入一些實用程序 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é)果顯示訓練集中有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ù)的最后預處理步驟是將數(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 #看看類標簽數(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:評價指標,這里為accuracy,用于評價分類準確度 所以,這個編譯步驟為模型指定: 1. 損失函數(shù):categorical_crossentropy,計算多分類任務(wù)中的交叉熵損失 2. 優(yōu)化器:Adam,用于更新網(wǎng)絡(luò)權(quán)重,根據(jù)損失函數(shù)更新權(quán)重以最小化損失 3. 評價指標:accuracy,用于評價模型在訓練和測試期間的分類準確度 這三個specification對模型訓練至關(guān)重要: - 損失函數(shù)決定了模型在訓練時要最小化的代價函數(shù) - 優(yōu)化器決定了模型如何根據(jù)損失函數(shù)更新權(quán)重以最小化損失 - 評價指標用于評判模型的訓練效果和泛化能力 ''' model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) #訓練數(shù)據(jù)上擬合模型 ''' 該行代碼會使用X_train和Y_train的數(shù)據(jù)對模型進行訓練,具體參數(shù)為: - X_train:訓練數(shù)據(jù)的特征值 - Y_train:訓練數(shù)據(jù)的標簽值 - batch_size:批大小,這里為32,表示每批32個樣本 - epochs:訓練輪數(shù),這里為10輪 - verbose:日志顯示,這里為1,顯示一個進度條 - 所以,這行代碼會以以下方式訓練模型: 1. X_train和Y_train作為訓練集數(shù)據(jù) 2. 以批大小32的mini-batch進行訓練,每批選32個樣本進行訓練更新 3. 訓練10輪,用全部訓練集訓練10次 4. 訓練過程中顯示一個進度條,日志級別為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-07Python計算三角函數(shù)之a(chǎn)sin()方法的使用
這篇文章主要介紹了Python計算三角函數(shù)之a(chǎn)sin()方法的使用,是Python入門的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05python3 pandas 讀取MySQL數(shù)據(jù)和插入的實例
下面小編就為大家分享一篇python3 pandas 讀取MySQL數(shù)據(jù)和插入的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04