BP神經(jīng)網(wǎng)絡(luò)(BPNN)基本由以下組件組成:
- 輸入層
- 隱藏層
- 輸出層
- 各層之間的權(quán)重
- 每個(gè)隱藏層的激活函數(shù)(此中將用Sigmoid激活函數(shù))
代碼思路
一、創(chuàng)建一個(gè)NeuralNetwork類
我們將在Python中創(chuàng)建一個(gè)NeuralNetwork類,以訓(xùn)練神經(jīng)元以給出準(zhǔn)確的預(yù)測。該課程還將具有其他幫助程序功能。
1.應(yīng)用Sigmoid函數(shù)
我們將使用Sigmoid函數(shù)(它繪制一條“ S”形曲線)作為神經(jīng)網(wǎng)絡(luò)的激活函數(shù)。

sigmoid
此函數(shù)可以將任何值映射到0到1之間的值。它將幫助我們歸一化輸入的加權(quán)和。
- 創(chuàng)建Sigmoid函數(shù)的導(dǎo)數(shù),以幫助計(jì)算權(quán)重的基本調(diào)整。
- Sigmoid函數(shù)的輸出可用于生成其導(dǎo)數(shù)。例如,如果輸出變量為“ x”,則其導(dǎo)數(shù)將為x (1-x)。
2.訓(xùn)練模型
這是我們將教神經(jīng)網(wǎng)絡(luò)做出準(zhǔn)確預(yù)測的階段。每個(gè)輸入將具有權(quán)重(正或負(fù))。
這意味著具有大量正權(quán)重或大量負(fù)權(quán)重的輸入將對(duì)結(jié)果輸出產(chǎn)生更大的影響。
我們最初是將每個(gè)權(quán)重分配給一個(gè)隨機(jī)數(shù)。
- 這是我們?cè)诖松窠?jīng)網(wǎng)絡(luò)示例問題中使用的訓(xùn)練過程的過程:
- 我們從訓(xùn)練數(shù)據(jù)集中獲取輸入,根據(jù)它們的權(quán)重進(jìn)行一些調(diào)整,然后通過一種計(jì)算ANN輸出的方法虹吸它們。
- 我們計(jì)算了反向傳播的錯(cuò)誤率。在這種情況下,它是神經(jīng)元的預(yù)測輸出與訓(xùn)練數(shù)據(jù)集的預(yù)期輸出之間的差異。
- 根據(jù)得到的誤差的程度,我們使用誤差加權(quán)導(dǎo)數(shù)公式進(jìn)行了一些較小的權(quán)重調(diào)整。
- 我們對(duì)該過程進(jìn)行了15,000次任意迭代。在每次迭代中,將同時(shí)處理整個(gè)訓(xùn)練集。
二、主函數(shù)
- 初始化類
- 載入訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練
- 測試
代碼:
'''
author:小靳哥哥
project:三層神BP經(jīng)網(wǎng)絡(luò)模型
'''
# 導(dǎo)入numpy并命名為np
import numpy as np
'''
# 構(gòu)造神經(jīng)網(wǎng)絡(luò)
'''
class NeuralNetwork():
def __init__(self):
# 隨機(jī)數(shù)生成的種子隨機(jī)數(shù)生成的種子
np.random.seed(1)
# 將權(quán)重轉(zhuǎn)換為值為-1到1且平均值為0的3乘1矩陣
self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
# 定義signoid函數(shù)的導(dǎo)數(shù)
def sigmoid(self, x):
return 1 / (1 + np.exp(-x))
# 計(jì)算sigmoid函數(shù)的導(dǎo)數(shù)
def sigmoid_derivative(self, x):
return x * (1 - x)
# 訓(xùn)練
def train(self, train_inputs, train_ou[圖片上傳中...(image-4f98b0-1589629804569)]
tputs, train_iterations): # 輸入 輸出 迭代次數(shù)
# 訓(xùn)練模型在不斷調(diào)整權(quán)重的同時(shí)做出準(zhǔn)確預(yù)測
for iteration in range(train_iterations):
# 通過神經(jīng)元提取訓(xùn)練數(shù)據(jù)
output = self.think(train_inputs)
# 反向傳播錯(cuò)誤率
error = train_outputs - output
# 進(jìn)行權(quán)重調(diào)整
adjustments = np.dot(train_inputs.T, error * self.sigmoid_derivative(output))
self.synaptic_weights += adjustments
# 輸出
def think(self, inputs):
inputs = inputs.astype(float)
output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
return output
# 初始化類
neural_network = NeuralNetwork()
print("開始隨機(jī)生成權(quán)重: ")
print(neural_network.synaptic_weights)
# 載入訓(xùn)練數(shù)據(jù)(3個(gè)輸入值,一個(gè)輸出值)
train_inputs = np.array([[0, 0, 1],[1, 1, 1],[1, 0, 1],[0, 1, 1]])
train_outputs = np.array([[0, 1, 1, 0]]).T
neural_network.train(train_inputs, train_outputs, 150000)
print("最終所得權(quán)重: ")
print(neural_network.synaptic_weights)
'''
測試
'''
print('開始測試')
input_1 = str(input("輸入第一個(gè)值: "))
input_2 = str(input("輸入第一個(gè)值: "))
input_3 = str(input("輸入第一個(gè)值: "))
print("輸入值: [", input_1, input_2, input_3, ']')
print("輸出結(jié)果: ")
print(neural_network.think(np.array([input_1, input_2, input_3])))
本文參考翻譯于此網(wǎng)站 —— 原文