一個單層的基礎神經網路實現手寫字識別
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:卷積神經網路的實現 一個卷積神經網路的結構一般是由輸入-->卷積-->池化-->卷積-->池化-->............-->全連線-->全連
【深度學習】python實現簡單神經網路以及手寫數字識別案例
前言 \quad \qu
神經網路實現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_