
	一.項(xiàng)目背景
	
在前面幾篇文章中,我們介紹了如何搭建神經(jīng)網(wǎng)絡(luò)構(gòu)建神經(jīng)網(wǎng)絡(luò)(一)和神經(jīng)網(wǎng)絡(luò)的傳播算法構(gòu)建神經(jīng)網(wǎng)絡(luò)(二),本篇在之前基礎(chǔ)上介紹下神經(jīng)網(wǎng)絡(luò)的應(yīng)用。
本次用到的數(shù)據(jù)集是經(jīng)典的MNIST數(shù)據(jù)集,它是由0?9手寫數(shù)字圖片和數(shù)字標(biāo)簽所組成的,由60000個(gè)訓(xùn)練樣本和10000個(gè)測(cè)試樣本組成,每個(gè)樣本都是一張28 * 28像素的灰度手寫數(shù)字圖片。我們本次任務(wù)是通過訓(xùn)練集數(shù)據(jù)來訓(xùn)練模型對(duì)測(cè)試集數(shù)據(jù)進(jìn)行正確分類,也就是說該模型是分類模型,總體來說還是很簡單的。

#利用Python讀取數(shù)據(jù)集第一張圖片進(jìn)行展示
import numpy as np
from PIL import Image
#將mnist的訓(xùn)練數(shù)據(jù)CSV文件加載到一個(gè)列表中
training_data_file = open("mnist_train.csv", 'r')
#讀取數(shù)據(jù)
training_data_list = training_data_file.readlines()
#關(guān)閉文件
training_data_file.close()
#轉(zhuǎn)換為二維數(shù)組圖片矩陣
data_0=np.array(training_data_list[0].strip().split(',')[1:]).reshape(28,28)
#array轉(zhuǎn)換成image
pil_img=Image.fromarray(np.uint8(data_0))
#顯示圖片
pil_img.show()

二.實(shí)現(xiàn)過程
1.初始化神經(jīng)網(wǎng)絡(luò)
   1)初始化神經(jīng)元數(shù)量
   2)初始化權(quán)重和學(xué)習(xí)率
   3)初始化激活函數(shù)
import numpy as np
import scipy.special as S
import matplotlib.pyplot as plt
class neuralNetwork:
    #初始化神經(jīng)網(wǎng)絡(luò),構(gòu)造函數(shù)
    def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
        #設(shè)置每個(gè)輸入、隱藏、輸出層中的節(jié)點(diǎn)數(shù)
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        #鏈接權(quán)重矩陣,wih和who
        self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
        self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
        #學(xué)習(xí)率
        self.lr = learningrate
        #創(chuàng)建激活函數(shù)(函數(shù)的另一種定義方法,這樣以后可以直接調(diào)用)
        self.activation_function = lambda x: S.expit(x)
2.訓(xùn)練模型
  1)前向傳播算法
  2)反向更參算法
#訓(xùn)練神經(jīng)網(wǎng)絡(luò)
    def train(self, inputs_list, targets_list):
        #將輸入列表轉(zhuǎn)換成二維數(shù)組
        inputs = np.array(inputs_list, ndmin=2).T
        targets = np.array(targets_list, ndmin=2).T
        #將輸入信號(hào)計(jì)算到隱藏層
        hidden_inputs = np.dot(self.wih, inputs)
        #計(jì)算隱藏層中輸出的信號(hào)(使用激活函數(shù)計(jì)算)
        hidden_outputs = self.activation_function(hidden_inputs)
        #將傳輸?shù)男盘?hào)計(jì)算到輸出層
        final_inputs = np.dot(self.who, hidden_outputs)
        #計(jì)算輸出層中輸出的信號(hào)(使用激活函數(shù))
        final_outputs = self.activation_function(final_inputs)
        #計(jì)算輸出層的誤差:(target - actual)(預(yù)期目標(biāo)輸出值-實(shí)際計(jì)算得到的輸出值)
        output_errors = targets - final_outputs
        #隱藏層的誤差:是輸出層誤差按權(quán)重分割,在隱藏節(jié)點(diǎn)上重新組合
        hidden_errors = np.dot(self.who.T, output_errors)
        #反向傳播,更新各層權(quán)重
        #更新隱層和輸出層之間的權(quán)重
        self.who += self.lr * np.dot((output_errors * final_outputs * (1.0 - final_outputs)),
                                     np.transpose(hidden_outputs))
        #更新輸入層和隱藏層之間的權(quán)重
        self.wih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), np.transpose(inputs))
3.評(píng)估模型
  1)測(cè)試集數(shù)據(jù)傳入網(wǎng)絡(luò)
  2)計(jì)算模型分類準(zhǔn)確率
class neuralNetwork:
    #查詢神經(jīng)網(wǎng)絡(luò):接受神經(jīng)網(wǎng)絡(luò)的輸入,返回神經(jīng)網(wǎng)絡(luò)的輸出
    def query(self, inputs_list):
        #將輸入列表轉(zhuǎn)換成二維數(shù)組
        inputs = np.array(inputs_list, ndmin=2).T
        #將輸入信號(hào)計(jì)算到隱藏層
        hidden_inputs = np.dot(self.wih, inputs)
        #將信號(hào)從隱藏層輸出
        hidden_outputs = self.activation_function(hidden_inputs)
        #將信號(hào)引入到輸出層
        final_inputs = np.dot(self.who, hidden_outputs)
        #將信號(hào)從輸出層輸出
        final_outputs = self.activation_function(final_inputs)
        #返回輸出層的輸出值
        return final_outputs
#初始化輸入層神經(jīng)元
input_nodes = 784
#初始化隱藏層神經(jīng)元
hidden_nodes = 200
#輸出層中的節(jié)點(diǎn)數(shù)
output_nodes = 10
#學(xué)習(xí)率
learning_rate = 0.1
#將mnist的訓(xùn)練數(shù)據(jù)CSV文件加載到一個(gè)列表中
training_data_file = open("mnist_train.csv", 'r')
#讀取數(shù)據(jù)
training_data_list = training_data_file.readlines()
#關(guān)閉文件
training_data_file.close()
#為了節(jié)省訓(xùn)練時(shí)間,我們此處選擇前1000條
training_data_list = training_data_list[:10000]
#輸出訓(xùn)練集數(shù)據(jù)形狀
print('shape training_data_list:', np.shape(training_data_list))
#訓(xùn)練神經(jīng)網(wǎng)絡(luò)
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
#5輪迭代
epochs = 5
#開始訓(xùn)練
print('begin training...')
#遍歷每一輪
for e in range(epochs):
    #批量全集訓(xùn)練
    for record in training_data_list:
        #轉(zhuǎn)換成一行數(shù)據(jù),對(duì)應(yīng)一個(gè)圖片
        all_values = record.split(',') 
        #轉(zhuǎn)換為浮點(diǎn)類型數(shù)組,并進(jìn)行映射, 使其小于1并且非0
        inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01  
        #初始化目標(biāo)值
        targets = np.zeros(output_nodes) + 0.01  # 初始化target向量
        #修改目標(biāo)值對(duì)應(yīng)概率
        targets[int(all_values[0])] = 0.99 
        #開始訓(xùn)練
        n.train(inputs, targets)  
    #輸出每輪提示信息
    print("train", e, 'finished!')
#進(jìn)行測(cè)試,輸出測(cè)試結(jié)果
print('begin test...')
#讀入測(cè)試集數(shù)據(jù)
test_data_file = open("mnist_test.csv", 'r')
#讀取數(shù)據(jù)
test_data_list = test_data_file.readlines()
#關(guān)閉文件
test_data_file.close()
#存儲(chǔ)預(yù)測(cè)值
scorecard = []
#遍歷每條數(shù)據(jù)
for record in test_data_list:
    #轉(zhuǎn)換成一行數(shù)據(jù),對(duì)應(yīng)一個(gè)圖片
    all_values = record.split(',')  
    #將實(shí)際標(biāo)簽值轉(zhuǎn)換為整型
    correct_label = int(all_values[0])  # 標(biāo)簽
    #轉(zhuǎn)換為浮點(diǎn)類型數(shù)組,并進(jìn)行映射, 使其小于1并且非0
    inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01  
    #前向傳播
    outputs = n.query(inputs)
    #找出概率最大值對(duì)應(yīng)標(biāo)簽
    label = np.argmax(outputs)
    #對(duì)比預(yù)測(cè)標(biāo)簽與實(shí)際標(biāo)簽是否相等
    if (label == correct_label):
        #如果相等,添加1
        scorecard.append(1)
    else:
        #如果不相等,添加0
        scorecard.append(0)
#轉(zhuǎn)換為數(shù)組
scorecard_array = np.asarray(scorecard)
#計(jì)算準(zhǔn)確率
print("correct rate = ", scorecard_array.sum() / scorecard_array.size)
結(jié)論:本次項(xiàng)目我們訓(xùn)練模型選取數(shù)據(jù)比較少,準(zhǔn)確率已經(jīng)達(dá)到差不多95%,如果選取
更多數(shù)據(jù)進(jìn)行訓(xùn)練,準(zhǔn)確率會(huì)更高,但是訓(xùn)練時(shí)間也會(huì)隨之增加。

	
	
- 
                                python
                                +關(guān)注
關(guān)注
56文章
4850瀏覽量
89313 - 
                                數(shù)據(jù)集
                                +關(guān)注
關(guān)注
4文章
1229瀏覽量
25993 - 
                                讀取
                                +關(guān)注
關(guān)注
0文章
16瀏覽量
8859 
發(fā)布評(píng)論請(qǐng)先 登錄
    #硬聲創(chuàng)作季 #人工智能 模式識(shí)別-05.3.2 BP神經(jīng)網(wǎng)絡(luò)-1
    
    
    9.1 卷積神經(jīng)網(wǎng)絡(luò)(1)#人工智能
    人腦神經(jīng)網(wǎng)絡(luò)和人工神經(jīng)網(wǎng)絡(luò)(1)#人工智能
    
    應(yīng)用開發(fā):卷積神經(jīng)網(wǎng)絡(luò)的應(yīng)用(1)#硬聲創(chuàng)作季
    應(yīng)用開發(fā):深度神經(jīng)網(wǎng)絡(luò)(1)#硬聲創(chuàng)作季
    1 LeNet神經(jīng)網(wǎng)絡(luò)(1)#神經(jīng)網(wǎng)絡(luò)
    3.1 多層神經(jīng)網(wǎng)絡(luò)(1)#神經(jīng)網(wǎng)絡(luò)
    6 實(shí)現(xiàn)多層神經(jīng)網(wǎng)絡(luò)(1)#神經(jīng)網(wǎng)絡(luò)
    
    用Python從頭實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)來理解神經(jīng)網(wǎng)絡(luò)的原理1
    
手寫數(shù)字識(shí)別神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)(1)
    
          
        
        
神經(jīng)網(wǎng)絡(luò)應(yīng)用-1
                
 
           
            
            
                
            
評(píng)論