BP(Back Propagation)算法是一種神經網絡訓練的算法,其基本思想是通過不斷地調整網絡的權重和閾值,最大限度地降低網絡的輸出誤差,從而使得網絡能夠逼近預期的輸出結果。在神經網絡中,BP算法可以用來求解最小誤差問題。在實際操作中,BP算法的應用非常廣泛。它可以用來解決各種分類和回歸問題,包括圖像識別,語音識別和自然語言處理等領域。
import numpy as np # sigmoid函數的實現 def sigmoid(x): return 1 / (1 + np.exp(-x)) # sigmoid函數的導數 def sigmoid_prime(x): return sigmoid(x) * (1 - sigmoid(x)) # 初始化神經網絡的權重和偏置 def init_network(input_nodes, hidden_nodes, output_nodes): network = {} network['w1'] = np.random.normal(0.0, pow(hidden_nodes, -0.5), (hidden_nodes, input_nodes)) network['w2'] = np.random.normal(0.0, pow(output_nodes, -0.5), (output_nodes, hidden_nodes)) network['b1'] = np.zeros((hidden_nodes, 1)) network['b2'] = np.zeros((output_nodes, 1)) return network # 前向傳播函數 def forward_prop(network, inputs): hidden_inputs = np.dot(network['w1'], inputs) + network['b1'] hidden_outputs = sigmoid(hidden_inputs) final_inputs = np.dot(network['w2'], hidden_outputs) + network['b2'] final_outputs = sigmoid(final_inputs) return hidden_inputs, hidden_outputs, final_inputs, final_outputs # 反向傳播函數 def back_prop(network, inputs, targets, hidden_inputs, hidden_outputs, final_inputs, final_outputs): error = targets - final_outputs delta_output = error * sigmoid_prime(final_inputs) delta_hidden = np.dot(network['w2'].T, delta_output) * sigmoid_prime(hidden_inputs) network['w2'] += np.dot(delta_output, hidden_outputs.T) network['w1'] += np.dot(delta_hidden, inputs.T) network['b2'] += delta_output network['b1'] += delta_hidden # 訓練神經網絡 def train_network(network, inputs, targets, epochs, learn_rate): for i in range(epochs): for j in range(len(inputs)): hidden_inputs, hidden_outputs, final_inputs, final_outputs = forward_prop(network, inputs[j]) back_prop(network, inputs[j], targets[j], hidden_inputs, hidden_outputs, final_inputs, final_outputs) return network
在使用BP算法訓練神經網絡時,可以通過調整訓練次數和學習率來調節算法的性能。訓練次數越多,網絡的精度會越高,但同時計算量也會越大。學習率越大,算法在訓練初期的收斂速度會越快,但在后期可能會出現震蕩或者無法收斂的情況。