[英]How to determine the size of bias matrices in a neural network?
我是機器學習領域的新手。 我的問題是如何確定神經網絡中的偏差大小(使用反向傳播算法)? 目前,我有一個2層神經網絡(1個隱藏層和1個輸出層)。 這是代碼:
import numpy as np
from matplotlib import pyplot as plt
sigmoid = lambda x : 1 / (1 + np.exp(-x))
dsigmoid = lambda y: y * (1 - sigmoid(y))
# This function performs the given function (func) to the whole numpy array
def mapFunc(array, func) :
newArray = array.copy()
for element in np.nditer(newArray, op_flags=['readwrite']) :
element[...] = func(element)
return newArray
class NeuralNetwork :
def __init__(self, input_nodes, hidden_nodes, output_nodes) :
self.input_nodes = input_nodes
self.hidden_nodes = hidden_nodes
self.output_nodes = output_nodes
self.W_ih = np.random.rand(hidden_nodes, input_nodes)
self.W_ho = np.random.rand(output_nodes, hidden_nodes)
self.B_ih = np.random.rand(hidden_nodes, 1)
self.B_ho = np.random.rand(output_nodes, 1)
self.learningRate = 0.1
def predict(self, inputs) :
# Calculate hidden's output
H_output = np.dot(self.W_ih, inputs)
H_output += self.B_ih
H_output = mapFunc(H_output, sigmoid) # Activation
# Calculate output's output
O_output = np.dot(self.W_ho, H_output)
O_output += self.B_ho
O_output = mapFunc(O_output, sigmoid) # Activation
return O_output
def train(self, inputs, target) :
# Calculate hidden's output
H_output = np.dot(self.W_ih, inputs)
H_output += self.B_ih
H_output = mapFunc(H_output, sigmoid) # Activation
# Calculate output's output
O_output = np.dot(self.W_ho, H_output)
O_output += self.B_ho
O_output = mapFunc(O_output, sigmoid) # Activation
# Calculate output error :
O_error = O_output - target
# Calculate output delta
O_gradient = mapFunc(O_output, dsigmoid)
O_gradient = np.dot(O_gradient, np.transpose(O_error)) * self.learningRate
W_ho_delta = np.dot(O_gradient, np.transpose(H_output))
self.W_ho -= W_ho_delta
self.B_ho -= O_gradient
# Calculate hidden error :
W_ho_t = np.transpose(self.W_ho)
H_error = np.dot(W_ho_t, O_error)
# Calculate hidden delta :
H_gradient = mapFunc(H_output, dsigmoid)
H_gradient = np.dot(H_gradient, np.transpose(H_error)) * self.learningRate
W_ih_delta = np.dot(H_gradient, inputs)
self.W_ih -= W_ih_delta
self.B_ih += H_gradient
return O_output
n = NeuralNetwork(2, 2, 1)
inputs = np.matrix([[1], [0], [1], [1], [0], [1], [0], [0]])
input_list = []
input_list.append([[1], [0]])
input_list.append([[0], [1]])
input_list.append([[1], [1]])
input_list.append([[0], [0]])
target = np.matrix([[0], [0], [1], [1]])
outputs = []
for i in range(50000) :
ind = np.random.randint(len(input_list))
inp = input_list[ind]
out = n.train(inp, target[ind]).tolist()
outputs.append(out[0][0])
print outputs
plt.plot(outputs)
plt.show()
newInput = [[1], [1]]
print (n.predict(newInput))
在訓練函數中,線self.B_ih += H_gradient
向我拋出有關其大小不相等的錯誤。 我什至嘗試只將偏差設置為一個數字,但這無濟於事,因為它被H_gradient
更改為矩陣。 那么,偏差本身有什么問題嗎?還是我其他步驟做錯了?
偏見的形狀是正確的。 最終從偏差中減去的漸變形狀應為(2,1)而不是(2,2)-這是您遇到的問題(H_gradient的形狀不應為(2,2))。
也,
#Calculate output error : O_error = O_output - target
在這里,您應該使用均方誤差(如果分類會產生交叉熵損失),而不僅僅是差異。
最后,關於權重和偏差分別計算梯度。 因此,dL / dW分別計算並從權重中減去,dL / db分別計算並從偏差中減去(其中L是損耗)。 兩者都使用相同的漸變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.