人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單三層神經(jīng)網(wǎng)絡(luò)的搭建及測(cè)試 代碼解析

發(fā)布日期:2021-12-30 12:22 | 文章來源:CSDN

廢話不多說了,直接步入正題,一個(gè)完整的神經(jīng)網(wǎng)絡(luò)一般由三層構(gòu)成:輸入層,隱藏層(可以有多層)和輸出層。本文所構(gòu)建的神經(jīng)網(wǎng)絡(luò)隱藏層只有一層。一個(gè)神經(jīng)網(wǎng)絡(luò)主要由三部分構(gòu)成(代碼結(jié)構(gòu)上):初始化,訓(xùn)練,和預(yù)測(cè)。首先我們先來初始化這個(gè)神經(jīng)網(wǎng)絡(luò)吧!

1.初始化

  • 我們所要初始化的內(nèi)容包括:神經(jīng)網(wǎng)絡(luò)每層上的神經(jīng)元個(gè)數(shù)(這個(gè)是根據(jù)實(shí)際問題輸入輸出而得到的,我們將它設(shè)置為一個(gè)可自定義量)。
  • 不同層間數(shù)據(jù)互相傳送的權(quán)重值。
  • 激活函數(shù)(模擬自然界的神經(jīng)元,刺激信號(hào)需要達(dá)到一定的程度才能激活神經(jīng)元)

下面上代碼:

 def __init__(self, input_nodes_num, hidden_nodes_num, output_nodes_num, lr):
  # 初始化神經(jīng)元個(gè)數(shù),可以直接修改
  self.input_nodes = input_nodes_num
  self.hidden_nodes = hidden_nodes_num
  self.output_nodes = output_nodes_num
  self.learning_rate = lr
  # 初始化權(quán)重值,利用正態(tài)分布函數(shù)進(jìn)行隨機(jī)初始化,均值為0,方差為神經(jīng)元個(gè)數(shù)開方
  self.w_input_hidden = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5),
 (self.hidden_nodes, self.input_nodes))
  self.w_hidden_output = numpy.random.normal(0.0, pow(self.output_nodes, -0.5),
  (self.output_nodes, self.hidden_nodes))
  # 初始化激活函數(shù),激活函數(shù)選用Sigmoid函數(shù),更加平滑,接近自然界的神經(jīng)元行為模式
  # lambda定義了一個(gè)匿名函數(shù)
  self.activation_function = lambda x: scipy.special.expit(x)
  pass

下面我們來解釋一下上述代碼段中的一些編程知識(shí)。首先是__init__()它是一個(gè)類的構(gòu)造函數(shù),在構(gòu)建一個(gè)類的對(duì)象時(shí)會(huì)調(diào)用此函數(shù),所以我們將神經(jīng)網(wǎng)絡(luò)初始化相關(guān)代碼放到這個(gè)函數(shù)里。

self.w_input_hidden = numpy.random.normal(0.0, pow(self.hidden_nodes, -0.5),
 (self.hidden_nodes, self.input_nodes))

這句代碼使用了numpy庫中的random.normal()函數(shù),為輸入層和隱藏層之間的數(shù)據(jù)傳遞初始化了權(quán)重值,這個(gè)函數(shù)會(huì)根據(jù)正態(tài)分布隨機(jī)生成一個(gè)

self.hidden_nodes*self.input_nodes的矩陣(hidden_nodesinput_nodes表示隱藏層和輸入層神經(jīng)元的個(gè)數(shù))。

self.activation_function = lambda x: scipy.special.expit(x)

這句代碼使用lambda定義了一個(gè)匿名函數(shù),將它賦值給激活函數(shù),函數(shù)為sigmoid函數(shù),是一條平滑的曲線,比較接近自然界神經(jīng)元對(duì)于刺激信號(hào)的反應(yīng)方式。

2.預(yù)測(cè)

按照正常順序,初始化完成后應(yīng)該進(jìn)行訓(xùn)練,但由于訓(xùn)練較為復(fù)雜,且預(yù)測(cè)較為簡(jiǎn)單容易實(shí)現(xiàn),我們先完成這一部分的代碼。預(yù)測(cè)環(huán)節(jié)需要我們將輸入信息進(jìn)行處理,加權(quán)求和后傳輸給隱藏層神經(jīng)元,經(jīng)過激活函數(shù)并再次加權(quán)求和后,傳輸給輸出層經(jīng)過輸出層神經(jīng)元的處理得到最終的結(jié)果。代碼片段如下:

 def query(self, inputs_list):
  # 轉(zhuǎn)置將行向量轉(zhuǎn)成列向量,將每組數(shù)據(jù)更好的分隔開來,方便后續(xù)矩陣點(diǎn)乘操作
  inputs = np.array(inputs_list, ndmin=2).T
  # 加權(quán)求和后經(jīng)過sigmoid函數(shù)得到隱藏層輸出
  hidden_inputs = np.dot(self.w_input_hidden, inputs)
  hidden_outputs = self.activation_function(hidden_inputs)
  # 加權(quán)求和后經(jīng)過sigmoid函數(shù)得到最終輸出
  final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
  final_outputs = self.activation_function(final_inputs)
  # 得到輸出數(shù)據(jù)列
  return final_outputs

這段代碼沒有什么好說的,比較簡(jiǎn)單,只需按照筆者上述的步驟做即可。有什么不懂的可以看注釋或者留下評(píng)論。

3.訓(xùn)練

神經(jīng)網(wǎng)絡(luò)的訓(xùn)練問題較為復(fù)雜,涉及到神經(jīng)網(wǎng)絡(luò)的正向和反向傳播,微積分的鏈?zhǔn)椒▌t,矩陣運(yùn)算,偏微分求導(dǎo)和梯度下降算法的一些知識(shí),都是機(jī)器學(xué)習(xí)的一些基礎(chǔ)知識(shí),在這里就不做過多的贅述,過幾天我會(huì)新發(fā)一篇詳細(xì)講一下。下面來了解一下訓(xùn)練代碼段的主要任務(wù):

  • 訓(xùn)練和預(yù)測(cè)一樣都要首先讀入一些輸入并預(yù)測(cè)輸出,不同的是,訓(xùn)練階段我們是從訓(xùn)練數(shù)據(jù)集中獲取數(shù)據(jù),我們知道正確的輸出是什么,而預(yù)測(cè)階段我們只知道輸入而輸出需要通過我們訓(xùn)練的模型預(yù)測(cè)出來。首先訓(xùn)練階段讀入輸入并按照當(dāng)前的模型對(duì)其進(jìn)行預(yù)測(cè)。
  • 基于訓(xùn)練預(yù)測(cè)結(jié)果和標(biāo)注好的實(shí)際結(jié)果的誤差更新各個(gè)層之間的權(quán)值。

下面來貼代碼:

 def train(self, inputs_list, targets_list):
  # 將訓(xùn)練集和測(cè)試集中的數(shù)據(jù)轉(zhuǎn)化為列向量
  inputs = np.array(inputs_list, ndmin=2).T
  targets = np.array(targets_list, ndmin=2).T
  # 隱藏層的輸入為訓(xùn)練集與權(quán)重值的點(diǎn)乘,輸出為激活函數(shù)的輸出
  hidden_inputs = np.dot(self.w_input_hidden, inputs)
  hidden_outputs = self.activation_function(hidden_inputs)
  # 輸出層的輸入為隱藏層的輸出,輸出為最終結(jié)果
  final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
  final_outputs = self.activation_function(final_inputs)
  # 損失函數(shù)
  output_errors = targets - final_outputs
  # 隱藏層的誤差為權(quán)值矩陣的轉(zhuǎn)置與輸出誤差的點(diǎn)乘
  hidden_errors = np.dot(self.w_hidden_output.T, output_errors)
  # 對(duì)權(quán)值進(jìn)行更新
  self.w_hidden_output += self.learning_rate * np.dot((output_errors *
  final_outputs * (1.0 - final_outputs)),
 np.transpose(hidden_outputs))
  self.w_input_hidden += self.learning_rate * np.dot((hidden_errors *
 hidden_outputs * (1.0 - hidden_outputs)),
np.transpose(inputs))

上述代碼段可能對(duì)于一些剛接觸機(jī)器學(xué)習(xí)或深度學(xué)習(xí)的同學(xué)來說可能有點(diǎn)不知所云或產(chǎn)生一種好復(fù)雜的感覺,但是這只是對(duì)反向傳播算法,鏈?zhǔn)椒▌t和偏導(dǎo)的綜合應(yīng)用。我會(huì)在另一篇隨筆中講述我的心得(可能講得不好),感興趣的可以看一下。

4.測(cè)試

三層神經(jīng)網(wǎng)絡(luò)構(gòu)建完成,我用mnist訓(xùn)練集和測(cè)試集對(duì)其進(jìn)行了測(cè)試,代碼及結(jié)果如下:

# 初始化各層神經(jīng)元個(gè)數(shù),期中輸入神經(jīng)元個(gè)數(shù)取決于讀入的因變量,而輸出神經(jīng)元個(gè)數(shù)取決于分類的可能性個(gè)數(shù)
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
# 學(xué)習(xí)率,每次調(diào)整步幅大小
learning_rate = 0.2
n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
# 獲取訓(xùn)練集信息
training_data_file = open('data/mnist_train.csv', 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
for record in training_data_list:
 all_values = record.split(',')
 inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
 targets = numpy.zeros(output_nodes) + 0.01
 targets[int(all_values[0])] = 0.99
 n.train(inputs, targets)
 pass
print('train successful!')
test_file = open('data/mnist_test.csv', 'r')
test_list = test_file.readlines()
test_file.close()
m = np.size(test_list)
j = 0.0
for record in test_list:
 test_values = record.split(',')
 np.asfarray(test_values)
 results = n.query(np.asfarray(test_values[1:]))
 if results[int(test_values[0])] == max(results):
  j += 1
 pass
print("正確率為;" + str(j/m))

到此這篇關(guān)于Python實(shí)現(xiàn)一個(gè)簡(jiǎn)單三層神經(jīng)網(wǎng)絡(luò)的搭建及測(cè)試 代碼解析的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)三層神經(jīng)網(wǎng)絡(luò)的搭建及測(cè)試內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部