Python實現最簡單的神經網路 詳細注釋

2021-10-09 00:04:27 字數 4793 閱讀 7674

import numpy as np

import matplotlib.pyplot as plt

import scipy.special as ss

%matplotlib inline

classnn:

## 初始化神經網路

def__init__

(self,inputnodes,hiddennodes,outputnodes,learningrates)

:## 設定輸入層、隱藏層、輸出層的層數

self.inodes = inputnodes

self.hnodes = hiddennodes

self.onodes = outputnodes

## 學習率

self.lr = learningrates

## 鏈結權重矩陣w_ih w_ho

## w_ih矩陣大小為隱藏節點數*輸入節點數,即hnodes*inodes

## w_ho矩陣大小為輸出節點數*隱藏節點數,即onodes*hnodes

## 這裡把所有的權重都初始化為[-0.5,0.5]之間的隨機數

# self.wih = (np.random.rand(self.hnodes,self.inodes)-0.5)

# self.who = (np.random.rand(self.onodes,self.hnodes)-0.5)

## 權重初始化為均值為0,方差為節點連線數平方根的倒數,的正太分布

self.wih = np.random.normal(

0.0,

pow(self.hnodes,

-0.5),\

(self.hnodes,self.inodes)

) self.who = np.random.normal(

0.0,

pow(self.onodes,

-0.5),\

(self.onodes,self.hnodes)

)## 以匿名函式的形式建立啟用函式

self.activation_function =

lambda x: ss.expit(x)

pass

## 訓練神經網路

deftrain

(self,input_list,target_list)

:# 第一部分,正向傳播

## 把輸入列表轉化為二維資料

input

= np.array(input_list,ndmin=2)

.t target = np.array(target_list,ndmin=2)

.t

## 計算隱藏層的輸入

hidden_input = np.dot(self.wih,

input

)## 計算隱藏層的輸出

hidden_outputs = self.activation_function(hidden_input)

## 計算輸出層的輸入

final_input = np.dot(self.who,hidden_outputs)

## 計算最後的輸出

final_outputs = self.activation_function(final_input)

# 第二部分,反向傳播

## 輸出層的誤差是(target - actual)

output_error = target - final_outputs

## 隱藏層的誤差是用權重的大小分割最終的輸出誤差、

## 然後根據隱藏層節點重新組合起立

hidden_error = np.dot(self.who.t,output_error)

## 更新隱藏層和輸出層之間的權重

self.who += self.lr * np.dot(

(output_error * final_outputs \

*(1.0

- final_outputs)

),np.transpose(hidden_outputs)

)## 更新輸入層和隱藏層之間的權重

self.wih += self.lr * np.dot(

(hidden_error * hidden_outputs \

*(1.0

- hidden_outputs)

),np.transpose(

input))

pass

## 查詢神經網路

defquery

(self,input_list)

:## 把輸入的列表轉化為二維矩陣的形式

inputs = np.array(input_list,ndmin=2)

.t ## 計算隱藏層的輸入訊號

hidden_input = np.dot(self.wih,inputs)

## 計算隱藏層的輸出

hidden_outputs = self.activation_function(hidden_input)

## 計算最後輸出層的輸入

final_input = np.dot(self.who,hidden_outputs)

## 計算最後輸出層的輸出

final_outputs = self.activation_function(final_input)

return final_outputs

pass

## 輸入層、隱藏層、輸出層中節點的數量

input_nodes =

784hidden_nodes =

100output_nodes =

10## 學習率為0.3

learn_rate =

0.3## 建立神經網路物件

n = nn(input_nodes,hidden_nodes,output_nodes,learn_rate)

## 載入資料集為列表

train_data_file =

open

("mnist_dataset/mnist_train_100.csv"

,"r"

)## 使用open()函式開啟乙個檔案,傳遞給函式的第乙個引數是檔案的名稱

## 第二個引數是可選的,它告訴python我們希望如何處理檔案

## data_file()就作為該檔案的乙個檔案控制代碼,即該檔案的引用

train_data_list = train_data_file.readlines(

)## 這裡的readlines()函式將檔案中的所有行讀入變數data_list中

train_data_file.close(

)# 訓練神經網路

# 可以對訓練集的資料訓練多次

# 假若訓練5次,那就是對所有的訓練集遍歷5遍

epochs =

5for e in

range

(epochs)

:for record in train_data_list:

## 分割記錄『,』

all_values = record.split(

',')

## 縮放資料到[0,1]之間

inputs =

(np.asfarray(all_values[1:

])/255.0

*0.99)+

0.01

## 除了目標意外的期望輸出值為0.01,期望輸出的是0.99

targets = np.zeros(output_nodes)

+0.01

## 資料記錄的第乙個屬性為標籤

targets[

int(all_values[0]

)]=0.99

n.train(inputs,targets)

pass

pass

## 載入測試資料

test_data_file =

open

("mnist_dataset/mnist_test_10.csv"

,"r"

)test_data_list = test_data_file.readlines(

)test_data_file.close(

)## 測試這個神經網路

## 對神經網路的表現進行記分

scorecard =

for record in test_data_list:

all_values = record.split(

',')

## 輸入資料的標籤就是第乙個資料

correct_label =

int(all_values[0]

)## 對要輸入的資料進行縮放

inputs =

(np.asfarray(all_values[1:

])/255.0

*0.99)+

0.01

## 查詢輸出

outputs = n.query(inputs)

## 找出輸出結果最大值對應的索引

label = np.argmax(outputs)

if(label == correct_label):1

)else:0

)pass

pass

scorecard_array = np.asarray(scorecard)

print

("performance = "

,scorecard_array.

sum(

)/scorecard_array.size)

performance =

0.6

tensorflow實戰 實現簡單的神經網路

from tensorflow.examples.tutorials.mnist import input data import tensorflow as tf mnist input data.read data sets mnist data one hot true sess tf.int...

python實現最簡單迴圈神經網路 RNNs

recurrent neural networks rnns 的模型 上圖中紅色部分是輸入向量。文字 單詞 資料都是輸入,在網路裡都以向量的形式進行表示。綠色部分是隱藏向量。是加工處理過程。藍色部分是輸出向量。python 表示如下 rnn rnn y rnn.step x x為輸入向量,y為輸出向...

實現乙個最簡單的神經網路

這次實現乙個最簡單的神經網路,這個神經網路能判斷輸入的是奇數還是偶數通常咱們寫程式 就要寫成這樣了 if inputnumber 2 else 但是神經網路不是這樣的 首先來想一下,嬰兒時怎麼學習的。嬰兒要學習乙個東西,比如漢語 嬰兒在剛出生的時候是不會任何和漢語相關的知識的 是嬰兒在後來逐漸的學習...