深度學習之手寫數字識別

2021-08-17 11:51:57 字數 4495 閱讀 7624

mnist是乙個入門級的計算機視覺資料集,它包含各種手寫數字:

它也包含每一張對應的標籤,告訴我們這個是數字幾。比如,上面這四張的標籤分別是5,0,4,1。

mnist資料集的官網是

yann lecun's website

這份**

,然後用下面的**匯入到你的專案裡面,也可以直接複製貼上到你的**檔案裡面。

import input_data

mnist = input_data.read_data_sets("mnist_data/", one_hot=true)

正如前面提到的一樣,每乙個mnist資料單元有兩部分組成:一張包含手寫數字的和乙個對應的標籤。我們把這些設為「xs」,把這些標籤設為「ys」。訓練資料集和測試資料集都包含xs和ys,比如訓練資料集的是mnist.train.images,訓練資料集的標籤是mnist.train.labels

會自動建立乙個'mnist_data'的目錄來儲存資料。

import input_data

mnist = input_data.read_data_sets('mnist_data', one_hot=true)

mnist是乙個輕量級的類。它以numpy陣列的形式儲存著訓練、校驗和測試資料集。同時提供了乙個函式,用於在迭代中獲得minibatch,後面我們將會用到。

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("mnist_data/", one_hot=true)

#建立乙個互動式session

sess = tf.interactivesession()

#建立兩個佔位符,x為輸入網路的影象,y_為輸入網路的影象類別

x = tf.placeholder("float", shape=[none, 784])

y_ = tf.placeholder("float", shape=[none, 10])

#權重初始化函式

def weight_variable(shape):

#輸出服從截尾正態分佈的隨機值

initial = tf.truncated_normal(shape, stddev=0.1)

return tf.variable(initial)

#偏置初始化函式

def bias_variable(shape):

initial = tf.constant(0.1, shape=shape)

return tf.variable(initial)

#建立卷積op

#x 是乙個4維張量,shape為[batch,height,width,channels]

#卷積核移動步長為1。填充型別為same,可以不丟棄任何畫素點

def conv2d(x, w):

return tf.nn.conv2d(x, w, strides=[1,1,1,1], padding="same")

#建立池化op

#採用最大池化,也就是取視窗中的最大值作為結果

#x 是乙個4維張量,shape為[batch,height,width,channels]

#ksize表示pool視窗大小為2x2,也就是高2,寬2

#strides,表示在height和width維度上的步長都為2

def max_pool_2x2(x):

return tf.nn.max_pool(x, ksize=[1,2,2,1],

strides=[1,2,2,1], padding="same")

#第1層,卷積層

#初始化w為[5,5,1,32]的張量,表示卷積核大小為5*5,第一層網路的輸入和輸出神經元個數分別為1和32

w_conv1 = weight_variable([5,5,1,32])

#初始化b為[32],即輸出大小

b_conv1 = bias_variable([32])

#把輸入x(二維張量,shape為[batch, 784])變成4d的x_image,x_image的shape應該是[batch,28,28,1]

#-1表示自動推測這個維度的size

x_image = tf.reshape(x, [-1,28,28,1])

#把x_image和權重進行卷積,加上偏置項,然後應用relu啟用函式,最後進行max_pooling

#h_pool1的輸出即為第一層網路輸出,shape為[batch,14,14,1]

h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)

h_pool1 = max_pool_2x2(h_conv1)

#第2層,卷積層

#卷積核大小依然是5*5,這層的輸入和輸出神經元個數為32和64

w_conv2 = weight_variable([5,5,32,64])

b_conv2 = weight_variable([64])

#h_pool2即為第二層網路輸出,shape為[batch,7,7,1]

h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)

h_pool2 = max_pool_2x2(h_conv2)

#第3層, 全連線層

#這層是擁有1024個神經元的全連線層

#w的第1維size為7*7*64,7*7是h_pool2輸出的size,64是第2層輸出神經元個數

w_fc1 = weight_variable([7*7*64, 1024])

b_fc1 = bias_variable([1024])

#計算前需要把第2層的輸出reshape成[batch, 7*7*64]的張量

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])

h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)

#dropout層

#為了減少過擬合,在輸出層前加入dropout

keep_prob = tf.placeholder("float")

h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

#輸出層

#最後,新增乙個softmax層

#可以理解為另乙個全連線層,只不過輸出時使用softmax將網路輸出值轉換成了概率

w_fc2 = weight_variable([1024, 10])

b_fc2 = bias_variable([10])

y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, w_fc2) + b_fc2)

#**值和真實值之間的交叉墒

cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv))

#train op, 使用adam優化器來做梯度下降。學習率為0.0001

train_step = tf.train.adamoptimizer(1e-4).minimize(cross_entropy)

#評估模型,tf.argmax能給出某個tensor物件在某一維上資料最大值的索引。

#因為標籤是由0,1組成了one-hot vector,返回的索引就是數值為1的位置

correct_predict = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))

#計算正確**項的比例,因為tf.equal返回的是布林值,

#使用tf.cast把布林值轉換成浮點數,然後用tf.reduce_mean求平均值

accuracy = tf.reduce_mean(tf.cast(correct_predict, "float"))

#初始化變數

sess.run(tf.initialize_all_variables())

#開始訓練模型,迴圈20000次,每次隨機從訓練集中抓取50幅影象

for i in range(20000):

batch = mnist.train.next_batch(50)

if i%100 == 0:

#每100次輸出一次日誌

train_accuracy = accuracy.eval(feed_dict=)

print ("step %d, training accuracy %g" % (i, train_accuracy))

train_step.run(feed_dict=)

print ("test accuracy %g" % accuracy.eval(feed_dict=))

kNN之手寫數字識別

import numpy as np listdir 列出給定目錄的檔名 from os import listdir import operator inx 分類的輸入向量,dataset 輸入的訓練樣本集,labels 標籤向量,k 近鄰數 defclassify0 inx,dataset,la...

Python基礎學習之手寫識別演算法

k 近鄰演算法 from numpy import python裡的計算包numpy import operator 運算子模組 import os 資料準備所需的函式 def createdataset group array 1.0,1.1 1.0,1.0 0,0 0,0.1 labels a ...

Matlab深度學習實踐之手寫體識別(含詳細注釋)

matlab這幾年在人工智慧這塊兒也越做越好了,最近為了熟悉matlab如何搭建神經網路,自己做了乙個手寫體識別實驗,記錄一下。實驗任務非常簡單,網路搭的也非常隨意,不合理的地方也懶得改,旨在走通matlab搭建神經網路的流程。首先,資料集為mnist資料集 我已經把資料按類別分好,分為train和...