python實現簡單的3層神經網路識別手寫數字

2021-09-25 15:40:03 字數 3096 閱讀 1732

import numpy as np

import scipy.special

import scipy.misc

class neural_network(object):

#類的初始化的方法

def __init__(self,inputnodes,hidenodes,outnodes,learnrate):

#輸入節點

self.inodes = inputnodes

#隱藏節點

self.hnodes = hidenodes

#輸入節點

self.onodes = outnodes

#學習率

self.lr = learnrate

#初始化的輸入的權重矩陣

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_fuction = lambda x:scipy.special.expit(x)

#訓練函式,更新權重

def train(self,input_list,target_list):

#輸入的矩陣

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

#預計的輸出的矩陣

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

#隱藏節點的輸入

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

#隱藏節點的輸出

hidden_output = self.activation_fuction(hidden_input)

#輸出節點的輸入

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

#輸出節點的輸出

final_output = self.activation_fuction(final_input)

#結果與預計結果的差值(誤差)

#print(final_output)

output_error = targets - final_output

#print(output_error)

#隱藏節點的輸出的誤差

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

#更新輸出權重

self.who += self.lr * np.dot(output_error*final_output*(1.0-final_output),np.transpose(hidden_output))

#更新輸入權重

self.wih += self.lr * np.dot(hidden_error*hidden_output*(1.0-hidden_output),np.transpose(inputs))

#計算函式

def query(self,input_list):

#輸入的矩陣

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

#隱藏節的輸入

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

#隱藏節點的輸出

hidden_outputs = self.activation_fuction(hidden_inputs)

#輸出節點的輸入

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

#輸出節點的輸出

final_outputs = self.activation_fuction(final_inputs)

#返回輸出的值

return final_outputs

if __name__ == '__main__':

#輸入節點,畫素為28*28共784

input_nodes = 784

#隱藏節點,100層

hidden_nodes = 100

#輸出節點10個,0-9

output_nodes = 10

#學習率

lr = 0.2

#初始化nt

nt = neural_network(input_nodes, hidden_nodes, output_nodes, lr)

#開始訓練

training_data_file = open("mnist_train_2600.csv", 'r')

training_data_list = training_data_file.readlines()

training_data_file.close()

for record in training_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

nt.train(inputs, targets)

#手寫影象識別

#scipy no moudle imread報錯解除安裝安裝舊版本

img_array = scipy.misc.imread('4.png', flatten=true)

#調整色度

img_data = 255.0 - img_array.reshape(784)

#歸一img_data = (img_data / 255.0 * 0.99) + 0.01

#測試result = nt.query(img_data)

#測試結果

print('數字為:'+str(np.argmax(result)))

用numpy實現簡單的3層神經網路

import numpy as np 啟用函式 def sigmoid x return 1 1 np.exp x 輸出層時使用的 啟用函式 def outputtype x return x softmax函式 def softmax a c np.max a exp a np.exp a c 防...

三層神經網路python 簡單的三層神經網路

參照 python神經網路程式設計 寫乙個簡單的三層神經網路 usr bin env python coding utf 8 import numpy sigmoid 函式 import scipy.special 簡單的三層全連線網路,包括乙個輸入層,乙個隱層和乙個輸出層 損失函式用sigmoid...

使用python實現兩層神經網路(HW3)

記錄一下手動實現乙個兩層的全連線神經網路,主要針對於李巨集毅老師hw3的7分類問題。本來是想拿nn svg畫一下這個結構,結果維度太高,它宕機了。好吧,是我太菜了,不太會用 所以用乙個小的結構代替一下,就是乙個簡單的fcnn bp演算法就不寫在這裡了,其他的大神都講的很不錯的。網路大概結構 源 im...