各位大佬,我想問一下神經網路中闕值和偏置有什么區別,該如何設定。下面是我參照別人的代碼()寫的一個程式,我的問題主要是如果把代碼中第31、36行的+b1、+b2換成減的,能否把b1和b2理解成闕值。但是我換成減的之后來運行,均方誤差不是收斂的,而是時大時小。而且我把b1、b2的資料換成標準狀態分布的也是如此,按理說標準正態分布的資料有正有負,對其進行加或減的效果應該是一樣的。所以就很奇怪,還望大佬能指點一下,非常感謝!
ps:第一次發帖,有什么不足之處還請見諒
import numpy as np
#真正的y
y=np.array([[0,0,0,1]],dtype=np.float64)
def sigmoid(x):
return 1/(1+np.exp(-(x)))
x=np.array([[0,0],
[0,1],
[1,0],
[1,1]],dtype=np.float64)
w1=np.random.rand(2,4)#第一層四個神經元,三個特征
b1=np.random.rand(1,4)
print('w1:\n',w1)
w2=np.random.rand(4,4)#輸出層有兩個神經元,上一層每個神經元生成一個特征,共四個特征
b2=np.random.rand(1,4)
lr=0.1#學習率
for n in range(1000):
for index,i in enumerate(x):
i = i.reshape(1,2)
#print(i)
#對x中的每一個樣本進行正`向傳播
#中間層的輸入
a1=np.dot(i,w1)#[1,4]
#隱藏層的輸出
y1=sigmoid(a1+b1)#[1,4]
#輸出層的輸入
a2=np.dot(y1,w2)#[1,2]
#輸出層的輸出
y2=sigmoid(a2+b2)#[1,2]
#反向傳播
g=np.multiply((y-y2),np.multiply(y2,(1-y2)))
#更新輸出層的權值w和偏置值b
w2=w2+lr*np.dot(y1.T,g)
b2=b2+lr*g
#print("第"+str(index+1)+"個樣本")
#print("更新后的輸出層權重w2",w2)
#print("更新后的輸出層b2",b2)
#print("下面開始更新中間層權重w1和偏置值b1")
w1=w1+lr*i.reshape(2,1)*np.multiply(np.multiply(y1,(1-y1)),np.dot(w2,g.T).T)
b1=b1+lr*np.multiply(np.multiply(y1,(1-y1)),np.dot(w2,g.T).T)
#print("更新后的輸出層權重w1", w1)
#print("更新后的輸出層b1", b1)
error = 0.5*np.sum((y2-y)**2)
if (np.mod(n,100)==0):
print('error:\n',error)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/16517.html
標籤:人工智能技術
