創(chuàng)建一個NeuralNetwork類
我們將用Python創(chuàng)建一個NeuralNetwork類來訓(xùn)練神經(jīng)元窟蓝,以期給出準(zhǔn)確的預(yù)測。這個類還會有其他的幫助函數(shù)饱普。
1. 應(yīng)用Sigmoid函數(shù)
我們將使用Sigmoid函數(shù)运挫,來繪制一個特征“S”型曲線,作為神經(jīng)網(wǎng)絡(luò)的激活函數(shù)套耕。
此函數(shù)可以將任何值映射到0到1之間的值谁帕,它將有助于我們對輸入的加權(quán)和歸一化。
此后冯袍,我們將創(chuàng)建Sigmoid函數(shù)的導(dǎo)數(shù)匈挖,以幫助計(jì)算權(quán)重的調(diào)整參數(shù)。
可以利用Sigmoid函數(shù)的輸出來生成它的導(dǎo)數(shù)康愤。例如儡循,如果輸出變量為“x”,則其導(dǎo)數(shù)為x*(1-x)征冷。
2. 訓(xùn)練模型
這是我們教神經(jīng)網(wǎng)絡(luò)做出準(zhǔn)確預(yù)測的階段择膝。每個輸入都有一個權(quán)重-可為正值或負(fù)值。這意味著:有較大的正權(quán)重或負(fù)權(quán)重的輸入會對結(jié)果的輸出產(chǎn)生更大的影響检激。請記住肴捉,我們最初是通過為每個隨機(jī)數(shù)分配一個權(quán)重后開始的腹侣。
下面是這個神經(jīng)網(wǎng)絡(luò)示例的訓(xùn)練過程:
第一步:從訓(xùn)練數(shù)據(jù)集中提取輸入,根據(jù)訓(xùn)練數(shù)據(jù)集的權(quán)重進(jìn)行調(diào)整齿穗,并通過一種計(jì)算神經(jīng)網(wǎng)絡(luò)輸出的方法對其進(jìn)行篩選傲隶。
第二步:計(jì)算反向傳播錯誤率。在這種情況下窃页,它是神經(jīng)元的預(yù)測輸出與訓(xùn)練數(shù)據(jù)集的期望輸出之間的差異跺株。
第三步:利用誤差加權(quán)導(dǎo)數(shù)公式,根據(jù)所得到的誤差范圍脖卖,進(jìn)行了一些較小的權(quán)值調(diào)整帖鸦。
第四步:對這一過程進(jìn)行15000次迭代。在每次迭代中胚嘲,整個訓(xùn)練集被同時處理作儿。
? ?? 我們使用“.T”函數(shù)將矩陣從水平位置轉(zhuǎn)換為垂直位置。因此馋劈,數(shù)字將以如下方式存儲:
最后一步攻锰,訓(xùn)練過程中神經(jīng)元的權(quán)重將根據(jù)所提供的訓(xùn)練數(shù)據(jù)進(jìn)行優(yōu)化。隨后妓雾,如果讓神經(jīng)元考慮一個新的輸入進(jìn)行測試娶吞,看看它能否作出一個準(zhǔn)確的預(yù)測。
美麗的分割線
import numpy as np
class NeuralNetwork():
? def __init__(self):
? ? ? # seeding for random number generation
? ? ? np.random.seed(1)
? ? ? #converting weights to a 3 by 1 matrix with values from -1 to 1 and mean of 0
? ? ? self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
? def sigmoid(self, x):
? ? ? #applying the sigmoid function
? ? ? return 1 / (1 + np.exp(-x))
? def sigmoid_derivative(self, x):
? ? ? #computing derivative to the Sigmoid function
? ? ? return x * (1 - x)
? def train(self, training_inputs, training_outputs, training_iterations):
? ? ? #training the model to make accurate predictions while adjusting weights continually
? ? ? for iteration in range(training_iterations):
? ? ? ? ? #siphon the training data via? the neuron
? ? ? ? ? output = self.think(training_inputs)
? ? ? ? ? #computing error rate for back-propagation
? ? ? ? ? error = training_outputs - output
? ? ? ? ? #performing weight adjustments
? ? ? ? ? adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output))
? ? ? ? ? self.synaptic_weights += adjustments
? def think(self, inputs):
? ? ? #passing the inputs via the neuron to get output?
? ? ? #converting values to floats
? ? ? inputs = inputs.astype(float)
? ? ? output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
? ? ? return output
if __name__ == "__main__":
? #initializing the neuron class
? neural_network = NeuralNetwork()
? print("Beginning Randomly Generated Weights: ")
? print(neural_network.synaptic_weights)
? #training data consisting of 4 examples--3 input values and 1 output
? training_inputs = np.array([[0,0,1],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [1,1,1],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [1,0,1],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [0,1,1]])
? training_outputs = np.array([[0,1,1,0]]).T
? #training taking place
? neural_network.train(training_inputs, training_outputs, 15000)
? print("Ending Weights After Training: ")
? print(neural_network.synaptic_weights)
? user_input_one = str(input("User Input One: "))
? user_input_two = str(input("User Input Two: "))
? user_input_three = str(input("User Input Three: "))
? print("Considering New Situation: ", user_input_one, user_input_two, user_input_three)
? print("New Output data: ")
? print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three])))
? print("Wow, we did it!")
這樣械姻,我們便成功地創(chuàng)建了一個簡單的神經(jīng)網(wǎng)絡(luò)妒蛇。
神經(jīng)元首先給自己分配一些隨機(jī)權(quán)重,接著楷拳,利用訓(xùn)練實(shí)例進(jìn)行了自我訓(xùn)練绣夺。
之后,如果輸入新的數(shù)據(jù)[1,0,0]欢揖,則它得出的數(shù)值為0.9999584陶耍。
還記得我們想要的正確答案是1嗎?
這個數(shù)值非常接近她混,Sigmoid函數(shù)輸出值在0到1之間烈钞。