一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

2020-04-24 10:15theVicTory Python

這篇文章主要介紹了Python利用邏輯回歸模型解決MNIST手寫數字識別問題,結合實例形式詳細分析了Python MNIST手寫識別問題原理及邏輯回歸模型解決MNIST手寫識別問題相關操作技巧,需要的朋友可以參考下

本文實例講述了Python利用邏輯回歸模型解決MNIST手寫數字識別問題。分享給大家供大家參考,具體如下:

1、MNIST手寫識別問題

 

MNIST手寫數字識別問題:輸入黑白的手寫阿拉伯數字,通過機器學習判斷輸入的是幾。可以通過TensorFLow下載MNIST手寫數據集,通過import引入MNIST數據集并進行讀取,會自動從網上下載所需文件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%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):                #圖片顯示函數
  plt.imshow(image.reshape(28,28),cmap='binary')
  plt.show()
 
print("訓練集數量:",mnist.train.num_examples,
   "特征值組成:",mnist.train.images.shape,
   "標簽組成:",mnist.train.labels.shape)
 
batch_images,batch_labels=mnist.train.next_batch(batch_size=10#批量讀取數據
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])         #顯示數據集中第1000張圖片

Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解 Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

輸出訓練集 的數量有55000個,并打印特征值的shape為(55000,784),其中784代表每張圖片由28*28個像素點組成,由于是黑白圖片,每個像素點只有黑白單通道,即通過784個數可以描述一張圖片的特征值。可以將圖片在Jupyter中輸出,將784個特征值reshape為28×28的二維數組,傳給plt.imshow()函數,之后再通過show()輸出。

MNIST提供next_batch()方法用于批量讀取數據集,例如上面批量讀取10個對應的images與labels數據并分別返回。該方法會按順序一直往后讀取,直到結束后會自動打亂數據,重新繼續讀取。

在打開mnist數據集時,第二個參數設置one_hot,表示采用獨熱編碼方式打開。獨熱編碼是一種稀疏向量,其中一個元素為1,其他元素均為0,常用于表示有限個可能的組合情況。例如數字6的獨熱編碼為第7個分量為1,其他為0的數組。可以通過np.argmax()函數返回數組最大值的下標,即獨熱編碼表示的實際數字。通過獨熱編碼可以將離散特征的某個取值對應歐氏空間的某個點,有利于機器學習中特征之間的距離計算

數據集的劃分,一種劃分為訓練集用于模型的訓練,測試集用于結果的測試,要求集合數量足夠大,而且具有代表性。但是在多次執行后,會導致模型向測試集數據進行擬合,從而導致測試集數據失去了測試的效果。因此將數據集進一步劃分為訓練集、驗證集、測試集,將訓練后的模型用驗證集驗證,當多次迭代結束之后再拿測試集去測試。MNIST數據集中的訓練集為mnist.train,驗證集為mnist.validation,測試集為mnist.test

2、邏輯回歸

 

與線性回歸相對比,房價預測是根據多個輸入參數x與對應權重w相乘再加上b得到線性的輸出房價。而還有許多問題的輸出是非線性的、控制在[0,1]之間的,比如判斷郵件是否為垃圾郵件,手寫數字為0~9等,邏輯回歸就是用于處理此類問題。例如電子郵件分類器輸出0.8,表示該郵件為垃圾郵件的概率是0.8.

邏輯回歸通過Sigmoid函數保證輸出的值在[0,1]之間,該函數可以將全體實數映射到[0,1],從而將線性的輸出轉換為[0,1]的數。其定義與圖像如下:

Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解 Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

在邏輯回歸中如果采用均方差的損失函數,帶入sigmoid會得到一個非凸函數,這類函數會有多個極小值,采用梯度下降法便無法求得最優解。因此在邏輯回歸中采用對數損失函數Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解,其中y是特征值x的標簽,y'是預測值。

在手寫數字識別中,通過單層神經元產生連續的輸出值y,將y再輸入到softmax層處理,經過函數計算將結果映射為0~9每個數字對應的概率,概率越大表示該圖片越像某個數字,所有數字的概率之和為1

Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

交叉熵損失函數:交叉熵用于刻畫兩個概率分布之間的距離Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解,其中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,所以乙模型預測更準確

模型的訓練

首先定義二維浮點數占位符x、y,以及二維參數變量W、b并隨機賦初值。之后定義前向計算為向量x與W對應叉乘再加b,并將得到的線性結果經過softmax處理得到獨熱編碼預測值。

之后定義準確率accuracy,其值為預測值pred與真實值y相等個數來衡量

接下來初始化變量、設置超參數,并定義損失函數、優化器,之后開始訓練。每輪訓練中分批次讀取數據進行訓練,每輪訓練結束后輸出損失與準確率。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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將線性結果分類處理
 
#計算預測值與真實值的匹配個數
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
#將上一步得到的布爾值轉換為浮點數,并求平均值,得到準確率
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
 
ss=tf.Session()
init=tf.global_variables_initializer()
ss.run(init)
 
#超參數設置
train_epochs=50
batch_size=100                        #每個批次的樣本數
batch_num=int(mnist.train.num_examples/batch_size)      #一輪需要訓練多少批
learning_rate=0.01
 
#定義交叉熵損失函數、梯度下降優化器
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):              #分批次讀取數據進行訓練
    xs,ys=mnist.train.next_batch(batch_size)
    ss.run(optimizer,feed_dict={x:xs,y:ys})
  #每輪訓練結束后通過帶入驗證集的數據,檢測模型的損失與準去率
  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))

從每輪訓練結果可以看出損失在逐漸下降,準確率在逐步上升。

Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

結果預測

使用訓練好的模型對測試集中的數據進行預測,即將mnist.test.images數據帶入去求pred的值。

為了使結果更便于顯示,可以借助plot函數庫將圖片數據顯示出來,并配以文字label與predic的值。首先通過plt.gcf()得到一副圖像資源并設置其大小。再通過plt.subplot(5,5,index+1)函數將其劃分為5×5個子圖,遍歷第index+1個子圖,分別將圖像資源繪制到子圖,通過set_title()設置每個子圖的title顯示內容。子圖繪制結束后顯示整個圖片,并調用函數傳入圖片、標簽、預測值等參數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
prediction=ss.run(tf.argmax(pred,1),feed_dict={x:mnist.test.images})
 
def show_result(images,labels,prediction,index,num=10):   #繪制圖形顯示預測結果
  pic=plt.gcf()                      #獲取當前圖像
  pic.set_size_inches(10,12)               #設置圖片大小
  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]))    #設置子圖的title內容
    if len(prediction)>0:
      title+=",predict:"+str(prediction[index])
      
    sub_pic.set_title(title,fontsize=10)
    sub_pic.set_xticks([])               #設置x、y坐標軸不顯示
    sub_pic.set_yticks([])
    index+=1
  plt.show()
show_result(mnist.test.images,mnist.test.labels,prediction,10)

運行結果如下,可以看到預測的結果大多準確

Python利用邏輯回歸模型解決MNIST手寫數字識別問題詳解

希望本文所述對大家Python程序設計有所幫助。

原文鏈接:https://blog.csdn.net/theVicTory/article/details/95511424

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产小视频在线播放 | 欧美亚洲一区二区三区在线 | chinese国产打屁股 | 青青草视频国产 | 欧美大屁屁| 99精品视频在线观看re | 精品在线网站 | 91精品国产免费久久国语蜜臀 | 美女禁区视频免费观看精选 | 美国玩尿眼道videos | 日韩国产欧美成人一区二区影院 | 希岛爱理作品在线观看 | 国产玖玖在线观看 | www.91在线播放 | 亚洲日韩精品欧美一区二区 | 亚洲免费精品 | 紧缚束缚调教丨vk | 欧美生活一级片 | 国产精品1024永久免费视频 | 满溢游泳池免费土豪全集下拉版 | 2018亚洲男人天堂 | 四虎永久免费地址在线网站 | 调教全程肉动画片在线观看 | 精品视频国产 | 特黄特色大片免费视频播放 | 96日本xxxxxxxxx70 95在线观看精品视频 | 西野翔全部作品在线观看 | 果冻传媒在线免费观看 | 国产网站免费看 | 欧美折磨另类系列sm | www亚洲国产 | 成 人免费va视频 | 日韩福利网站 | 全黄一级裸片视频免费 | www.亚洲视频.com | 欧美日韩一级视频 | 成人在线第一页 | 40岁女人三级全黄 | 国产成人小视频在线观看 | 精品无人区麻豆乱码1区2 | 青青青青青国产免费手机看视频 |