一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python實現一個簡單三層神經網絡的搭建及測試 代碼解析

Python實現一個簡單三層神經網絡的搭建及測試 代碼解析

2022-01-13 00:11柒七期琦 Python

一個完整的神經網絡一般由三層構成:輸入層,隱藏層(可以有多層)和輸出層。本文所構建的神經網絡隱藏層只有一層。一個神經網絡主要由三部分構成(代碼結構上):初始化,訓練,和預測。,需要的朋友可以參考下面文章內

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

1.初始化

  • 我們所要初始化的內容包括:神經網絡每層上的神經元個數(這個是根據實際問題輸入輸出而得到的,我們將它設置為一個可自定義量)。
  • 不同層間數據互相傳送的權重值。
  • 激活函數(模擬自然界的神經元,刺激信號需要達到一定的程度才能激活神經元)

下面上代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def __init__(self, input_nodes_num, hidden_nodes_num, output_nodes_num, lr):
       # 初始化神經元個數,可以直接修改
       self.input_nodes = input_nodes_num
       self.hidden_nodes = hidden_nodes_num
       self.output_nodes = output_nodes_num
       self.learning_rate = lr
 
       # 初始化權重值,利用正態分布函數進行隨機初始化,均值為0,方差為神經元個數開方
       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))
       # 初始化激活函數,激活函數選用Sigmoid函數,更加平滑,接近自然界的神經元行為模式
       # lambda定義了一個匿名函數
       self.activation_function = lambda x: scipy.special.expit(x)
       pass

下面我們來解釋一下上述代碼段中的一些編程知識。首先是__init__()它是一個類的構造函數,在構建一個類的對象時會調用此函數,所以我們將神經網絡初始化相關代碼放到這個函數里。

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

這句代碼使用了numpy庫中的random.normal()函數,為輸入層和隱藏層之間的數據傳遞初始化了權重值,這個函數會根據正態分布隨機生成一個

self.hidden_nodes*self.input_nodes的矩陣(hidden_nodesinput_nodes表示隱藏層和輸入層神經元的個數)。

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

這句代碼使用lambda定義了一個匿名函數,將它賦值給激活函數,函數為sigmoid函數,是一條平滑的曲線,比較接近自然界神經元對于刺激信號的反應方式。

2.預測

按照正常順序,初始化完成后應該進行訓練,但由于訓練較為復雜,且預測較為簡單容易實現,我們先完成這一部分的代碼。預測環節需要我們將輸入信息進行處理,加權求和后傳輸給隱藏層神經元,經過激活函數并再次加權求和后,傳輸給輸出層經過輸出層神經元的處理得到最終的結果。代碼片段如下:

?
1
2
3
4
5
6
7
8
9
10
11
def query(self, inputs_list):
    # 轉置將行向量轉成列向量,將每組數據更好的分隔開來,方便后續矩陣點乘操作
    inputs = np.array(inputs_list, ndmin=2).T
    # 加權求和后經過sigmoid函數得到隱藏層輸出
    hidden_inputs = np.dot(self.w_input_hidden, inputs)
    hidden_outputs = self.activation_function(hidden_inputs)
    # 加權求和后經過sigmoid函數得到最終輸出
    final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
    final_outputs = self.activation_function(final_inputs)
    # 得到輸出數據列
    return final_outputs

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

3.訓練

神經網絡的訓練問題較為復雜,涉及到神經網絡的正向和反向傳播,微積分的鏈式法則,矩陣運算,偏微分求導和梯度下降算法的一些知識,都是機器學習的一些基礎知識,在這里就不做過多的贅述,過幾天我會新發一篇詳細講一下。下面來了解一下訓練代碼段的主要任務:

  • 訓練和預測一樣都要首先讀入一些輸入并預測輸出,不同的是,訓練階段我們是從訓練數據集中獲取數據,我們知道正確的輸出是什么,而預測階段我們只知道輸入而輸出需要通過我們訓練的模型預測出來。首先訓練階段讀入輸入并按照當前的模型對其進行預測。
  • 基于訓練預測結果和標注好的實際結果的誤差更新各個層之間的權值。

下面來貼代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def train(self, inputs_list, targets_list):
    # 將訓練集和測試集中的數據轉化為列向量
    inputs = np.array(inputs_list, ndmin=2).T
    targets = np.array(targets_list, ndmin=2).T
    # 隱藏層的輸入為訓練集與權重值的點乘,輸出為激活函數的輸出
    hidden_inputs = np.dot(self.w_input_hidden, inputs)
    hidden_outputs = self.activation_function(hidden_inputs)
    # 輸出層的輸入為隱藏層的輸出,輸出為最終結果
    final_inputs = np.dot(self.w_hidden_output, hidden_outputs)
    final_outputs = self.activation_function(final_inputs)
    # 損失函數
    output_errors = targets - final_outputs
    # 隱藏層的誤差為權值矩陣的轉置與輸出誤差的點乘
    hidden_errors = np.dot(self.w_hidden_output.T, output_errors)
    # 對權值進行更新
    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))

上述代碼段可能對于一些剛接觸機器學習或深度學習的同學來說可能有點不知所云或產生一種好復雜的感覺,但是這只是對反向傳播算法,鏈式法則和偏導的綜合應用。我會在另一篇隨筆中講述我的心得(可能講得不好),感興趣的可以看一下。

4.測試

三層神經網絡構建完成,我用mnist訓練集和測試集對其進行了測試,代碼及結果如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 初始化各層神經元個數,期中輸入神經元個數取決于讀入的因變量,而輸出神經元個數取決于分類的可能性個數
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
# 學習率,每次調整步幅大小
learning_rate = 0.2
 
n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
# 獲取訓練集信息
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))

Python實現一個簡單三層神經網絡的搭建及測試 代碼解析

到此這篇關于Python實現一個簡單三層神經網絡的搭建及測試 代碼解析的文章就介紹到這了,更多相關Python實現三層神經網絡的搭建及測試內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/sevent/p/15345472.html?utm_source=tuicool&utm_medium=referral

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 公园暴露娇妻小说 | 四虎一区 | 我被黑人彻底征服的全文 | 67id人成观看免费 | 欧美乱理伦另类视频 | 亚洲大片在线观看 | 办公室的秘密在线观看 | 日本一区二区三区久久 | 亚洲AV久久无码精品蜜桃 | 人人最怕九月羊 | 欧洲久久 | 交换余生在线播放免费 | 久久艹影院 | 国产成人精品在线观看 | 免费刷10000名片赞网站 | 91sao在线看片水片 | 日韩一区视频在线 | 桃乃木香奈作品在线观看 | 国产精品久线观看视频 | 四虎4hu永久免费国产精品 | 四虎www.| 亚洲高清中文字幕精品不卡 | 亚洲精品国产成人中文 | 91久久国产青草亚洲 | 97久久精品午夜一区二区 | 日本捏胸吃奶视频免费 | 亚洲白拍 | 四虎在线免费播放 | 免费亚洲视频 | 欧美猛男同志同性video | 羞羞色男人的天堂伊人久久 | 全彩调教侵犯h本子全彩妖气he | 香蕉eeww99国产精选播放 | 午夜影院免费看 | 无套大战白嫩乌克兰美女 | 日出水了特别黄的视频 | 国产午夜小视频 | 操儿子| 国产一区二区三区高清视频 | 日日夜夜撸影院 | 国产精品天天看天天爽 |