1. 程式人生 > >一個單層的基礎神經網路實現手寫字識別

一個單層的基礎神經網路實現手寫字識別

import tensorflow
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt

# 普通的神經網路學習
# 學習訓練類
class Normal:

    weight = []
    biases = []

    def __init__(self):
        self.times = 1000
        self.mnist = []
        self.session = tensorflow.Session()
        self.xs = tensorflow.placeholder(tensorflow.float32, [None
, 784]) self.ys = tensorflow.placeholder(tensorflow.float32, [None, 10]) self.save_path = 'learn/result/normal.ckpt' def run(self): self.import_data() self.train() self.save() def _setWeight(self,weight): self.weight = weight def _setBiases
(self,biases):
self.biases = biases def _getWeight(self): return self.weight def _getBiases(self): return self.biases # 訓練 def train(self): prediction = self.add_layer(self.xs, 784, 10, activation_function=tensorflow.nn.softmax) cross_entropy = tensorflow.reduce_mean( -tensorflow.reduce_sum( self.ys * tensorflow.log(prediction) , reduction_indices=[1
]) ) train_step = tensorflow.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) self.session.run(tensorflow.global_variables_initializer()) for i in range(self.times): batch_xs, batch_ys = self.mnist.train.next_batch(100) self.session.run(train_step, feed_dict={self.xs: batch_xs, self.ys: batch_ys}) if i % 50 == 0: # images 變換為 labels,images相當於x,labels相當於y accurary = self.computer_accurary( self.mnist.test.images, self.mnist.test.labels, prediction ) # 資料匯入 def import_data(self): self.mnist = input_data.read_data_sets('MNIST_data', one_hot=True) # 資料儲存 def save(self): saver = tensorflow.train.Saver() path = saver.save(self.session,self.save_path) # 新增隱藏層 def add_layer(self,inputs,input_size,output_size,activation_function=None): weight = tensorflow.Variable(tensorflow.random_normal([input_size,output_size]),dtype=tensorflow.float32,name='weight') biases = tensorflow.Variable(tensorflow.zeros([1,output_size]) + 0.1,dtype=tensorflow.float32,name='biases') Wx_plus_b = tensorflow.matmul(inputs,weight) + biases self._setBiases(biases) self._setWeight(weight) if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b,) return outputs # 計算結果資料與實際資料的正確率 def computer_accurary(self,x_data,y_data,tf_prediction): prediction = self.session.run(tf_prediction,feed_dict={self.xs:x_data,self.ys:y_data}) # 返回兩個矩陣中最大值的索引號位置,然後進行相應位置的值大小比較並在此位置設定為True/False correct_predition = tensorflow.equal(tensorflow.argmax(prediction,1),tensorflow.argmax(y_data,1)) # 進行資料格式轉換,然後進行降維求平均值 accurary = tensorflow.reduce_mean(tensorflow.cast(correct_predition,tensorflow.float32)) result = self.session.run(accurary,feed_dict={self.xs:x_data,self.ys:y_data}) return result # 識別類 class NormalRead(Normal): input_size = 784 output_size = 10 def run(self): self.import_data() self.getSaver() origin_input = self._getInput() output = self.recognize(origin_input) self._showImage(origin_input) self._showOutput(output) pass # 顯示識別結果 def _showOutput(self,output): number = output.index(1) print('識別到的數字:',number) # 顯示被識別圖片 def _showImage(self,origin_input): data = [] tmp = [] i = 1 # 原資料轉換為可顯示的矩陣 for v in origin_input[0]: if i %28 == 0: tmp.append(v) data.append(tmp) tmp = [] else: tmp.append(v) i += 1 plt.figure() plt.imshow(data, cmap='binary') # 黑白顯示 plt.show() def _setBiases(self,biases): self.biases = biases pass def _setWeight(self,weight): self.weight = weight pass def _getBiases(self): return self.biases def _getWeight(self): return self.weight # 獲取訓練模型 def getSaver(self): weight = tensorflow.Variable(tensorflow.random_normal([self.input_size, self.output_size]), dtype=tensorflow.float32,name='weight') biases = tensorflow.Variable(tensorflow.zeros([1, self.output_size]) + 0.1, dtype=tensorflow.float32, name='biases') saver = tensorflow.train.Saver() saver.restore(self.session,self.save_path) self._setWeight(weight) self._setBiases(biases) def recognize(self,origin_input): input = tensorflow.placeholder(tensorflow.float32,[None,784]) weight = self._getWeight() biases = self._getBiases() result = tensorflow.matmul(input,weight) + biases resultSof = tensorflow.nn.softmax(result,) # 把結果集使用softmax進行激勵 resultSig = tensorflow.nn.sigmoid(resultSof,) # 把結果集以sigmoid函式進行激勵,用於後續分類 output = self.session.run(resultSig,{input:origin_input}) output = output[0] # 對識別結果進行分類處理 output_tmp = [] for item in output: if item < 0.6: output_tmp.append(0) else : output_tmp.append(1) return output_tmp def _getInput(self): inputs, y = self.mnist.train.next_batch(100); return [inputs[50]]

以上是程式,整個程式基於TensorFlow來實現的,具體的TensorFlow安裝我就不說了。
整個訓練過程不做多說,我發現網上關於訓練的教程很多,但是訓練結果的教程很少。

整個程式裡,通過tensorflow.train.Saver()save進行訓練結果模型進行儲存,然後再用tensorflow.train.Saver()restore進行模型恢復然後取到訓練好的weight和baises。

這裡要注意的一個地方是因為一次性隨機取出100張手寫圖片進行批量訓練的,我在取的時候其實也是批量隨機取100張,但是我傳入識別的是一張,通過以下這段程式:

def _getInput(self):
        inputs, y = self.mnist.train.next_batch(100);
        return [inputs[50]]

注意一下return這裡的資料結構,其實是取這批量的第50張,實際上這段程式寫成:

def _getInput(self):
        inputs, y = self.mnist.train.next_batch(1);
        return [inputs[0]]

會更好。
因為識別的時候是需要用到訓練的隱藏層來進行的,所以在此我雖然識別的是一張圖片,但是我必須要傳入一個批量資料的這樣一個結構。

然後再識別的地方,我使用了兩個激勵函式:

resultSof = tensorflow.nn.softmax(result,) # 把結果集使用softmax進行激勵
resultSig = tensorflow.nn.sigmoid(resultSof,) # 把結果集以sigmoid函式進行激勵,用於後續分類

這裡的話,第一個softmax激勵後的資料我發現得到的是以e為底的指數形式,轉換成普通的浮點數來看,不是很清楚到底是什麼,那麼我在做識別數字判斷的時候就不方便,所以再通過了一次sigmoid的激勵。

後續我通過一個迴圈判斷進行一次實際上的分類,這個原因首先要說到識別結果形式:

[0,0,0,0,0,0,0,0,1,0]

像以上這個資料,表示的是8,也就是說,陣列下表第幾位為1就表示是幾,如0的表示:

[1,0,0,0,0,0,0,0,0,0]

而sigmoid函式在這個地方其實就是對每個位置的資料進行了分類,我發現如果分類值小於0.52這樣的資料其實代表的是否,也就是說此位置的值對應的是0,大於0.52應該對應的是真,也就是1;而我在程式裡取的是0.6為界限做判斷。

實際上,這個界限值應該是在神經網路訓練的時候取的,而不是看識別結果來進行憑感覺取的(雖然訓練的時候的引數也是憑感覺取的)

HD089455

相關推薦

一個單層基礎神經網路實現寫字識別

import tensorflow from tensorflow.examples.tutorials.mnist import input_data import matplotlib.pyplot as plt # 普通的神經網路學習 # 學習訓練類 class No

python線上神經網路實現寫字識別系統

                神經網路實現手寫字元識別系統一、課程介紹1. 課程來源課程內容在原文件基礎上做了稍許修改,增加了部分原理介紹,步驟的拆解分析及原始碼註釋。2. 內容簡介本課程最終將基於BP神經網路實現一個手寫字元識別系統,系統會在伺服器啟動時自動讀入訓練好的神經網路檔案,如果檔案不存在,則讀入

利用BP神經網路實現寫字識別

利用python實現的BP神經網路,進行手寫字元識別,訓練與測試資料集為mnist,若實現UI介面需要安裝pyqt5。程式碼開源在個人的github:https://github.com/SpyderXu/BP_mnist_UI效果:

用python的numpy實現神經網路 實現 寫數字識別

首先是讀取檔案,train-images-idx3-ubyte等四個檔案是mnist資料集裡的資料。放在MNIST資料夾裡。MNIST資料夾和這個.py檔案放在同一個資料夾裡。 import numpy as np import struct train_images

python寫bp神經網路實現人臉性別識別1.0

寫在前面:本實驗用到的圖片均來自google圖片,侵刪! 實驗介紹 用python手寫一個簡單bp神經網路,實現人臉的性別識別。由於本人的機器配置比較差,所以無法使用網上很紅的人臉大資料資料集(如lfw資料集等等),所以我從google圖片下載了一些

邏輯迴歸softmax神經網路實現寫數字識別(cs)

邏輯迴歸softmax神經網路實現手寫數字識別全過程 1 - 匯入模組 import numpy as np import matplotlib.pyplot as plt from ld_mnist import load_digits

機器學習入門——使用TensorFlow搭建一個簡單的神經網路實現非線性迴歸

TensorFlow是一個基於資料流程式設計的符號數學系統,被廣泛應用於各類機器學習演算法的程式設計實現。 迴歸是一種基本演算法,也是機器學習中比較重要的內容。 迴歸的英文是regression,單詞原型regress的意思是“回退,退化,倒退”。其實 regressio

python神經網路解決識別問題演算法和程式碼

1.演算法 2.程式碼 import numpy # scipy.special for the sigmoid function expit() import scipy.special # library for plotting arrays import matplotlib.

載入卷積神經網路實現手寫體數字識別

上一篇部落格中,我們已經訓練好了模型 接下來我們要載入模型並識別真實場景下的一個手寫體數字 在此之前,我們先要準備好一張28*28畫素的影象(可用ps製作),然後通過處理將畫素的強度值變為0-1之間,之後即可輸入模型進行識別。 儲存已訓練的模型檔案如下: 程式

python神經網路案例——CNN卷積神經網路實現mnist手寫體識別

全棧工程師開發手冊 (作者:欒鵬) 載入樣本資料集 首先我們要有手寫體的資料集檔案 我們實現一個MNIST.py檔案,專門用來讀取手寫體檔案中的資料。 # -*- coding: UTF-8 -*- # 獲取手寫資料。

matlab+BP神經網路實現手寫體數字識別

個人部落格文章連結:http://www.huqj.top/article?id=168 接著上一篇所說的 BP神經網路,現在用它來實現一個手寫體數字的識別程式,訓練素材來自吳恩達機器學習課程,我把打包好上傳到了網盤上: 1 2 連結:htt

CNN卷積神經網路實現驗證碼識別(準確率達99%)

import tensorflow as tf from captcha.image import ImageCaptcha import numpy as np import matplotlib.pyplot as plt from PIL import Image import random n

PyTorch基礎入門六:PyTorch搭建卷積神經網路實現MNIST寫數字識別

1)卷積神經網路(CNN)簡介 關於什麼是卷積神經網路(CNN),請自行查閱資料進行學習。如果是初學者,這裡推薦一下臺灣的李巨集毅的深度學習課程。連結就不給了,這些資料網站上隨處可見。 值得一提的是,CNN雖然在影象處理的領域具有不可阻擋的勢頭,但是它絕對不僅僅只能用來影

全連線神經網路實現識別寫資料集MNIST

全連線神經網路實現識別手寫資料集MNIST MNIST是一個由美國由美國郵政系統開發的手寫數字識別資料集。手寫內容是0~9,一共有60000個圖片樣本,我們可以到MNIST官網免費下載。總共4個檔案,該檔案是二進位制內容。 train-images-idx3-ubyte.gz:  trainin

用tensorflow實現一個卷積神經網路

學了一段深度學習,最近學了tensorflow,所以想自己去根據教程寫一個簡單的卷積神經網路。 CNN:卷積神經網路的實現 一個卷積神經網路的結構一般是由輸入-->卷積-->池化-->卷積-->池化-->............-->全連線-->全連

神經網路實現Mnist寫數字識別筆記

目錄 1.Mnist手寫數字識別介紹         Mnist手寫數字識別是Kaggle上一個很經典的機器學習資料集,裡邊包括55000張訓練資料和10000張圖片的測試資料,每張圖片大小為28*28畫素的單通圖片。該任務為通過機器學習來識別圖片中的

深度學習:tensorflow入門:卷積神經網路實現MNIST寫字型識別

程式碼中./data/mnist/input_data/為真實MNIST資料集的路徑 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 定義

用純numpy實現一個簡單的神經網路(理解)

簡單的一個numpy神經網路示例: import numpy as np class NeuralNetwork(): def __init__(self): #將權重轉換為3×1矩陣,其值從-1到1,平均值為0 self.synaptic_we

一個簡單的神經網路實現

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #輸入層節點與輸出層節點 input_node=784 output_node=10 #配置神經網路引數 #隱藏層 layer1_