Python利用邏輯回歸模型解決MNIST手寫數(shù)字識別問題詳解
本文實例講述了Python利用邏輯回歸模型解決MNIST手寫數(shù)字識別問題。分享給大家供大家參考,具體如下:
1、MNIST手寫識別問題
MNIST手寫數(shù)字識別問題:輸入黑白的手寫阿拉伯數(shù)字,通過機器學習判斷輸入的是幾。可以通過TensorFLow下載MNIST手寫數(shù)據(jù)集,通過import引入MNIST數(shù)據(jù)集并進行讀取,會自動從網(wǎng)上下載所需文件。
%matplotlib inline import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist=input_data.read_data_sets('MNIST_data/',one_hot=True) import matplotlib.pyplot as plt def plot_image(image): #圖片顯示函數(shù) plt.imshow(image.reshape(28,28),cmap='binary') plt.show() print("訓練集數(shù)量:",mnist.train.num_examples, "特征值組成:",mnist.train.images.shape, "標簽組成:",mnist.train.labels.shape) batch_images,batch_labels=mnist.train.next_batch(batch_size=10) #批量讀取數(shù)據(jù) print(batch_images.shape,batch_labels.shape) print('標簽值:',np.argmax(mnist.train.labels[1000]),end=' ') #np.argmax()得到實際值 print('獨熱編碼表示:',mnist.train.labels[1000]) plot_image(mnist.train.images[1000]) #顯示數(shù)據(jù)集中第1000張圖片
輸出訓練集 的數(shù)量有55000個,并打印特征值的shape為(55000,784),其中784代表每張圖片由28*28個像素點組成,由于是黑白圖片,每個像素點只有黑白單通道,即通過784個數(shù)可以描述一張圖片的特征值??梢詫D片在Jupyter中輸出,將784個特征值reshape為28×28的二維數(shù)組,傳給plt.imshow()函數(shù),之后再通過show()輸出。
MNIST提供next_batch()方法用于批量讀取數(shù)據(jù)集,例如上面批量讀取10個對應的images與labels數(shù)據(jù)并分別返回。該方法會按順序一直往后讀取,直到結(jié)束后會自動打亂數(shù)據(jù),重新繼續(xù)讀取。
在打開mnist數(shù)據(jù)集時,第二個參數(shù)設(shè)置one_hot,表示采用獨熱編碼方式打開。獨熱編碼是一種稀疏向量,其中一個元素為1,其他元素均為0,常用于表示有限個可能的組合情況。例如數(shù)字6的獨熱編碼為第7個分量為1,其他為0的數(shù)組??梢酝ㄟ^np.argmax()函數(shù)返回數(shù)組最大值的下標,即獨熱編碼表示的實際數(shù)字。通過獨熱編碼可以將離散特征的某個取值對應歐氏空間的某個點,有利于機器學習中特征之間的距離計算
數(shù)據(jù)集的劃分,一種劃分為訓練集用于模型的訓練,測試集用于結(jié)果的測試,要求集合數(shù)量足夠大,而且具有代表性。但是在多次執(zhí)行后,會導致模型向測試集數(shù)據(jù)進行擬合,從而導致測試集數(shù)據(jù)失去了測試的效果。因此將數(shù)據(jù)集進一步劃分為訓練集、驗證集、測試集,將訓練后的模型用驗證集驗證,當多次迭代結(jié)束之后再拿測試集去測試。MNIST數(shù)據(jù)集中的訓練集為mnist.train,驗證集為mnist.validation,測試集為mnist.test
2、邏輯回歸
與線性回歸相對比,房價預測是根據(jù)多個輸入?yún)?shù)x與對應權(quán)重w相乘再加上b得到線性的輸出房價。而還有許多問題的輸出是非線性的、控制在[0,1]之間的,比如判斷郵件是否為垃圾郵件,手寫數(shù)字為0~9等,邏輯回歸就是用于處理此類問題。例如電子郵件分類器輸出0.8,表示該郵件為垃圾郵件的概率是0.8.
邏輯回歸通過Sigmoid函數(shù)保證輸出的值在[0,1]之間,該函數(shù)可以將全體實數(shù)映射到[0,1],從而將線性的輸出轉(zhuǎn)換為[0,1]的數(shù)。其定義與圖像如下:
在邏輯回歸中如果采用均方差的損失函數(shù),帶入sigmoid會得到一個非凸函數(shù),這類函數(shù)會有多個極小值,采用梯度下降法便無法求得最優(yōu)解。因此在邏輯回歸中采用對數(shù)損失函數(shù),其中y是特征值x的標簽,y'是預測值。
在手寫數(shù)字識別中,通過單層神經(jīng)元產(chǎn)生連續(xù)的輸出值y,將y再輸入到softmax層處理,經(jīng)過函數(shù)計算將結(jié)果映射為0~9每個數(shù)字對應的概率,概率越大表示該圖片越像某個數(shù)字,所有數(shù)字的概率之和為1
交叉熵損失函數(shù):交叉熵用于刻畫兩個概率分布之間的距離,其中p代表正確答案,q代表預測值,交叉熵越小距離越近,從而模型的預測越準確。例如正確答案為(1,0,0),甲模型預測為(0.5,0.2,0.3),其交叉熵=-1*log0.5≈0.3,乙模型(0.7,0.1,0.2),其交叉熵=-1*log0.7≈0.15,所以乙模型預測更準確
模型的訓練
首先定義二維浮點數(shù)占位符x、y,以及二維參數(shù)變量W、b并隨機賦初值。之后定義前向計算為向量x與W對應叉乘再加b,并將得到的線性結(jié)果經(jīng)過softmax處理得到獨熱編碼預測值。
之后定義準確率accuracy,其值為預測值pred與真實值y相等個數(shù)來衡量
接下來初始化變量、設(shè)置超參數(shù),并定義損失函數(shù)、優(yōu)化器,之后開始訓練。每輪訓練中分批次讀取數(shù)據(jù)進行訓練,每輪訓練結(jié)束后輸出損失與準確率。
import numpy as np import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data mnist=input_data.read_data_sets('MNIST_data/',one_hot=True) import matplotlib.pyplot as plt #定義占位符、變量、前向計算 x=tf.placeholder(tf.float32,[None,784],name='x') y=tf.placeholder(tf.float32,[None,10],name='y') W=tf.Variable(tf.random_normal([784,10]),name='W') b=tf.Variable(tf.zeros([10]),name='b') forward=tf.matmul(x,W)+b pred=tf.nn.softmax(forward) #通過softmax將線性結(jié)果分類處理 #計算預測值與真實值的匹配個數(shù) correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1)) #將上一步得到的布爾值轉(zhuǎn)換為浮點數(shù),并求平均值,得到準確率 accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) ss=tf.Session() init=tf.global_variables_initializer() ss.run(init) #超參數(shù)設(shè)置 train_epochs=50 batch_size=100 #每個批次的樣本數(shù) batch_num=int(mnist.train.num_examples/batch_size) #一輪需要訓練多少批 learning_rate=0.01 #定義交叉熵損失函數(shù)、梯度下降優(yōu)化器 loss_function=tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1)) optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) for epoch in range(train_epochs): for batch in range(batch_num): #分批次讀取數(shù)據(jù)進行訓練 xs,ys=mnist.train.next_batch(batch_size) ss.run(optimizer,feed_dict={x:xs,y:ys}) #每輪訓練結(jié)束后通過帶入驗證集的數(shù)據(jù),檢測模型的損失與準去率 loss,acc=ss.run([loss_function,accuracy],\ feed_dict={x:mnist.validation.images,y:mnist.validation.labels}) print('第%2d輪訓練:損失為:%9f,準確率:%.4f'%(epoch+1,loss,acc))
從每輪訓練結(jié)果可以看出損失在逐漸下降,準確率在逐步上升。
結(jié)果預測
使用訓練好的模型對測試集中的數(shù)據(jù)進行預測,即將mnist.test.images數(shù)據(jù)帶入去求pred的值。
為了使結(jié)果更便于顯示,可以借助plot函數(shù)庫將圖片數(shù)據(jù)顯示出來,并配以文字label與predic的值。首先通過plt.gcf()得到一副圖像資源并設(shè)置其大小。再通過plt.subplot(5,5,index+1)函數(shù)將其劃分為5×5個子圖,遍歷第index+1個子圖,分別將圖像資源繪制到子圖,通過set_title()設(shè)置每個子圖的title顯示內(nèi)容。子圖繪制結(jié)束后顯示整個圖片,并調(diào)用函數(shù)傳入圖片、標簽、預測值等參數(shù)。
prediction=ss.run(tf.argmax(pred,1),feed_dict={x:mnist.test.images}) def show_result(images,labels,prediction,index,num=10): #繪制圖形顯示預測結(jié)果 pic=plt.gcf() #獲取當前圖像 pic.set_size_inches(10,12) #設(shè)置圖片大小 for i in range(0,num): sub_pic=plt.subplot(5,5,i+1) #獲取第i個子圖 #將第index個images信息顯示到子圖上 sub_pic.imshow(np.reshape(images[index],(28,28)),cmap='binary') title="label:"+str(np.argmax(labels[index])) #設(shè)置子圖的title內(nèi)容 if len(prediction)>0: title+=",predict:"+str(prediction[index]) sub_pic.set_title(title,fontsize=10) sub_pic.set_xticks([]) #設(shè)置x、y坐標軸不顯示 sub_pic.set_yticks([]) index+=1 plt.show() show_result(mnist.test.images,mnist.test.labels,prediction,10)
運行結(jié)果如下,可以看到預測的結(jié)果大多準確
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
- 基于Pytorch實現(xiàn)邏輯回歸
- PyTorch實現(xiàn)多維度特征輸入邏輯回歸
- pytorch實現(xiàn)邏輯回歸
- PyTorch線性回歸和邏輯回歸實戰(zhàn)示例
- python sklearn庫實現(xiàn)簡單邏輯回歸的實例代碼
- python實現(xiàn)邏輯回歸的方法示例
- python編寫Logistic邏輯回歸
- python代碼實現(xiàn)邏輯回歸logistic原理
- Python實現(xiàn)的邏輯回歸算法示例【附測試csv文件下載】
- python 牛頓法實現(xiàn)邏輯回歸(Logistic Regression)
- Python利用邏輯回歸分類實現(xiàn)模板
- python機器學習理論與實戰(zhàn)(四)邏輯回歸
- pytorch使用nn.Moudle實現(xiàn)邏輯回歸
相關(guān)文章
Python?pyasn庫解析和生成ASN.1數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Python?pyasn庫實現(xiàn)ASN.1數(shù)據(jù)結(jié)構(gòu)的解析和生成實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01Python跳出循環(huán)語句continue與break的區(qū)別
這篇文章主要介紹了Python跳出循環(huán)語句continue與break的區(qū)別,本文用實例來說明它們之間的區(qū)別,簡單易記易懂,需要的朋友可以參考下2014-08-08Python生成六萬個隨機,唯一的8位數(shù)字和數(shù)字組成的隨機字符串實例
今天小編就為大家分享一篇Python生成六萬個隨機,唯一的8位數(shù)字和數(shù)字組成的隨機字符串實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03