1. 程式人生 > >6 TensorFlow實現cnn識別手寫數字

6 TensorFlow實現cnn識別手寫數字

————————————————————————————————————

寫在開頭:此文參照莫煩python教程(牆裂推薦!!!)

————————————————————————————————————

  • 這個實驗的內容是:基於TensorFlow,實現手寫數字的識別。
  • 這裡用到的資料集是大家熟知的mnist資料集。
  • mnist有五萬多張手寫數字的圖片,每個圖片用28x28的畫素矩陣表示。所以我們的輸入層每個案列的特徵個數就有28x28=784個;因為數字有0,1,2…9共十個,所以我們的輸出層是個1x10的向量。輸出層是十個小於1的非負數,表示該預測是0,1,2…9的概率,我們選取最大概率所對應的數字作為我們的最終預測。
  • 真實的數字表示為該數字所對應的位置為1,其餘位置為0的1x10的向量。

下面直接貼程式碼,解釋和筆記都在註釋上了!!

#卷積神經網路(cnn)

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

#匯入資料
mnist = input_data.read_data_sets('MNIST_data',one_hot=True)#如果還沒下載mnist就下載

#定義計算正確率的函式
def t_accuracy(t_xs,t_ys):
    global prediction
    y_pre = sess.run(prediction,feed_dict={xs:t_xs})
    correct_pre = tf.equal(tf.argmax(y_pre,1
),tf.argmax(t_ys,1)) accuracy = tf.reduce_mean(tf.cast(correct_pre,tf.float32)) result = sess.run(accuracy,feed_dict={xs:t_xs,ys:t_ys}) return result #定義權重 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) #定義卷積神經網路層 def conv2d(x,W): #strides[1,x_,y_,1] return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME') #x,y,z方向的跨度都為1 #定義pooling def max_pool_2x2(x): return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')#strides[0]=strides[3]=1 #定義神經網路的輸入值和輸出值 xs = tf.placeholder(tf.float32,[None,784]) #None是不規定大小,這裡指的是案例個數,而輸入特徵個數為28x28 = 784 ys = tf.placeholder(tf.float32,[None,10]) #Nnoe也是案例個數,不做規定;10是因為有10個數字,所以輸出是10 #keep_prob = tf.placeholder(tf.float32) #dropout x_image = tf.reshape(xs,[-1,28,28,1])#-1:把所有圖片的維度丟到一邊不管;28,28是畫素,1是維度,因為這裡的圖片是黑白的。輸出為[n_samoles,28,28,1] #定義第一層卷積層 W_conv1 = weight_variable([5,5,1,32]) #patch5x5,in_size(單位) 1,out_size(高度) 32 b_conv1 = bias_variable([32]) h_conv1 = tf.nn.relu(conv2d(x_image,W_conv1) + b_conv1) #輸出格式28x28x32 h_pool1 = max_pool_2x2(h_conv1) #輸出為14x14x32 #定義第二層卷積層 W_conv2 = weight_variable([5,5,32,64]) #patch5x5,in_size(單位) 32,out_size(高度) 64 b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2) #輸出格式14x14x64 h_pool2 = max_pool_2x2(h_conv2) #輸出為7x7x64 #定義第一層全連線網路層 W_fc1 = weight_variable([7*7*64,1024]) b_fc1 = bias_variable([1024]) #將h_pool2展平 h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64]) h_fc1_drop = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1) #h_fc1_drop = tf.nn.dropout(h_fc1,keep_prob) #定義第二層全連線網路層 W_fc2=weight_variable([1024,10]) #因為有10個數字,所以輸出10個 b_fc2=bias_variable([10]) #因為有十個數字,所以輸出10個 prediction=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2) #進行分類 #計算誤差 cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1])) #此誤差計算方式和softmax配套用,效果好 #訓練 train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) #開始訓練 sess = tf.Session() sess.run(tf.global_variables_initializer()) for i in range(2000): batch_xs,batch_ys = mnist.train.next_batch(100) #提取資料集的100個數據,因為原來資料太大了 sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys}) if i%200 == 0: print (t_accuracy(mnist.test.images,mnist.test.labels)) #每隔50個,列印一下正確率。注意:這裡是要用test的資料來測試
Extracting MNIST_data\train-images-idx3-ubyte.gz
Extracting MNIST_data\train-labels-idx1-ubyte.gz
Extracting MNIST_data\t10k-images-idx3-ubyte.gz
Extracting MNIST_data\t10k-labels-idx1-ubyte.gz
0.0993
0.9236
0.956
0.9626
0.97
0.9742
0.9778
0.9725
0.9796
0.9826

由於是在裝有強勁的顯示卡的桌上型電腦上執行的,所以幾秒就出結果了,看得也是暢快!!訓練了2000次,效果就有98.26%了,算不錯吧?

相關推薦

6 TensorFlow實現cnn識別數字

———————————————————————————————————— 寫在開頭:此文參照莫煩python教程(牆裂推薦!!!) ———————————————————————————————————— 這個實驗的內容是:基於TensorFlow,實現

tensorflow實現CNN識別數字

上一篇使用TensorFlow識別手寫數字,是直接採用了softmax進行多分類,直接將28*28的圖片轉換成為了784維的向量作為輸入,然後通過一個(784,10)的權重,將輸入轉換成一個10維的向量,最後再將對每一個數字預測一個概率,概率最大的數字就是預測的結果。因為,

Android 通過 TensorFlow 訓練模型識別數字

隨著機器學習的發展,目前已經湧現出很多不錯的學習框架,其中 Google 推出的 Tensorflow 是最流行的可以說沒有之一,並且越來越多的機器學習成果應用到移動端,例如人臉檢測、語音識別的 App。本場 Chat 將用最簡單的方式,利用 Tensorflo

tensorflow-神經網路識別數字

資料下載連線:http://yann.lecun.com/exdb/mnist/ 下載t10k-images-idx3-ubyte.gz;t10k-labels-idx1-ubyte.gz;train-images-idx3-ubyte.gz;train-labels-idx1

Android+TensorFlow+CNN+MNIST 數字識別實現

SkySeraph 2018 Overview 本文系“SkySeraph AI 實踐到理論系列”第一篇,咱以AI界的HelloWord 經典MNIST資料集為基礎,在Android平臺,基於TensorFlow,實現CNN的手寫數字識別。Code here~ Practice Env

學習筆記TF024:TensorFlow實現Softmax Regression(回歸)識別數字

概率 none nump 簡單 測試數據 python dice bat desc TensorFlow實現Softmax Regression(回歸)識別手寫數字。MNIST(Mixed National Institute of Standards and Techno

TensorFlow實現Softmax Regression識別數字中"TimeoutError: [WinError 10060] 由於連接方在一段時間後沒有正確答復或連接的主機沒有反應,連接嘗試失敗”問題

http 截圖 技術 數字 alt 分享圖片 inf 主機 orf 出現問題: 在使用TensorFlow實現MNIST手寫數字識別時,出現“TimeoutError: [WinError 10060] 由於連接方在一段時間後沒有正確答復或連接的主機沒有反應,連接嘗試失敗”

Tensorflow專案 - 使用CNN進行數字識別

首先書寫如下的程式碼 程式碼有詳細的註釋,這裡就不一一解釋了 #coding=utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #引入資料集 mnist=inp

TensorFlow實現Softmax Regression識別數字

本章已機器學習領域的Hello World任務----MNIST手寫識別做為TensorFlow的開始。MNIST是一個非常簡單的機器視覺資料集,是由幾萬張28畫素*28畫素的手寫數字組成,這些圖片只包含灰度值資訊。 import os os.environ['TF_CPP_MIN_LOG_LEVEL']=

機器學習筆記:tensorflow實現卷積神經網路經典案例--識別數字

從識別手寫數字的案例開始認識神經網路,並瞭解如何在tensorflow中一步步建立卷積神經網路。 安裝tensorflow 資料來源 kaggle新手入門的數字識別案例,包含手寫0-9的灰度值影象的csv檔案,下載地址:https://www.

TensorFlow在MNIST中的應用 識別數字(OpenCV+TensorFlow+CNN

參考: 1.《TensorFlow技術解析與實戰》 2. http://blog.csdn.net/sparta_117/article/details/66965760 3. http://blog.csdn.net/HelloZEX/article/detail

3、TensorFlow實現Softmax迴歸識別數字

一、資料集介紹 55000個訓練集、10000個測試集、5000個驗證集。 手寫數字圖片28*28畫素,從二維結構轉化為一維(後面章節使用卷積神經網路會利用空間結構)=784維特徵。 0到9共10維label特徵。 from tensorflow.examples.tut

tensorflow學習之識別單張圖片的實現(python數字

假設我們已經安裝好了tensorflow。 一般在安裝好tensorflow後,都會跑它的demo,而最常見的demo就是手寫數字識別的demo,也就是mnist資料集。 然而我們僅僅是跑了它的demo而已,可能很多人會有和我一樣的想法,如果拿來一張數字圖片,如何應用我們訓

[052]TensorFlow Layers指南:基於CNN數字識別

TensorFlow Layers module 為容易的建立一個神經網路提供了高水平的API介面。它提供了很多方法幫助建立dense(全連線)層和卷積層,增加啟用函式和應用dropout做歸一化。在這個教程中,你會學到如何用layers構建一個卷積神經網路用於

TensorFlow實戰之Softmax Regression識別數字

一次 說明 基本 過度 pro 分類函數 數值 fun nump 關於本文說明,本人原博客地址位於http://blog.csdn.net/qq_37608890,本文來自筆者於2018年02月21日 23:10:04所撰寫內容(http://blog.csdn.

Kaggle Digit Recognizer識別數字入門賽基於tensorflow-GPU(TOP 15%)

本人原創,開源出來希望與大家互相學習。 ps:目前這個比賽前二三十名測試集的正確率為1,我覺得其中一個方法可能是將所有的樣本(從官網下載train set和 test set及其他們的標籤)喂入CNN學習,將訓練集正確率訓練到1.0就可以了,這樣用測試集測出來的結果就可以1.0了,但

Tensorflow入門教程之數字MINST識別

Tensorflow入門教程之手寫數字MINST識別 MNIST是在機器學習領域中的一個經典問題。該問題解決的是把28x28畫素的灰度手寫數字圖片識別為相應的數字,其中數字的範圍從0到9. MNIST 資料下載 Yann LeCun's MNIST page也提供了訓練集與測試集資料

tensorflow實戰入門題目--數字識別

tensorflow實戰入門題目–手寫數字的識別 這是我的第一篇部落格,有很多寫不好的地方,還請大家多多批評指正。 手寫體的示範: 匯入資料,由於mnist手寫數字在 from tensorflow.examples.tutorials.mnist import i

TensorFlow筆記(4)——優化數字識別模型之代價函式和擬合

前言 上篇筆記我們利用MNIST資料集訓練了一個手寫數字識別的模型,但是準確率非常的低,維持在91%左右,我們可以嘗試著將準確率提高到96%以上,在實驗之前我們需要先了解一些基本的概念,本篇文章可能會有些枯燥,因為大多都是理論知識。 本文重點 啟用函式 代價函式 擬合 什麼是啟用函式

tensorflow實戰:MNIST數字識別的優化2-代價函式優化,準確率98%

最簡單的tensorflow的手寫識別模型,這一節我們將會介紹其簡單的優化模型。我們會從代價函式,多層感知器,防止過擬合,以及優化器的等幾個方面來介紹優化過程。    1.代價函式的優化:             我們可以這樣將代價函式理解為真實值與預測值的差距,我們神經