四 神經網路(識別手寫字)

2021-09-26 01:09:38 字數 3766 閱讀 4880

結合《python神經網路程式設計》這本書實現**,個人認為最近幾年出的實戰系列書,給出的**和思路更加貼切現在的技術,吳恩達課程講解很棒但是很多資料和**或者思想比較老化,不便於吸收理解。

#乙個三層的簡單神經網路實現

import numpy as np

import scipy.special

import mnist_train as mtr

import mnist_test as mte

class neuarlnetwork:

#初始化函式--設定輸入層節點,隱藏層節點和輸出層節點的數量

def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):

#設定輸入層節點,隱藏層節點,輸出層節點的數量

self.inodes = inputnodes

self.hnodes = hiddennodes

self.onodes = outputnodes

#學習效率

self.lr = learningrate

#權重矩陣(-0.5,是希望權重的範圍可以在-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)

#定義s函式

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

pass

#訓練--學習給定訓練集樣本後,優化權重

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.wih,inputs)

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

#隱含層節點反向傳播的誤差

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,inputs_list):

#輸入層的初始輸入值,需要轉置為乙個列向量即n行1列的矩陣

inputs = np.array(inputs_list,ndmin=2).t #ndmin生成乙個二維陣列

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

pass

pass

input_nodes = 784

hidden_nodes = 100

output_nodes = 20

learning_rate = 0.3

#建立神經網路的例項

n = neuarlnetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)

#瀏覽訓練資料集中的所有記錄

for record in mtr.train_data_list:

all_values = record.split(',')

inputs = (np.asfarray(all_values[1:])/255.0 * 0.99) + 0.01

targets = np.zeros(output_nodes) + 0.01

targets[int(all_values[0])] = 0.99

n.train(inputs,targets)

pass

#測試集測試

#記錄網路執行的情況最初為空

scorecard =

for record in mte.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):

else:

pass

pass

#將測試成績作為分數列印出來

scorecard_array = np.asarray(scorecard)

print("performance = ",scorecard_array.sum() / scorecard_array.size)

#print(mnist.mnist_a)

import numpy as np

import matplotlib.pyplot as plt

train_data_file = open(r"d:\project\python神經網路程式設計\資料集\mnist_train.csv", 'r')

train_data_list = train_data_file.readlines()

train_data_file.close()

import numpy as np

import matplotlib.pyplot as plt

test_data_file = open(r"d:\project\python神經網路程式設計\資料集\mnist_test.csv", 'r')

test_data_list = test_data_file.readlines()

test_data_file.close()

all_values = test_data_list[0].split(',')

使用神經網路識別手寫數字

神經網路和深度學習為影象識別 語音識別 自然語言處理等問題提供了目前最好的解決方案。本書主要會介紹神經網路和深度學習背後關鍵的概念。更多關於本書的細節,請參考這裡。或者您可以直接從第一章開始學習。本專案是neural networks and deep learning的中文翻譯,原文作者 mich...

使用神經網路識別手寫數字

最近在看michael nielsen的 neural network and deep learning 嘗試復現書中的 但這本書的 貌似用的python2.0,所以在執行的時候,報了好多錯誤,在這裡進行記錄一下。1 載入mnist資料集出錯 unicodedecodeerror ascii co...

神經網路實現手寫數字識別

簡單實現3層神經網路識別手寫數字 import numpy import matplotlib.pyplot as plt import scipy.special class network 定義神經網路類 definit self,inputnodes,hiddennodes,outputnod...