欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年09月28日 11:19:18   作者:柒七期琦  
一個完整的神經(jīng)網(wǎng)絡一般由三層構(gòu)成:輸入層,隱藏層(可以有多層)和輸出層。本文所構(gòu)建的神經(jīng)網(wǎng)絡隱藏層只有一層。一個神經(jīng)網(wǎng)絡主要由三部分構(gòu)成(代碼結(jié)構(gòu)上):初始化,訓練,和預測。,需要的朋友可以參考下面文章內(nèi)容的具體內(nèi)容

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

1.初始化

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

下面上代碼:

 def __init__(self, input_nodes_num, hidden_nodes_num, output_nodes_num, lr):
        # 初始化神經(jīng)元個數(shù),可以直接修改
        self.input_nodes = input_nodes_num
        self.hidden_nodes = hidden_nodes_num
        self.output_nodes = output_nodes_num
        self.learning_rate = lr

        # 初始化權重值,利用正態(tài)分布函數(shù)進行隨機初始化,均值為0,方差為神經(jīng)元個數(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定義了一個匿名函數(shù)
        self.activation_function = lambda x: scipy.special.expit(x)
        pass

下面我們來解釋一下上述代碼段中的一些編程知識。首先是__init__()它是一個類的構(gòu)造函數(shù),在構(gòu)建一個類的對象時會調(diào)用此函數(shù),所以我們將神經(jīng)網(wǎng)絡初始化相關代碼放到這個函數(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ù)傳遞初始化了權重值,這個函數(shù)會根據(jù)正態(tài)分布隨機生成一個

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

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

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

2.預測

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

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


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

3.訓練

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

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

下面來貼代碼:

    def train(self, inputs_list, targets_list):
        # 將訓練集和測試集中的數(shù)據(jù)轉(zhuǎn)化為列向量
        inputs = np.array(inputs_list, ndmin=2).T
        targets = np.array(targets_list, ndmin=2).T
        # 隱藏層的輸入為訓練集與權重值的點乘,輸出為激活函數(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
        # 隱藏層的誤差為權值矩陣的轉(zhuǎn)置與輸出誤差的點乘
        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))

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

4.測試

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

# 初始化各層神經(jīng)元個數(shù),期中輸入神經(jīng)元個數(shù)取決于讀入的因變量,而輸出神經(jīng)元個數(shù)取決于分類的可能性個數(shù)
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
# 學習率,每次調(diào)整步幅大小
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實現(xiàn)一個簡單三層神經(jīng)網(wǎng)絡的搭建及測試 代碼解析的文章就介紹到這了,更多相關Python實現(xiàn)三層神經(jīng)網(wǎng)絡的搭建及測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python連接、操作mongodb數(shù)據(jù)庫的方法實例詳解

    python連接、操作mongodb數(shù)據(jù)庫的方法實例詳解

    這篇文章主要介紹了python連接、操作mongodb數(shù)據(jù)庫的方法,結(jié)合實例形式詳細分析了Python針對MongoDB數(shù)據(jù)庫的連接、查詢、排序等相關操作技巧,需要的朋友可以參考下
    2019-09-09
  • Cpython3.9源碼解析python中的大小整數(shù)

    Cpython3.9源碼解析python中的大小整數(shù)

    這篇文章主要介紹了Cpython3.9源碼解析python中的大小整數(shù),在CPython中,小整數(shù)對象池是一種優(yōu)化機制,用于減少對常用小整數(shù)的內(nèi)存分配和銷毀開銷,需要的朋友可以參考下
    2023-04-04
  • django模板獲取list中指定索引的值方式

    django模板獲取list中指定索引的值方式

    這篇文章主要介紹了django模板獲取list中指定索引的值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 39條Python語句實現(xiàn)數(shù)字華容道

    39條Python語句實現(xiàn)數(shù)字華容道

    這篇文章主要為大家詳細介紹了39條Python語句實現(xiàn)數(shù)字華容道,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Tensorflow的DataSet的使用詳解

    Tensorflow的DataSet的使用詳解

    本文主要介紹了Tensorflow的DataSet的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • 對Keras自帶Loss Function的深入研究

    對Keras自帶Loss Function的深入研究

    這篇文章主要介紹了對Keras自帶Loss Function的深入研究,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python 將列表里的字典元素合并為一個字典實例

    python 將列表里的字典元素合并為一個字典實例

    這篇文章主要介紹了python 將列表里的字典元素合并為一個字典實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 通過Python實現(xiàn)Payload分離免殺過程詳解

    通過Python實現(xiàn)Payload分離免殺過程詳解

    這篇文章主要介紹了通過Python實現(xiàn)Payload分離免殺過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Python 取numpy數(shù)組的某幾行某幾列方法

    Python 取numpy數(shù)組的某幾行某幾列方法

    這篇文章主要介紹了Python 取numpy數(shù)組的某幾行某幾列方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • ptyhon實現(xiàn)sitemap生成示例

    ptyhon實現(xiàn)sitemap生成示例

    這篇文章主要介紹了ptyhon實現(xiàn)sitemap生成示例,需要的朋友可以參考下
    2014-03-03

最新評論