python手寫神經網路實現識別手寫數字
實驗說明
一直想自己寫一個神經網路來實現手寫數字的識別,而不是套用別人的框架。恰巧前幾天,有幸從同學那拿到5000張已經貼好標籤的手寫數字圖片,於是我就嘗試用matlab寫一個網路。
實驗資料:5000張手寫數字圖片(.jpg),圖片命名為1.jpg,2.jpg…5000.jpg。還有一個放著標籤的excel檔案。
資料處理:前4000張作為訓練樣本,後1000張作為測試樣本。
圖片處理:用matlab的imread()函式讀取圖片的灰度值矩陣(28,28),然後把每張圖片的灰度值矩陣reshape為(28*28,1),然後把前4000張圖片的灰度值矩陣合併為x_train,把後1000張圖片的灰度值矩陣合併為x_test。
神經網路設計
網路層設計:一層隱藏層,一層輸出層
輸入層:一張圖片的灰度值矩陣reshape後的784個數,也就是x_train中的某一列
輸出層:(10,1)的列向量,其中列向量中最大的數所在的索引+1就是預測的數字
激勵函式:sigmoid函式(公式)
更新法則:後向傳播演算法(參考)
測試:統計預測正確的個數
網路實現
- 函式說明:讀圖片的函式(read_photo() )、讀excel的函式(read_excel(path) )、修正函式(layerout(w,b,x) )、訓練函式(mytrain(x_train,y_train) )、測試函式(mytest(x_test,y_test,w,b,w_h,b_h) )、主函式(main() )
具體程式碼如下:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
import numpy as np
import xlrd
#讀取圖片的灰度值矩陣
def read_photo():
for i in range(5000):
j = i+1
j = str(j)
st = '.jpg'
j = j+st
im1 = array(Image.open(j))
#(28,28)-->(28*28,1)
im1 = im1.reshape((784,1))
#把所有的圖片灰度值放到一個矩陣中
#一列代表一張圖片的資訊
if i == 0:
im = im1
else:
im = np.hstack((im,im1))
return im
#讀取excel檔案內容(path為檔案路徑)
def read_excel(path):
# 獲取所有sheet
workbook = xlrd.open_workbook(path)
sheet_names = workbook.sheet_names()
# 根據sheet索引或者名稱獲取sheet內容
for sheet_name in sheet_names:
isheet = workbook.sheet_by_name(sheet_name)
#獲取該sheet的列數
ncols = isheet.ncols
#獲取每一列的內容
for i in range(ncols):
if i == 0:
xl1 = isheet.col_values(i)
xl1 = np.array(xl1)
xl1 = xl1.reshape((10,1))
xl = xl1
else:
xl1 = isheet.col_values(i)
xl1 = np.array(xl1)
xl1 = xl1.reshape((10,1))
xl = np.hstack((xl,xl1))
return xl
#layerout函式
def layerout(w,b,x):
y = np.dot(w,x) + b
t = -1.0*y
# n = len(y)
# for i in range(n):
# y[i]=1.0/(1+exp(-y[i]))
y = 1.0/(1+exp(t))
return y
#訓練函式
def mytrain(x_train,y_train):
'''
設定一個隱藏層,784-->隱藏層神經元個數-->10
'''
step=int(input('mytrain迭代步數:'))
a=double(input('學習因子:'))
inn = 784 #輸入神經元個數
hid = int(input('隱藏層神經元個數:'))#隱藏層神經元個數
out = 10 #輸出層神經元個數
w = np.random.randn(out,hid)
w = np.mat(w)
b = np.mat(np.random.randn(out,1))
w_h = np.random.randn(hid,inn)
w_h = np.mat(w_h)
b_h = np.mat(np.random.randn(hid,1))
for i in range(step):
#打亂訓練樣本
r=np.random.permutation(4000)
x_train = x_train[:,r]
y_train = y_train[:,r]
#mini_batch
for j in range(400):
#取batch為10 更新取10次的平均值
x = np.mat(x_train[:,j])
x = x.reshape((784,1))
y = np.mat(y_train[:,j])
y = y.reshape((10,1))
hid_put = layerout(w_h,b_h,x)
out_put = layerout(w,b,hid_put)
#更新公式的實現
o_update = np.multiply(np.multiply((y-out_put),out_put),(1-out_put))
h_update = np.multiply(np.multiply(np.dot((w.T),np.mat(o_update)),hid_put),(1-hid_put))
outw_update = a*np.dot(o_update,(hid_put.T))
outb_update = a*o_update
hidw_update = a*np.dot(h_update,(x.T))
hidb_update = a*h_update
w = w + outw_update
b = b+ outb_update
w_h = w_h +hidw_update
b_h =b_h +hidb_update
return w,b,w_h,b_h
#test函式
def mytest(x_test,y_test,w,b,w_h,b_h):
'''
統計1000個測試樣本中有多少個預測正確了
預測結果表示:10*1的列向量中最大的那個數的索引+1就是預測結果了
'''
sum = 0
for k in range(1000):
x = np.mat(x_test[:,k])
x = x.reshape((784,1))
y = np.mat(y_test[:,k])
y = y.reshape((10,1))
yn = np.where(y ==(np.max(y)))
# print(yn)
# print(y)
hid = layerout(w_h,b_h,x);
pre = layerout(w,b,hid);
#print(pre)
pre = np.mat(pre)
pre = pre.reshape((10,1))
pren = np.where(pre ==(np.max(pre)))
# print(pren)
# print(pre)
if yn == pren:
sum += 1
print('1000個樣本,正確的有:',sum)
def main():
#獲取圖片資訊
im = read_photo()
immin = im.min()
immax = im.max()
im = (im-immin)/(immax-immin)
#前4000張圖片作為訓練樣本
x_train = im[:,0:4000]
#後1000張圖片作為測試樣本
x_test = im[:,4000:5000]
#獲取label資訊
xl = read_excel('./label.xlsx')
y_train = xl[:,0:4000]
y_test = xl[:,4000:5000]
print("---------------------------------------------------------------")
w,b,w_h,b_h = mytrain(x_train,y_train)
mytest(x_test,y_test,w,b,w_h,b_h)
print("---------------------------------------------------------------")
if __name__ == '__main__':
main()
實驗結果
---------------------------------------------------------------
mytrain迭代步數:300
學習因子:0.3
隱藏層神經元個數:28
1000個樣本,正確的有: 933
---------------------------------------------------------------
迭代300步,正確率就有93.3%啦,還不錯的正確率~
相關推薦
python手寫神經網路實現識別手寫數字
實驗說明 一直想自己寫一個神經網路來實現手寫數字的識別,而不是套用別人的框架。恰巧前幾天,有幸從同學那拿到5000張已經貼好標籤的手寫數字圖片,於是我就嘗試用matlab寫一個網路。 實驗資料:5000張手寫數字圖片(.jpg),圖片命名為
matlab手寫神經網路實現識別手寫數字
實驗說明 一直想自己寫一個神經網路來實現手寫數字的識別,而不是套用別人的框架。恰巧前幾天,有幸從同學那拿到5000張已經貼好標籤的手寫數字圖片,於是我就嘗試用matlab寫一個網路。 實驗資料:5000張手寫數字圖片(.jpg),圖片命名為1.jpg,2.
全連線神經網路實現識別手寫資料集MNIST
全連線神經網路實現識別手寫資料集MNIST MNIST是一個由美國由美國郵政系統開發的手寫數字識別資料集。手寫內容是0~9,一共有60000個圖片樣本,我們可以到MNIST官網免費下載。總共4個檔案,該檔案是二進位制內容。 train-images-idx3-ubyte.gz: trainin
神經網路實現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 # 定義
Tensorflow卷積神經網路實現MNIST手寫資料集識別
模型建的不好,最終只有85%左右的準確率,後面繼續改進吧 #卷積神經網路API 卷積層:tf.nn.conv2d(input, #輸入張量,具有[batch, height, width, chann
PyTorch基礎入門六:PyTorch搭建卷積神經網路實現MNIST手寫數字識別
1)卷積神經網路(CNN)簡介 關於什麼是卷積神經網路(CNN),請自行查閱資料進行學習。如果是初學者,這裡推薦一下臺灣的李巨集毅的深度學習課程。連結就不給了,這些資料網站上隨處可見。 值得一提的是,CNN雖然在影象處理的領域具有不可阻擋的勢頭,但是它絕對不僅僅只能用來影
全連線神經網路實現MNIST手寫資料集識別
有目錄,內容大部分從官方教程copy,黑體加粗為對官方教程的補充 TensorFlow,pytorch,cuda,cudnn,anaconda安裝 版本對應關係 Version Python version Compiler Build tools cu
深度學習入門——利用卷積神經網路實現MNIST手寫數字識別
MNIST(Modified National Institute of Standards and Technology)資料庫是一個大型手寫數字資料庫,通常用於訓練各種影象處理系統。該資料庫還廣泛用於機器學習領域的培訓和測試。它是通過重新打亂來自NIST原始資料集的樣本而
如何用卷積神經網路CNN識別手寫數字集BaseLine版本 超級小白註釋
如何用卷積神經網路CNN識別手寫數字集? 由於剛剛開始學習機器學習方面的知識,網上很多基礎的教程真的看不懂,所以只能自己一點點摸索,一篇很簡單的程式碼,可能我也要看很久QAQ,原博主的程式碼對於我來說可能還是很懵逼,因此自己加了很多註釋,希望可以幫到和我一樣的
KEARS 神經網路 學習 識別手寫文字
2018年11月13日 10:57:15 mailjmq 閱讀數:5 標籤: KEARS 識別手寫
第一章 用神經網路來識別手寫數字(1)
寫在章節前面的 翻譯文章來源 人類的識別系統是世界上的一大奇蹟,看下面的一串手寫數字 大部分人都能準確地認出這些數字是504192,這是很容易的。在大腦的每個半球,人類都有一個被稱為V1的視覺皮層,其中包含了超過140,000,000個
用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圖片下載了一些
python-積卷神經網路全面理解-tensorflow實現手寫數字識別
首先,關於神經網路,其實是一個結合很多知識點的一個演算法,關於cnn(積卷神經網路)大家需要了解: 下面給出我之前總結的這兩個知識點(基於吳恩達的機器學習) 代價函式: 代價函式 代價函式(Cost Function )是
[純C#實現]基於BP神經網路的中文手寫識別演算法
效果展示 這不是OCR,有些人可能會覺得這東西會和OCR一樣,直接進行整個字的識別就行,然而並不是. OCR是2維畫素矩陣的畫素資料.而手寫識別不一樣,手寫可以把使用者寫字的筆畫時間順序,抽象成一個維度.這樣識別的就是3維的資料了.識別起來簡單很多. 最近需要做一箇中文手寫識別演算法.搜尋了網上的
python線上神經網路實現手寫字元識別系統
神經網路實現手寫字元識別系統一、課程介紹1. 課程來源課程內容在原文件基礎上做了稍許修改,增加了部分原理介紹,步驟的拆解分析及原始碼註釋。2. 內容簡介本課程最終將基於BP神經網路實現一個手寫字元識別系統,系統會在伺服器啟動時自動讀入訓練好的神經網路檔案,如果檔案不存在,則讀入
python神經網路程式設計(手寫識別字型)
從《python神經網路程式設計》一書中提取的識別手寫字型的神經網路程式碼 訓練集:http://www.pjreddie.com/media/files/mnist_train.csv 測試集:http://www.pjreddie.com/media/files/mnist_test.csv
邏輯迴歸softmax神經網路實現手寫數字識別(cs)
邏輯迴歸softmax神經網路實現手寫數字識別全過程 1 - 匯入模組 import numpy as np import matplotlib.pyplot as plt from ld_mnist import load_digits
lesson22-24 MNIST資料集,模組化搭建神經網路八股,手寫數字識別準確率輸出
import tensorflow as tf #MNIST資料集輸出識別準確率 #MNIST資料集: #提供6w張28*28畫素點的0-9手寫數字圖片和標籤,用於訓練 #提供1w張28*28畫素點的0-9手寫數字圖片和標籤,用於測試 #每張圖片的784個畫素點(