python實現神經網絡


import numpy as np
import scipy.special
import matplotlib.pyplot as plt
import pylab

class NeuralNetwork():
# 初始化神經網絡
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# 設置輸入層節點,隱藏層節點和輸出層節點的數量和學習率
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
self.lr = learningrate #設置神經網絡中的學習率
# 使用正態分布,進行權重矩陣的初始化
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: scipy.special.expit(x) #激活函數設為Sigmod()函數
pass
# 定義訓練神經網絡
print("************Train start******************")
def train(self,input_list,target_list):
# 將輸入、輸出列表轉換為二維數組
inputs = np.array(input_list, ndmin=2).T
targets = np.array(target_list,ndmin= 2).T
hidden_inputs = np.dot(self.wih, inputs) #計算到隱藏層的信號,dot()返回的是兩個數組的點積
hidden_outputs = self.activation_function(hidden_inputs) #計算隱藏層輸出的信號
final_inputs = np.dot(self.who, hidden_outputs) #計算到輸出層的信號
final_outputs = self.activation_function(final_inputs)

output_errors = targets - final_outputs #計算輸出值與標簽值的差值
#print("*****************************")
#print("output_errors:",output_errors)
hidden_errors = np.dot(self.who.T,output_errors)

#隱藏層和輸出層權重更新
self.who += self.lr * np.dot((output_errors*final_outputs*(1.0-final_outputs)),
np.transpose(hidden_outputs))
#輸入層和隱藏層權重更新
self.wih += self.lr * np.dot((hidden_errors*hidden_outputs*(1.0-hidden_outputs)),
np.transpose(inputs))
pass

#查詢神經網絡
def query(self, input_list): # 轉換輸入列表到二維數
inputs = np.array(input_list, ndmin=2).T #計算到隱藏層的信號
hidden_inputs = np.dot(self.wih, inputs) #計算隱藏層輸出的信號
hidden_outputs = self.activation_function(hidden_inputs) #計算到輸出層的信號
final_inputs = np.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
return final_outputs

input_nodes = 784 #輸入層神經元個數
hidden_nodes = 100 #隱藏層神經元個數
output_nodes = 10 #輸出層神經元個數
learning_rate = 0.3 #學習率為0.3
# 創建神經網絡
n = NeuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

score = []
print("***************Test start!**********************")
for record in test_data_list:
#用逗號分割將數據進行拆分
all_values = record.split(',')
#正確的答案是第一個值
correct_values = int(all_values[0])
print(correct_values,"是正確的期望值")
#做輸入
inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01
#測試網絡 作輸入
outputs= n.query(inputs)
#找出輸出的最大值的索引
label = np.argmax(outputs)
print(label,"是網絡的輸出值\n")
#如果期望值和網絡的輸出值正確 則往score 數組里面加1 否則添加0
if(label == correct_values):
score.append(1)
else:
score.append(0)
pass
pass

print("正確率是:",(score_array.sum()/score_array.size)*100,'%')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM