手把手 | 教你用Python創(chuàng)建簡單的神經(jīng)網(wǎng)絡(luò)(附代碼)

創(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之間烈钞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坤按,隨后出現(xiàn)的幾起案子毯欣,更是在濱河造成了極大的恐慌,老刑警劉巖臭脓,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酗钞,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)算吩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佃扼,“玉大人偎巢,你說我怎么就攤上這事〖嬉” “怎么了压昼?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘤运。 經(jīng)常有香客問我窍霞,道長,這世上最難降的妖魔是什么拯坟? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任但金,我火速辦了婚禮,結(jié)果婚禮上郁季,老公的妹妹穿的比我還像新娘冷溃。我一直安慰自己,他們只是感情好梦裂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布似枕。 她就那樣靜靜地躺著,像睡著了一般年柠。 火紅的嫁衣襯著肌膚如雪凿歼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天冗恨,我揣著相機(jī)與錄音答憔,去河邊找鬼。 笑死掀抹,一個胖子當(dāng)著我的面吹牛攀唯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渴丸,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侯嘀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谱轨?” 一聲冷哼從身側(cè)響起戒幔,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎土童,沒想到半個月后诗茎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年敢订,在試婚紗的時候發(fā)現(xiàn)自己被綠了王污。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楚午,死狀恐怖昭齐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矾柜,我是刑警寧澤阱驾,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站怪蔑,受9級特大地震影響里覆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缆瓣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一喧枷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弓坞,春花似錦割去、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菩帝,卻和暖如春咖城,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呼奢。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工宜雀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人握础。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓辐董,卻偏偏與公主長得像,于是被迫代替她去往敵國和親禀综。 傳聞我的和親對象是個殘疾皇子简烘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容