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...