日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

写给初学者的深度学习教程之 MNIST 数字识别

發(fā)布時(shí)間:2025/5/22 pytorch 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 写给初学者的深度学习教程之 MNIST 数字识别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一般而言,MNIST 數(shù)據(jù)集測(cè)試就是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)當(dāng)中的"Hello World"工程,幾乎是所有的教程都會(huì)把它放在最開(kāi)始的地方.這是因?yàn)?#xff0c;這個(gè)簡(jiǎn)單的工程包含了大致的機(jī)器學(xué)習(xí)流程,通過(guò)練習(xí)這個(gè)工程有助于讀者加深理解機(jī)器學(xué)習(xí)或者是深度學(xué)習(xí)的大致流程.

但恰恰有那么一部分同學(xué),由于初入深度學(xué)習(xí)這個(gè)領(lǐng)域,腦海中還沒(méi)有清晰的概念,所以即使是 MNIST 數(shù)字識(shí)別這樣簡(jiǎn)單的例子,我覺(jué)得也應(yīng)該有人稍微詳細(xì)地講解一下。

本文的目的就是用更耐心的方式去引導(dǎo)初學(xué)者理解深度學(xué)習(xí)的大致流程和操作技巧.
最核心的模型

無(wú)論是機(jī)器學(xué)習(xí)還是深度學(xué)習(xí),都繞不過(guò)模型.深度學(xué)習(xí)中的模型主要是各種神經(jīng)網(wǎng)絡(luò).

但只有模型是不夠的,前提條件其實(shí)是數(shù)據(jù),然后,后置的操作是訓(xùn)練,再之后是測(cè)試.
這里寫(xiě)圖片描述

模型通過(guò)不斷的訓(xùn)練從數(shù)據(jù)中學(xué)習(xí),然后通過(guò)測(cè)試去驗(yàn)證模型的正確性.

MNIST 數(shù)字識(shí)別工程,也是為了確定一個(gè)模型,然后進(jìn)行訓(xùn)練,訓(xùn)練過(guò)程中這個(gè)模型從大量的數(shù)字圖片中學(xué)習(xí)得到識(shí)別手寫(xiě)數(shù)字的能力,最后,需要測(cè)試驗(yàn)證這個(gè)模型是否足夠理想和優(yōu)秀.

MNIST 數(shù)字識(shí)別項(xiàng)目,模型可以是傳統(tǒng)的機(jī)器學(xué)習(xí)中的模型,也可以使用深度學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò).在本文中,我使用的是 CNN,然后用的是 Python 和 Tensorflow.
MNIST 是什么?

MNIST 是一個(gè)小型的手寫(xiě)數(shù)字圖片庫(kù),它總共有 60000 張圖片,其中 50000 張訓(xùn)練圖片,10000 張測(cè)試圖片.每張圖片的像素都是 28 * 28
這里寫(xiě)圖片描述
MNIST 對(duì)應(yīng)上圖數(shù)據(jù)這一塊,它需要導(dǎo)入到模型當(dāng)中.

從數(shù)據(jù)到模型一般而言是需要轉(zhuǎn)化的,這一步叫做數(shù)據(jù)預(yù)處理。Tensorflow 接受 Numpy 中的 ndarray ,所以要想辦法進(jìn)行轉(zhuǎn)換.

它的官網(wǎng)地址如下:
http://yann.lecun.com/exdb/mnist/

數(shù)據(jù)庫(kù)其實(shí)只由 4 個(gè)文件組成.
這里寫(xiě)圖片描述

下載下來(lái),然后分別解壓縮,可以發(fā)現(xiàn)其實(shí)只是 4 個(gè) bin 文件.
這里寫(xiě)圖片描述

train-images.idx3-ubyte 包含了 50000 張訓(xùn)練圖片.
train-labels.idx1-ubyte 包含了 50000 個(gè)標(biāo)簽.

t10k-images.idx3-ubyte 包含了 10000 張訓(xùn)練圖片.
t10k-labels.idx1-ubyte 包含了 10000 個(gè)標(biāo)簽.

在這里有一點(diǎn),非常重要,MNIST 將需要圖片或者標(biāo)簽全部寫(xiě)入到一個(gè) bin 文件當(dāng)中去了,如果要讀取某張圖片和對(duì)應(yīng)的標(biāo)簽值就需要按照一定的方法從 bin 文件中分割.

不過(guò),MNIST 官網(wǎng)有 bin 文件的結(jié)果說(shuō)明,所以根據(jù)結(jié)構(gòu)很容易編寫(xiě)代碼實(shí)現(xiàn).
這里寫(xiě)圖片描述

我們先看,訓(xùn)練用的標(biāo)簽文件.

0000 起始位置是一個(gè)魔數(shù) 數(shù)值為 2049
0004 文件這個(gè)地方存放的數(shù)值是 6000 代表 6000 個(gè)標(biāo)簽
0008 文件這個(gè)地方開(kāi)始按順序存放與訓(xùn)練圖片對(duì)應(yīng)的數(shù)字標(biāo)簽 數(shù)值 0~9 我想大家都知道是什么吧

??? 1
??? 2
??? 3

所以,如果我們要讀取標(biāo)簽的話,從標(biāo)簽文件開(kāi)始偏移8個(gè)ubyte就能讀取所有的標(biāo)簽數(shù)值了.

再看看訓(xùn)練用的圖片集文件

0000 位置也是一個(gè)魔數(shù)
0004 代表了本文件中的圖片數(shù)量
0008 文件這個(gè)位置存放的是一張圖片的高
0012 文件這個(gè)位置存放的是一張圖片的寬
0016 從這里起,代表的是圖像中的每一個(gè)像素點(diǎn)

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6

如果我們想要讀取第一張圖片怎么辦?

從文件起始位置偏移16個(gè)byte,然后讀取后面的28*28也就是 784 個(gè)字節(jié).
如果要讀取第二張圖片能?
從文件起始位置偏移16+(2-1)*784個(gè)byte,然后讀取后面的28*28個(gè)字節(jié).
讀取第 n 張圖片時(shí)
從文件起始位置偏移 16+(n-1)*784 個(gè)byte,然后讀取后面的28*28個(gè)字節(jié).

一切都是有套路可以循的.

至于測(cè)試圖片集文件和測(cè)試標(biāo)簽集文件,跟上面的類(lèi)似,就不繼續(xù)分析了.

我們可以自己按照bin文件的格式提取圖片和標(biāo)簽,但考慮到這個(gè)沒(méi)有技術(shù)含量又枯燥無(wú)畏,常見(jiàn)的機(jī)器學(xué)習(xí)框架都預(yù)置了對(duì)MNIST的處理,如scklean和Tensorflow,并不需要我們動(dòng)手.極大減低了我們的痛苦
人生苦短,我用python大概就是這個(gè)意思.

接下來(lái)的內(nèi)容,我們可以看到 Tensorflow 可以很輕松地實(shí)現(xiàn)對(duì) MNIST 中數(shù)據(jù)的讀取.
Tensorflow 讀取MNIST圖片數(shù)據(jù)

前面說(shuō)過(guò) Tensorflow 能很容易對(duì) MNIST 進(jìn)行讀取和格式轉(zhuǎn)換,其實(shí)是因?yàn)?Tensorflow 示例教程替我們做了這一部分的工作.

from tensorflow.examples.tutorials.mnist import input_data

??? 1

從mnist這個(gè)模塊中引入 input_data 這個(gè)類(lèi).

# MNIST_data 代表當(dāng)前程序文件所在的目錄中,用于存放MNIST數(shù)據(jù)的文件夾,如果沒(méi)有則新建,然后下載.
mnist = input_data.read_data_sets("MNIST_data",one_hot=True)

??? 1
??? 2

只需要調(diào)用 input_data 的 read_data_sets() 方法就好了。

如果當(dāng)前文件所在目錄中,不存在 MNIST_data 這個(gè)目錄的話,程序會(huì)自動(dòng)下載 MNIST 數(shù)據(jù)到這個(gè)位置,如果已經(jīng)存在了的話,就直接讀取數(shù)據(jù)文件。

把所有的圖片讀取出來(lái)后,創(chuàng)建一個(gè) mnist,mnist 是一個(gè) dataset 類(lèi)實(shí)例,里面有許多 numpy 數(shù)組,存放圖片和標(biāo)簽.

需要注意的是 MNIST 本身數(shù)據(jù)集分為兩個(gè)部分.

訓(xùn)練集 和測(cè)試集

但在 input_data 中,人為增加了驗(yàn)證集,默認(rèn) 5000 張圖片.

validation_images = train_images[:validation_size]
validation_labels = train_labels[:validation_size]
train_images = train_images[validation_size:]
train_labels = train_labels[validation_size:]

??? 1
??? 2
??? 3
??? 4

所以,最終有3個(gè)數(shù)據(jù)集:
訓(xùn)練集、測(cè)試集、驗(yàn)證集

通過(guò) mnist 對(duì)象可以輕松訪問(wèn)它們,如下面代碼所示

mnist.train.images
mnist.train.labels

mnist.test.images
mnist.test.labels

mnist.validation.images
mnist.validation.labels

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8

需要注意的是,讀取后的圖片數(shù)據(jù),每張圖片就是numpy 數(shù)組中一行的數(shù)據(jù).

我們簡(jiǎn)單打印一下

print(mnist.train.images.shape)
print(mnist.train.labels.shape)

??? 1
??? 2

打印的結(jié)果如下:

(55000, 784)
(55000, 10)

??? 1
??? 2

可以看到,train.images 數(shù)組行數(shù)為55000 列數(shù)為 784,代表了 55000 張測(cè)試圖片.

好奇的同學(xué)也可以將測(cè)試圖片可視化的方式呈現(xiàn).

#獲取第二張圖片
image = mnist.train.images[1,:]
#將圖像數(shù)據(jù)還原成28*28的分辨率
image = image.reshape(28,28)
#打印對(duì)應(yīng)的標(biāo)簽
print(mnist.train.labels[1])

plt.figure()
plt.imshow(image)
plt.show()

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10

這里寫(xiě)圖片描述

可以看到圖片其實(shí)是數(shù)字3,標(biāo)簽內(nèi)容如下.

[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]

??? 1

這是 one-hot 的形式,它代表標(biāo)簽值是 3.
Tensorflow 設(shè)置 CNN 結(jié)構(gòu)

上面的內(nèi)容介紹了如何在 Tensorflow 中讀取 MNIST 數(shù)據(jù)集的圖片和標(biāo)簽,接下來(lái)要做的事情就是搞定模塊這一環(huán)節(jié).
這里寫(xiě)圖片描述
模型我選定的是 CNN,也就是卷積神經(jīng)網(wǎng)絡(luò),在這里我假設(shè)大家都明白 CNN 的概念,我要確定一個(gè) CNN 來(lái)學(xué)習(xí)如何識(shí)別手寫(xiě)數(shù)字的能力.

為了簡(jiǎn)單起見(jiàn),我確定了一個(gè) 4 層的神經(jīng)網(wǎng)絡(luò).
這里寫(xiě)圖片描述
從左到右,分別是輸入層、卷積層、全連接層、輸出層.

??? 卷積層我用了 3x3 的卷積核,數(shù)量為 32 stride為 1
??? 激活方法用了 relu
??? 然后用了池化層 2x2 的核 stride 為 2
??? fc1 層用了 784 個(gè)神經(jīng)元
??? output 層 10 個(gè)神經(jīng)元,用于預(yù)測(cè)一張測(cè)試圖片中每個(gè)數(shù)字的概率,其中的概率經(jīng) softmax 處理過(guò)

本文想測(cè)試一下,就是這個(gè)再簡(jiǎn)單不過(guò)的卷積神經(jīng)網(wǎng)絡(luò),它對(duì) MNIST 中數(shù)字的識(shí)別效果如何.

下面就是代碼

# None 代表圖片數(shù)量未知
input = tf.placeholder(tf.float32,[None,784])
# 將input 重新調(diào)整結(jié)構(gòu),適用于CNN的特征提取
input_image = tf.reshape(input,[-1,28,28,1])

# y是最終預(yù)測(cè)的結(jié)果
y = tf.placeholder(tf.float32,[None,10])

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7

因?yàn)?Tensorflow 一次可以訓(xùn)練多張圖片,所以要用一個(gè)占位符 placeholder 這樣具體數(shù)值可以在后面訓(xùn)練時(shí)動(dòng)態(tài)分配.

# input 代表輸入,filter 代表卷積核
def conv2d(input,filter):
??? return tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='SAME')
# 池化層
def max_pool(input):
??? return tf.nn.max_pool(input,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

# 初始化卷積核或者是權(quán)重?cái)?shù)組的值
def weight_variable(shape):
??? initial = tf.truncated_normal(shape,stddev=0.1)
??? return tf.Variable(initial)

# 初始化bias的值
def bias_variable(shape):
??? return tf.Variable(tf.zeros(shape))

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16

上面4個(gè)方法都是工具方法,為了幫助我們創(chuàng)造神經(jīng)網(wǎng)絡(luò)的.

??? conv2d() 是創(chuàng)造卷積層的方法.
??? max_pool() 是池化層.
??? 然后剩下的兩個(gè)方法都是為了初始化超參數(shù)的.

#[filter_height, filter_width, in_channels, out_channels]
#定義了卷積核
filter = [3,3,1,32]

filter_conv1 = weight_variable(filter)
b_conv1 = bias_variable([32])
# 創(chuàng)建卷積層,進(jìn)行卷積操作,并通過(guò)Relu激活,然后池化
h_conv1 = tf.nn.relu(conv2d(input_image,filter_conv1)+b_conv1)
h_pool1 = max_pool(h_conv1)

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9

定義了卷積層的結(jié)構(gòu).

h_flat = tf.reshape(h_pool1,[-1,14*14*32])

W_fc1 = weight_variable([14*14*32,784])
b_fc1 = bias_variable([784])
h_fc1 = tf.matmul(h_flat,W_fc1) + b_fc1

W_fc2 = weight_variable([784,10])
b_fc2 = bias_variable([10])

y_hat = tf.matmul(h_fc1,W_fc2) + b_fc2

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11

h_flat 是將 pool 后的卷積核全部拉平成一行數(shù)據(jù),便于和后面的全連接層進(jìn)行數(shù)據(jù)運(yùn)算.

y_hat 是整個(gè)神經(jīng)網(wǎng)絡(luò)的輸出層,包含 10 個(gè)結(jié)點(diǎn).

cross_entropy = tf.reduce_mean(
??? tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=y_hat ))

??? 1
??? 2

代價(jià)函數(shù)采用了 cross_entropy,顯然,整個(gè)模型輸出的值經(jīng)過(guò)了 softmax 處理,將輸出的值換算成每個(gè)類(lèi)別的概率.

到這里,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)我們就確定了,下面要做的就是訓(xùn)練神經(jīng)網(wǎng)絡(luò)和測(cè)試神經(jīng)網(wǎng)絡(luò)了.
訓(xùn)練神經(jīng)網(wǎng)絡(luò)

這里寫(xiě)圖片描述

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

??? 1

在這里,定義了一個(gè)梯度下降的訓(xùn)練器,學(xué)習(xí)率是0.01.
train_step 其實(shí)就是一個(gè)黑盒子,它隱去了很多的技術(shù)細(xì)節(jié),但同時(shí)也極大方便了我們的開(kāi)發(fā).
我們只需要知道,train_step在每一次訓(xùn)練后都會(huì)調(diào)整神經(jīng)網(wǎng)絡(luò)中參數(shù)的值,以便 cross_entropy 這個(gè)代價(jià)函數(shù)的值最低,也就是為了神經(jīng)網(wǎng)絡(luò)的表現(xiàn)越來(lái)越好.

correct_prediction = tf.equal(tf.argmax(y_hat,1),tf.argmax(y,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

??? 1
??? 2
??? 3

上面代碼的目的是定義準(zhǔn)確率,我們會(huì)在后面的代碼中周期性地打印準(zhǔn)確率,訓(xùn)練測(cè)試后,我們還要打印測(cè)試集下面神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確率.

with tf.Session() as sess:
??? sess.run(tf.global_variables_initializer())

??? for i in range(10000):

??????? batch_x,batch_y = mnist.train.next_batch(50)

??????? if i % 100 == 0:
??????????? train_accuracy = accuracy.eval(feed_dict={input:batch_x,y:batch_y})
??????????? print("step %d,train accuracy %g " %(i,train_accuracy))

??????? train_step.run(feed_dict={input:batch_x,y:batch_y})

??? print("test accuracy %g " % accuracy.eval(feed_dict={input:mnist.test.images,y:mnist.test.labels}))

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14

我們的 epoch 是 10000 次,也就是說(shuō)需要訓(xùn)練10000個(gè)周期.每個(gè)周期訓(xùn)練都是小批量訓(xùn)練 50 張,然后每隔 100 個(gè)訓(xùn)練周期打印階段性的準(zhǔn)確率.

訓(xùn)練完成后,還需要驗(yàn)證測(cè)試集下的準(zhǔn)確度

step 9600,train accuracy 0.98
step 9700,train accuracy 0.96
step 9800,train accuracy 1
step 9900,train accuracy 1

test accuracy 0.9766

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6

最終的測(cè)試成績(jī),準(zhǔn)確率 97.66%.

那么準(zhǔn)確率為 97.66 % 算不算高呢?

其實(shí),非常不錯(cuò)了.我們文章采取的模型是我自己設(shè)置的最簡(jiǎn)單的模型.但即使這樣,相比于傳統(tǒng)的機(jī)器學(xué)習(xí)方法,它的確不錯(cuò)了.大家可以去官網(wǎng)看看不同的模型,在 MNIST 測(cè)試時(shí)的表現(xiàn).

下面是完整代碼,我是 Python3.5 + Tensorflow1.7
mnist_conv.py

# coding:utf-8

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

mnist = input_data.read_data_sets("MNIST_data",one_hot=True)


input = tf.placeholder(tf.float32,[None,784])
input_image = tf.reshape(input,[-1,28,28,1])

y = tf.placeholder(tf.float32,[None,10])

# input 代表輸入,filter 代表卷積核
def conv2d(input,filter):
??? return tf.nn.conv2d(input,filter,strides=[1,1,1,1],padding='SAME')
# 池化層
def max_pool(input):
??? return tf.nn.max_pool(input,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

# 初始化卷積核或者是權(quán)重?cái)?shù)組的值
def weight_variable(shape):
??? initial = tf.truncated_normal(shape,stddev=0.1)
??? return tf.Variable(initial)

# 初始化bias的值
def bias_variable(shape):
??? return tf.Variable(tf.zeros(shape))

#[filter_height, filter_width, in_channels, out_channels]
#定義了卷積核
filter = [3,3,1,32]

filter_conv1 = weight_variable(filter)
b_conv1 = bias_variable([32])
# 創(chuàng)建卷積層,進(jìn)行卷積操作,并通過(guò)Relu激活,然后池化
h_conv1 = tf.nn.relu(conv2d(input_image,filter_conv1)+b_conv1)
h_pool1 = max_pool(h_conv1)

h_flat = tf.reshape(h_pool1,[-1,14*14*32])

W_fc1 = weight_variable([14*14*32,768])
b_fc1 = bias_variable([768])
h_fc1 = tf.matmul(h_flat,W_fc1) + b_fc1

W_fc2 = weight_variable([768,10])
b_fc2 = bias_variable([10])

y_hat = tf.matmul(h_fc1,W_fc2) + b_fc2

?

cross_entropy = tf.reduce_mean(
??? tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=y_hat ))

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
#train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

correct_prediction = tf.equal(tf.argmax(y_hat,1),tf.argmax(y,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

with tf.Session() as sess:
??? sess.run(tf.global_variables_initializer())

??? for i in range(10000):

??????? batch_x,batch_y = mnist.train.next_batch(50)

??????? if i % 100 == 0:
??????????? train_accuracy = accuracy.eval(feed_dict={input:batch_x,y:batch_y})
??????????? print("step %d,train accuracy %g " %(i,train_accuracy))

??????? train_step.run(feed_dict={input:batch_x,y:batch_y})

??????? # sess.run(train_step,feed_dict={x:batch_x,y:batch_y})

??? print("test accuracy %g " % accuracy.eval(feed_dict={input:mnist.test.images,y:mnist.test.labels}))

??? 1
??? 2
??? 3
??? 4
??? 5
??? 6
??? 7
??? 8
??? 9
??? 10
??? 11
??? 12
??? 13
??? 14
??? 15
??? 16
??? 17
??? 18
??? 19
??? 20
??? 21
??? 22
??? 23
??? 24
??? 25
??? 26
??? 27
??? 28
??? 29
??? 30
??? 31
??? 32
??? 33
??? 34
??? 35
??? 36
??? 37
??? 38
??? 39
??? 40
??? 41
??? 42
??? 43
??? 44
??? 45
??? 46
??? 47
??? 48
??? 49
??? 50
??? 51
??? 52
??? 53
??? 54
??? 55
??? 56
??? 57
??? 58
??? 59
??? 60
??? 61
??? 62
??? 63
??? 64
??? 65
??? 66
??? 67
??? 68
??? 69
??? 70
??? 71
??? 72
??? 73
??? 74
??? 75
??? 76
??? 77
??? 78
??? 79

擴(kuò)展

本文中的神經(jīng)網(wǎng)絡(luò),麻雀雖小,但五臟俱全.

不過(guò),同學(xué)們可以持續(xù)優(yōu)化它,畢竟有的神經(jīng)網(wǎng)絡(luò)能夠達(dá)到 99.67% 的準(zhǔn)確率.

??? 設(shè)計(jì)更深的層次的神經(jīng)網(wǎng)絡(luò),本文只有4層,并且這4層還包括輸入輸出層,同學(xué)們可以擴(kuò)展更多的層,變現(xiàn)效果肯定更好.
??? 使用其它的優(yōu)化器,比如 AdamOptimizer
??? 使用 dropout 優(yōu)化手段
??? 使用數(shù)據(jù)增強(qiáng)技術(shù),讓 MNIST 可供訓(xùn)練的圖片更多,這樣神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)也更充分
??? 用 Tensorboard 記錄訓(xùn)練過(guò)程的準(zhǔn)確率或者 cross_entropy 的數(shù)值,最后生成可視化的報(bào)表

最終,還是要建議同學(xué)們自己動(dòng)手敲一遍代碼,敲完然后思考一下,為什么要這樣寫(xiě),等你能夠比較流利敲出代碼時(shí),你就通過(guò) MNIST 基本掌握了深度學(xué)習(xí)的一些套路,這會(huì)提高你在后續(xù)學(xué)習(xí)中的興致.如果你不親手敲代碼的化,那么深度學(xué)習(xí)的很多概念,你沒(méi)有辦法讓它直觀起來(lái),并且你會(huì)把它們忘掉.

最后,如果應(yīng)對(duì)了 MNIST 之后,我們就可以將目光放到更復(fù)雜的數(shù)據(jù)集上去。比如 CIFAR10,比如自動(dòng)駕駛中的行人識(shí)別。

光看書(shū)是不行的,真的要親手實(shí)踐。

總結(jié)

以上是生活随笔為你收集整理的写给初学者的深度学习教程之 MNIST 数字识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。