close

書-Deep Learning 用Python 進行深度學習的基礎理論實作

image

∮手寫辨識

∮手寫辨識-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。

image

程式的部分,第3行的就是你的資料集'名稱',如果你沒有改就是from mnist import load_mnist,這行的意思是到'dataset_mnist'用這個'load_mnist'方法。

image

執行後就會開始下載資料了,待會來看這個資料長什麼樣,裡面有一個副檔名為pkl的檔案,它的作用是可以讓你快速的載入資料。

image

 

image

image

第4行是(訓練圖片,訓練答案),(測試圖片,測試答案)。

flatten:是否把1*28*28(三維陣列)攤平為一維陣列

normalize:是否把值變成0.0~1.0之間

第6行顯示這個陣列的大小,(60000,784)就是有6萬張圖片,每張圖片有784個像素點(28*28)。

第7行是圖片的正確答案。

image

第14行的用意是因為一開始載入資料時把它攤平成1維陣列,所以需要把它變回3維陣列,所以用到np.reshape。

第17行因為是陣列所以需要做轉換才可以顯示。

image

神經網路的推論處理

這裡要開始把前面有用過的東西都加進來了。

先去下載:https://github.com/oreilly-japan/deep-learning-from-scratch

ch03/sample_weight.pkl    //這個東西是幫妳設好的權重值

common/functions//函數(幫妳寫好了)

image

第11行就是把剛剛的東西放在一個方法。

第15行讀取裡面的資料,方便後面讀取。

第21行就是輸入到輸出,詳細的過程可以到上一篇去看。

神經網路的訓練

上面的步驟都完成,然後編譯後沒有錯誤就可以開始真正的訓練了。

image

第39就 迭代圖片

第40行 然後經過predict一連串的洗禮

第41行 取的洗禮後的最大值

第42行 如果洗禮後的最大值的數字等於正確答案。

第43行正確率+1。

第44行算出正確跟錯誤的比例,就是辨識正確除以總數,算出正確率。

print會拖慢速度,也可以把print放在for後面直接看正確率。

image

一連串的過程從資料的取得、整理成可以訓練的模式後,在建構隱藏層去取得最大值之後,在算出正確率,因為有現成權重,所以很輕鬆,但是神經網路難就難在權重的調配,隱藏層的層數,函數的選擇。

如何知道層數?看參數的量就可以知道了。

image

image

image

顏色越深代表數值越高。

image

我用圖表的方式簡單的表達了這一篇所做的事情。

image

用turtle畫出神經元連接

下面這一張圖是我用python的turtle畫的,就跟上面那一張圖一樣,只不過我把它縮小10倍,因為空間真的不夠,由上到下分別是78-5-10-1的神經元,看了這一張圖就知道計算量很驚人,我把程式碼放在下面有興趣的可以玩玩看。

image

 

# 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() 

arrow
arrow
    創作者介紹
    創作者 讀書小天地 的頭像
    讀書小天地

    書籍分享天地

    讀書小天地 發表在 痞客邦 留言(0) 人氣()