欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pytorch實現(xiàn)下載加載mnist數(shù)據(jù)集

 更新時間:2024年06月25日 09:29:50   作者:啥也不會的阿興  
這篇文章主要介紹了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)文章

  • 詳解Python小數(shù)據(jù)池和代碼塊緩存機制

    詳解Python小數(shù)據(jù)池和代碼塊緩存機制

    這篇文章主要介紹了詳解Python 小數(shù)據(jù)池和代碼塊緩存機制的相關(guān)資料,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-04-04
  • django創(chuàng)建css文件夾的具體方法

    django創(chuàng)建css文件夾的具體方法

    在本文里小編給大家總結(jié)的是關(guān)于django創(chuàng)建css文件夾的具體方法,對此有需要的朋友們參考下吧。
    2020-07-07
  • Python中使用Pillow庫生成立體文字的圖像

    Python中使用Pillow庫生成立體文字的圖像

    在眾多Python庫中,Pillow庫以其豐富的功能和易用性在圖像處理領(lǐng)域脫穎而出,Pillow是Python領(lǐng)域中最基礎(chǔ)且常用的圖像處理庫之一,,本文將詳細介紹如何使用Python自動生成帶有立體效果的文字,我們會逐步講解輸入文字、選擇字體和顏色,并應(yīng)用立體效果來生成最終圖
    2025-03-03
  • python使用selenium爬蟲知乎的方法示例

    python使用selenium爬蟲知乎的方法示例

    這篇文章主要介紹了python使用selenium爬蟲知乎的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Python 處理日期時間的Arrow庫使用

    Python 處理日期時間的Arrow庫使用

    這篇文章主要介紹了Python 處理日期時間的Arrow庫使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 基于python實現(xiàn)簡單日歷

    基于python實現(xiàn)簡單日歷

    這篇文章主要為大家詳細介紹了基于python實現(xiàn)簡單日歷,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題

    解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題

    今天小編就為大家分享一篇解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python計算三角函數(shù)之a(chǎn)sin()方法的使用

    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ù)和插入的實例

    下面小編就為大家分享一篇python3 pandas 讀取MySQL數(shù)據(jù)和插入的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python的lambda匿名函數(shù)的簡單介紹

    Python的lambda匿名函數(shù)的簡單介紹

    Python的lambda匿名函數(shù)的簡單介紹,需要的朋友可以參考一下
    2013-04-04

最新評論