一.項目背景
在前面幾篇文章中,我們介紹了如何搭建神經網絡構建神經網絡(一)和神經網絡的傳播算法構建神經網絡(二),本篇在之前基礎上介紹下神經網絡的應用。
本次用到的數據集是經典的MNIST數據集,它是由0?9手寫數字圖片和數字標簽所組成的,由60000個訓練樣本和10000個測試樣本組成,每個樣本都是一張28 * 28像素的灰度手寫數字圖片。我們本次任務是通過訓練集數據來訓練模型對測試集數據進行正確分類,也就是說該模型是分類模型,總體來說還是很簡單的。
#利用Python讀取數據集第一張圖片進行展示
import numpy as np
from PIL import Image
#將mnist的訓練數據CSV文件加載到一個列表中
training_data_file = open("mnist_train.csv", 'r')
#讀取數據
training_data_list = training_data_file.readlines()
#關閉文件
training_data_file.close()
#轉換為二維數組圖片矩陣
data_0=np.array(training_data_list[0].strip().split(',')[1:]).reshape(28,28)
#array轉換成image
pil_img=Image.fromarray(np.uint8(data_0))
#顯示圖片
pil_img.show()
二.實現過程
1.初始化神經網絡
1)初始化神經元數量
2)初始化權重和學習率
3)初始化激活函數
import numpy as np
import scipy.special as S
import matplotlib.pyplot as plt
class neuralNetwork:
#初始化神經網絡,構造函數
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
#設置每個輸入、隱藏、輸出層中的節點數
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
#鏈接權重矩陣,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))
#學習率
self.lr = learningrate
#創建激活函數(函數的另一種定義方法,這樣以后可以直接調用)
self.activation_function = lambda x: S.expit(x)
2.訓練模型
1)前向傳播算法
2)反向更參算法
#訓練神經網絡
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)
#計算輸出層的誤差:(target - actual)(預期目標輸出值-實際計算得到的輸出值)
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))
3.評估模型
1)測試集數據傳入網絡
2)計算模型分類準確率
class neuralNetwork:
#查詢神經網絡:接受神經網絡的輸入,返回神經網絡的輸出
def query(self, inputs_list):
#將輸入列表轉換成二維數組
inputs = np.array(inputs_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)
#返回輸出層的輸出值
return final_outputs
#初始化輸入層神經元
input_nodes = 784
#初始化隱藏層神經元
hidden_nodes = 200
#輸出層中的節點數
output_nodes = 10
#學習率
learning_rate = 0.1
#將mnist的訓練數據CSV文件加載到一個列表中
training_data_file = open("mnist_train.csv", 'r')
#讀取數據
training_data_list = training_data_file.readlines()
#關閉文件
training_data_file.close()
#為了節省訓練時間,我們此處選擇前1000條
training_data_list = training_data_list[:10000]
#輸出訓練集數據形狀
print('shape training_data_list:', np.shape(training_data_list))
#訓練神經網絡
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
#5輪迭代
epochs = 5
#開始訓練
print('begin training...')
#遍歷每一輪
for e in range(epochs):
#批量全集訓練
for record in training_data_list:
#轉換成一行數據,對應一個圖片
all_values = record.split(',')
#轉換為浮點類型數組,并進行映射, 使其小于1并且非0
inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
#初始化目標值
targets = np.zeros(output_nodes) + 0.01 # 初始化target向量
#修改目標值對應概率
targets[int(all_values[0])] = 0.99
#開始訓練
n.train(inputs, targets)
#輸出每輪提示信息
print("train", e, 'finished!')
#進行測試,輸出測試結果
print('begin test...')
#讀入測試集數據
test_data_file = open("mnist_test.csv", 'r')
#讀取數據
test_data_list = test_data_file.readlines()
#關閉文件
test_data_file.close()
#存儲預測值
scorecard = []
#遍歷每條數據
for record in test_data_list:
#轉換成一行數據,對應一個圖片
all_values = record.split(',')
#將實際標簽值轉換為整型
correct_label = int(all_values[0]) # 標簽
#轉換為浮點類型數組,并進行映射, 使其小于1并且非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):
#如果相等,添加1
scorecard.append(1)
else:
#如果不相等,添加0
scorecard.append(0)
#轉換為數組
scorecard_array = np.asarray(scorecard)
#計算準確率
print("correct rate = ", scorecard_array.sum() / scorecard_array.size)
結論:本次項目我們訓練模型選取數據比較少,準確率已經達到差不多95%,如果選取
更多數據進行訓練,準確率會更高,但是訓練時間也會隨之增加。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
python
+關注
關注
56文章
4783瀏覽量
84474 -
數據集
+關注
關注
4文章
1205瀏覽量
24649 -
讀取
+關注
關注
0文章
16瀏覽量
8664
發布評論請先 登錄
相關推薦
用Python從頭實現一個神經網絡來理解神經網絡的原理1
有個事情可能會讓初學者驚訝:神經網絡模型并不復雜!『神經網絡』這個詞讓人覺得很高大上,但實際上神經網絡算法要比人們想象的簡單。
這篇文章完全是為新手準備的。我們會通過用Python從頭實現一個
評論