書-Deep Learning 用Python 進行深度學習的基礎理論實作
∮手寫辨識
∮手寫辨識-MNIST資料集
∮神經網路的推論處理
∮神經網路的訓練
∮用turtle畫出神經元連接
手寫辨識
接下來要來看'手寫辨識了',深度學習方面的書第一個範例都是手寫辨識,就像寫程式第一個程式是hello world一樣。
上一篇有講到深度學習的'學習'、'推論',推論的方式有很多,但是這裡要用的是正向傳播(forward propagation)
手寫辨識-MNIST資料集
這個是很有名的資料集。
內容: 0~9數字圖片
張數:70000(6萬訓練、1萬測試)
圖片大小:28*28
圖片顏色:黑白
像素點:0~255
資料集位置:https://github.com/oreilly-japan/deep-learning-from-scratch
底下有一個目錄叫做dataset/ mnist.py複製下來,創一個目錄放你的主程式跟mnist.py。
我把它改成dataset_mnist.py。
程式的部分,第3行的就是你的資料集'名稱',如果你沒有改就是from mnist import load_mnist,這行的意思是到'dataset_mnist'用這個'load_mnist'方法。
執行後就會開始下載資料了,待會來看這個資料長什麼樣,裡面有一個副檔名為pkl的檔案,它的作用是可以讓你快速的載入資料。
第4行是(訓練圖片,訓練答案),(測試圖片,測試答案)。
flatten:是否把1*28*28(三維陣列)攤平為一維陣列
normalize:是否把值變成0.0~1.0之間
第6行顯示這個陣列的大小,(60000,784)就是有6萬張圖片,每張圖片有784個像素點(28*28)。
第7行是圖片的正確答案。
第14行的用意是因為一開始載入資料時把它攤平成1維陣列,所以需要把它變回3維陣列,所以用到np.reshape。
第17行因為是陣列所以需要做轉換才可以顯示。
神經網路的推論處理
這裡要開始把前面有用過的東西都加進來了。
先去下載:https://github.com/oreilly-japan/deep-learning-from-scratch
ch03/sample_weight.pkl //這個東西是幫妳設好的權重值
common/functions//函數(幫妳寫好了)
第11行就是把剛剛的東西放在一個方法。
第15行讀取裡面的資料,方便後面讀取。
第21行就是輸入到輸出,詳細的過程可以到上一篇去看。
神經網路的訓練
上面的步驟都完成,然後編譯後沒有錯誤就可以開始真正的訓練了。
第39就 迭代圖片
第40行 然後經過predict一連串的洗禮
第41行 取的洗禮後的最大值
第42行 如果洗禮後的最大值的數字等於正確答案。
第43行正確率+1。
第44行算出正確跟錯誤的比例,就是辨識正確除以總數,算出正確率。
print會拖慢速度,也可以把print放在for後面直接看正確率。
一連串的過程從資料的取得、整理成可以訓練的模式後,在建構隱藏層去取得最大值之後,在算出正確率,因為有現成權重,所以很輕鬆,但是神經網路難就難在權重的調配,隱藏層的層數,函數的選擇。
如何知道層數?看參數的量就可以知道了。
顏色越深代表數值越高。
我用圖表的方式簡單的表達了這一篇所做的事情。
用turtle畫出神經元連接
下面這一張圖是我用python的turtle畫的,就跟上面那一張圖一樣,只不過我把它縮小10倍,因為空間真的不夠,由上到下分別是78-5-10-1的神經元,看了這一張圖就知道計算量很驚人,我把程式碼放在下面有興趣的可以玩玩看。
# coding=utf-8
import turtle
import time
turtle.screensize(800,400)
turtle.speed(0)
x = -500
init1 = [79, 6, 11, 2] #神經元數
init2 = [6, 11, 2, 0] #線
x = [-500, -350, -500, 100] #x軸初始位址
x_add = [15, 150, 100, 0] #神經元間距
x1 = [-350, -500, 100, 0] #下一個神經元位置
x1_add = [150, 100, 0, 0] #下一個圈的x軸
y = [300 ,0 ,-100, -200] #y軸初始位址
y1 = [10, -90, -190, 0] #下一個圈的y軸
arr1 = 0
arr2 = 0
for i in range(0,4,1):
arr1=x[i]
for j in range(0,init1[i],1):
turtle.penup() #拿起筆
turtle.goto(arr1, y[i]) #到指定位置
turtle.pendown() #筆放下
turtle.circle(5) #畫圈
arr2 = x1[i]
for k in range(0, init2[i], 1):
turtle.pendown() #畫圈後,畫線
turtle.goto(arr2, y1[i]) #到第二個圈位置
turtle.penup() #拿起筆
turtle.goto(arr1,y[i]) #回到圈圈在畫線
arr2+= x1_add[i] #畫線
arr1+=x_add[i] #下一個圈
turtle.end_fill()
turtle.mainloop()
留言列表