[英]Self-built Neural Network
我一直在嘗試自己構建一個簡單的神經網絡(3 層)來預測 MNIST 數據集。 我在網上參考了一些代碼,自己寫了一些代碼,代碼運行沒有任何錯誤,但是學習過程有問題。 訓練有素的網絡總是給我錯誤的預測,無論我作為輸入傳遞什么,一兩個類總是有很高的概率。 我試圖找出問題所在,但幾天內沒有任何進展。 誰能給我一些提示我做錯了什么?
import numpy as np
from PIL import Image
import os
np.set_printoptions(formatter={'float_kind':'{:f}'.format})
def init_setup():
#three layers perception
w1=np.random.randn(10,784)-0.8
b1=np.random.rand(10,1)-0.8
#second layer
w2=np.random.randn(10,10)-0.8
b2=np.random.randn(10,1)-0.8
#third layer
w3=np.random.randn(10,10)-0.8
b3=np.random.randn(10,1)-0.8
return w1,b1,w2,b2,w3,b3
def activate(A):
# use ReLU function as the activation function
Z=np.maximum(0,A)
return Z
def softmax(Z):
return np.exp(Z)/np.sum(np.exp(Z))
def forward_propagation(A,w1,b1,w2,b2,w3,b3):
# input A :(784,1)-> A1: (10,1) ->A2: (10,1) -> prob: (10,1)
z1=w1@A+b1
A1=activate(z1)
z2=w2@A1+b2
A2=activate(z2)
z3=w3@A2+b3
prob=softmax(z3)
return z1,A1,z2,A2,z3,prob
def one_hot(Y:np.ndarray)->np.ndarray:
one_hot=np.zeros((10, 1)).astype(int)
one_hot[Y]=1
return one_hot
def back_propagation(A,z1,A1:np.ndarray,z2,A2:np.ndarray,z3,prob,w1,w2:np.ndarray,w3,Y:np.ndarray,lr:float):
m=1/Y.size
dz3=prob-Y
dw3=m*dz3@A2.T
db3= dz3
dz2=ReLU_deriv(z2)*w3.T@dz3
dw2 = dz2@A1.T
db2 = dz2
dz1=ReLU_deriv(z1)*w2.T@dz2
dw1 = dz1@A.T
db1 = dz1
return db1,dw1,dw2,db2,dw3,db3
def ReLU_deriv(Z):
Z[Z>0]=1
Z[Z<=0]=0
return Z
def step(lr,w1,b1,w2,b2,w3,b3,dw1,db1,dw2,db2,dw3,db3):
w1 = w1 - lr * dw1
b1 = b1 - lr * db1
w2 = w2 - lr * dw2
b2 = b2 - lr * db2
w3 = w3 - lr * dw3
b3 = b3 - lr * db3
return w1,b1,w2,b2,w3,b3
把功能放在一起
def learn():
lr=0.5
dir=r'C:\Users\Desktop\MNIST - JPG - training\{}'
w1,b1,w2,b2,w3,b3=init_setup()
for e in range(10):
if e%3 == 0:
lr=lr/10
for num in range(10):
Y=one_hot(num)
# print(Y)
path=dir.format(str(num))
for i in os.listdir(path):
img=Image.open(path+'\\'+i)
A=np.asarray(img)
A=A.reshape(-1,1)
z1,A1,z2,A2,z3,prob=forward_propagation(A,w1,b1,w2,b2,w3,b3)
# print('loss='+str(np.sum(np.abs(Y-prob))))
db1,dw1,dw2,db2,dw3,db3=back_propagation(A,z1,A1,z2,A2,z3,prob,w1,w2,w3,Y,lr)
w1,b1,w2,b2,w3,b3=step(lr,w1,b1,w2,b2,w3,b3,dw1,db1,dw2,db2,dw3,db3)
return w1,b1,w2,b2,w3,b3
optimize_params=learn()
w1,b1,w2,b2,w3,b3=optimize_params
img=Image.open(r'C:\Users\Desktop\MNIST - JPG - training\2\5.jpg')
A=np.asarray(img)
A=A.reshape(-1,1)
z1,A1,z2,A2,z3,prob=forward_propagation(A,w1,b1,w2,b2,w3,b3)
print(prob)
print(np.argmax(prob))
運行學習 function 后,網絡給了我這樣的東西
>>>[[0.040939]
[0.048695]
[0.048555]
[0.054962]
[0.060614]
[0.066957]
[0.086470]
[0.117370]
[0.163163]
[0.312274]]
>>>9
結果顯然是錯誤的,真正的label應該真的是2,但是我們在prob上看到,class 2的值極低,所以我相信在學習過程中一定有問題。 但是我完全不知道,有人可以給我一些提示嗎?
您當前的代碼僅在標簽 0 和 1 上訓練
for num in range(2):
因此,您的 model 無法“了解”任何其他標簽。
現在您的 model 以非常有序的方式進行訓練,因此對最后的課程有偏見。 因為這些是它在訓練期間看到的最后一個。 您應該在每個 epoch 中打亂您的訓練數據,而不是按類別提供網絡
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.