全連線神經網路識別手寫體數字
技術標籤:人工智慧
效果展示
向網路輸入測試集中‘7’並繪出該輸入圖,得到10個標籤的概率,7對應的標籤概率最高,效果很好
全連線神經網路
一、網路結構
1、輸入層,隱藏層,輸出層
輸入的範圍應該調整到較小值,但不能為零。一個常見範圍0.01-0.99,或-1.0~1.0,使用哪個範圍,取決於是否匹配了問題。
輸出應該在啟用函式能夠生成的值的範圍內。邏輯函式S是不可能生成小於0或大於1的值。一個合適的範圍0.01~0.99
2、層與層之間連線權重
初始化權值的方法由很多,常量初始化(constant),高斯分佈初始化(gaussian),positive_unitball初始化,均勻分佈初始化(uniform),xavier初始化,msra初始化,雙線性初始化(bilinear)
sigmoid
二、訓練
訓練任務分為2部分
1、針對給定的訓練樣本計算輸出(正向傳播)
由輸入經過網路得出輸出值
2、將計算得到的輸出與所需輸出對比,使用差值來指導網路權重更新(反向傳播)
(1)反向傳播誤差
誤差=目標值-網路輸出值,再逆著網路算出每層誤差
(2)損失函式
計算損失,衡量預測值與實際值之間的差距。常見損失函式:0-1損失函式(0-1 loss function),平方損失函式(quadratic loss function),絕對值損失函式(absolute loss function),對數損失函式(logarithmic loss function)
(3)梯度下降/學習率
(4)世代
使用資料集,多次訓練
三、測試
或叫查詢,與訓練任務一同
四、分類任務中標籤與概率
標籤:每個類對應一個標籤
概率:標籤對應可能性
softmax:用於多分類過程中,它將多個神經元的輸出,對映到(0,1)區間內,可以看成概率來理解,從而來進行多分類:
輸入一個向量,向量中元素為任意實數的評分值,函式對其進行縮放.
輸出一個向量,其中每個元素值在0到1之間,且所有元素之和為1。
訓練測試集
mnist訓練測試集,是一個手寫數字識別庫,世界上最權威的,美國郵政系統開發的,手寫內容是0-9的內容,手寫內容採集於美國人口調查局的員工和高中生
表格形式(CSV)的mnist訓練測試集,大部分電子表格和資料分析軟體相容形式
包括mnist_test.csv、mnist_train.csv、mnist_test_10.csv、mnist_train_100.csv、mnist_train.csv、mnist_test.csv分別有60000、10000個標記樣本集;mnist_test_10.csv、mnist_train_100.csv則只有10條100條記錄是上面的子集,在深入研究前我們常用子集驗證演算法再用完整集
程式碼說明
1、參考了Python神經網路程式設計([英]Tariq Rashid著) 的部分程式碼
2、class neuralNetwork:包含了初始化,訓練,查詢3個部分。初始化要初始權重wih(輸入層隱藏層連線權重,who隱藏層輸出層連線權重),各層的節點個數,啟用函式
3、n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)生成一個網路,input_nodes = 784、hidden_nodes = 200、output_nodes = 10、learning_rate = 0.3為網路引數,其中784=28x28,是輸入畫素,10是0~9共10個標籤
4、迴圈更新權重,訓練網路
for record in training_data_list:
xxxxxxxxxxxxxxx
pass
5、print(n.query((numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01))查詢
import numpy
numpy.set_printoptions(suppress=True)
import scipy.special
import matplotlib.pyplot
class neuralNetwork:
def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
self.lr = learningrate
self.wih = numpy.random.normal(0.0, pow(self.hnodes,-0.5),(self.hnodes,self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes,-0.5),(self.onodes,self.hnodes))
self.activation_function = lambda x: scipy.special.expit(x)
pass
def train(self,inputs_list,targets_list):
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs
hidden_eerors = numpy.dot(self.who.T,output_errors)
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)),numpy.transpose(hidden_outputs))
self.wih += self.lr * numpy.dot((hidden_eerors * hidden_outputs * (1.0 - hidden_outputs)),numpy.transpose(inputs))
pass
def query(self,inputs_list):
inputs = numpy.array(inputs_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
return final_outputs
input_nodes = 784
hidden_nodes = 200
output_nodes = 10
learning_rate = 0.3
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
training_data_file = open("mnist/mnist_train_100.csv",'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
for record in training_data_list:
all_values = record.split(',')
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
targets = numpy.zeros(output_nodes) +0.01
targets[int(all_values[0])] = 0.99
n.train(inputs,targets)
pass
test_data_file = open("mnist/mnist_test_10.csv",'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
all_values = test_data_list[0].split(',')
print(all_values[0])
image_array = numpy.asfarray(all_values[1:]).reshape((28,28))
matplotlib.pyplot.imshow(image_array,cmap='Greys',interpolation='none')
print(n.query((numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01))
matplotlib.pyplot.show()