最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年01月14日 11:06:03   作者:theVicTory  
這篇文章主要介紹了Python利用邏輯回歸模型解決MNIST手寫數(shù)字識(shí)別問題,結(jié)合實(shí)例形式詳細(xì)分析了Python MNIST手寫識(shí)別問題原理及邏輯回歸模型解決MNIST手寫識(shí)別問題相關(guān)操作技巧,需要的朋友可以參考下

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

1、MNIST手寫識(shí)別問題

MNIST手寫數(shù)字識(shí)別問題:輸入黑白的手寫阿拉伯?dāng)?shù)字,通過機(jī)器學(xué)習(xí)判斷輸入的是幾??梢酝ㄟ^TensorFLow下載MNIST手寫數(shù)據(jù)集,通過import引入MNIST數(shù)據(jù)集并進(jìn)行讀取,會(huì)自動(dòng)從網(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("訓(xùn)練集數(shù)量:",mnist.train.num_examples,
   "特征值組成:",mnist.train.images.shape,
   "標(biāo)簽組成:",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('標(biāo)簽值:',np.argmax(mnist.train.labels[1000]),end=' ')  #np.argmax()得到實(shí)際值
print('獨(dú)熱編碼表示:',mnist.train.labels[1000])
plot_image(mnist.train.images[1000])         #顯示數(shù)據(jù)集中第1000張圖片

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

MNIST提供next_batch()方法用于批量讀取數(shù)據(jù)集,例如上面批量讀取10個(gè)對(duì)應(yīng)的images與labels數(shù)據(jù)并分別返回。該方法會(huì)按順序一直往后讀取,直到結(jié)束后會(huì)自動(dòng)打亂數(shù)據(jù),重新繼續(xù)讀取。

在打開mnist數(shù)據(jù)集時(shí),第二個(gè)參數(shù)設(shè)置one_hot,表示采用獨(dú)熱編碼方式打開。獨(dú)熱編碼是一種稀疏向量,其中一個(gè)元素為1,其他元素均為0,常用于表示有限個(gè)可能的組合情況。例如數(shù)字6的獨(dú)熱編碼為第7個(gè)分量為1,其他為0的數(shù)組??梢酝ㄟ^np.argmax()函數(shù)返回?cái)?shù)組最大值的下標(biāo),即獨(dú)熱編碼表示的實(shí)際數(shù)字。通過獨(dú)熱編碼可以將離散特征的某個(gè)取值對(duì)應(yīng)歐氏空間的某個(gè)點(diǎn),有利于機(jī)器學(xué)習(xí)中特征之間的距離計(jì)算

數(shù)據(jù)集的劃分,一種劃分為訓(xùn)練集用于模型的訓(xùn)練,測(cè)試集用于結(jié)果的測(cè)試,要求集合數(shù)量足夠大,而且具有代表性。但是在多次執(zhí)行后,會(huì)導(dǎo)致模型向測(cè)試集數(shù)據(jù)進(jìn)行擬合,從而導(dǎo)致測(cè)試集數(shù)據(jù)失去了測(cè)試的效果。因此將數(shù)據(jù)集進(jìn)一步劃分為訓(xùn)練集、驗(yàn)證集、測(cè)試集,將訓(xùn)練后的模型用驗(yàn)證集驗(yàn)證,當(dāng)多次迭代結(jié)束之后再拿測(cè)試集去測(cè)試。MNIST數(shù)據(jù)集中的訓(xùn)練集為mnist.train,驗(yàn)證集為mnist.validation,測(cè)試集為mnist.test

2、邏輯回歸

與線性回歸相對(duì)比,房?jī)r(jià)預(yù)測(cè)是根據(jù)多個(gè)輸入?yún)?shù)x與對(duì)應(yīng)權(quán)重w相乘再加上b得到線性的輸出房?jī)r(jià)。而還有許多問題的輸出是非線性的、控制在[0,1]之間的,比如判斷郵件是否為垃圾郵件,手寫數(shù)字為0~9等,邏輯回歸就是用于處理此類問題。例如電子郵件分類器輸出0.8,表示該郵件為垃圾郵件的概率是0.8.

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

在邏輯回歸中如果采用均方差的損失函數(shù),帶入sigmoid會(huì)得到一個(gè)非凸函數(shù),這類函數(shù)會(huì)有多個(gè)極小值,采用梯度下降法便無法求得最優(yōu)解。因此在邏輯回歸中采用對(duì)數(shù)損失函數(shù),其中y是特征值x的標(biāo)簽,y'是預(yù)測(cè)值。

在手寫數(shù)字識(shí)別中,通過單層神經(jīng)元產(chǎn)生連續(xù)的輸出值y,將y再輸入到softmax層處理,經(jīng)過函數(shù)計(jì)算將結(jié)果映射為0~9每個(gè)數(shù)字對(duì)應(yīng)的概率,概率越大表示該圖片越像某個(gè)數(shù)字,所有數(shù)字的概率之和為1

交叉熵?fù)p失函數(shù):交叉熵用于刻畫兩個(gè)概率分布之間的距離,其中p代表正確答案,q代表預(yù)測(cè)值,交叉熵越小距離越近,從而模型的預(yù)測(cè)越準(zhǔn)確。例如正確答案為(1,0,0),甲模型預(yù)測(cè)為(0.5,0.2,0.3),其交叉熵=-1*log0.5≈0.3,乙模型(0.7,0.1,0.2),其交叉熵=-1*log0.7≈0.15,所以乙模型預(yù)測(cè)更準(zhǔn)確

模型的訓(xùn)練

首先定義二維浮點(diǎn)數(shù)占位符x、y,以及二維參數(shù)變量W、b并隨機(jī)賦初值。之后定義前向計(jì)算為向量x與W對(duì)應(yīng)叉乘再加b,并將得到的線性結(jié)果經(jīng)過softmax處理得到獨(dú)熱編碼預(yù)測(cè)值。

之后定義準(zhǔn)確率accuracy,其值為預(yù)測(cè)值pred與真實(shí)值y相等個(gè)數(shù)來衡量

接下來初始化變量、設(shè)置超參數(shù),并定義損失函數(shù)、優(yōu)化器,之后開始訓(xùn)練。每輪訓(xùn)練中分批次讀取數(shù)據(jù)進(jìn)行訓(xùn)練,每輪訓(xùn)練結(jié)束后輸出損失與準(zhǔn)確率。

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
 
#定義占位符、變量、前向計(jì)算
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é)果分類處理
 
#計(jì)算預(yù)測(cè)值與真實(shí)值的匹配個(gè)數(shù)
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
#將上一步得到的布爾值轉(zhuǎn)換為浮點(diǎn)數(shù),并求平均值,得到準(zhǔn)確率
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                        #每個(gè)批次的樣本數(shù)
batch_num=int(mnist.train.num_examples/batch_size)      #一輪需要訓(xùn)練多少批
learning_rate=0.01
 
#定義交叉熵?fù)p失函數(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ù)進(jìn)行訓(xùn)練
    xs,ys=mnist.train.next_batch(batch_size)
    ss.run(optimizer,feed_dict={x:xs,y:ys})
  #每輪訓(xùn)練結(jié)束后通過帶入驗(yàn)證集的數(shù)據(jù),檢測(cè)模型的損失與準(zhǔn)去率 
  loss,acc=ss.run([loss_function,accuracy],\
          feed_dict={x:mnist.validation.images,y:mnist.validation.labels})
  print('第%2d輪訓(xùn)練:損失為:%9f,準(zhǔn)確率:%.4f'%(epoch+1,loss,acc))

從每輪訓(xùn)練結(jié)果可以看出損失在逐漸下降,準(zhǔn)確率在逐步上升。

結(jié)果預(yù)測(cè)

使用訓(xùn)練好的模型對(duì)測(cè)試集中的數(shù)據(jù)進(jìn)行預(yù)測(cè),即將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個(gè)子圖,遍歷第index+1個(gè)子圖,分別將圖像資源繪制到子圖,通過set_title()設(shè)置每個(gè)子圖的title顯示內(nèi)容。子圖繪制結(jié)束后顯示整個(gè)圖片,并調(diào)用函數(shù)傳入圖片、標(biāo)簽、預(yù)測(cè)值等參數(shù)。

prediction=ss.run(tf.argmax(pred,1),feed_dict={x:mnist.test.images})
 
def show_result(images,labels,prediction,index,num=10):   #繪制圖形顯示預(yù)測(cè)結(jié)果
  pic=plt.gcf()                      #獲取當(dāng)前圖像
  pic.set_size_inches(10,12)               #設(shè)置圖片大小
  for i in range(0,num):
    sub_pic=plt.subplot(5,5,i+1)            #獲取第i個(gè)子圖
    #將第index個(gè)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坐標(biāo)軸不顯示
    sub_pic.set_yticks([])
    index+=1
  plt.show()
show_result(mnist.test.images,mnist.test.labels,prediction,10)

運(yùn)行結(jié)果如下,可以看到預(yù)測(cè)的結(jié)果大多準(zhǔn)確

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python裝飾器原理與基本用法分析

    Python裝飾器原理與基本用法分析

    這篇文章主要介紹了Python裝飾器原理與基本用法,結(jié)合實(shí)例形式分析了Python裝飾器的基本功能、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • python3 下載網(wǎng)絡(luò)圖片代碼實(shí)例

    python3 下載網(wǎng)絡(luò)圖片代碼實(shí)例

    這篇文章主要介紹了python3 下載網(wǎng)絡(luò)圖片代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python?分支結(jié)構(gòu)詳解

    Python?分支結(jié)構(gòu)詳解

    這篇文章主要介紹了Python?分支結(jié)構(gòu),分支結(jié)構(gòu)包括單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)等內(nèi)容,下文ui分支結(jié)構(gòu)進(jìn)行詳細(xì)分析,需要的小伙伴可以參考一下
    2022-02-02
  • 簡(jiǎn)單了解Python生成器是什么

    簡(jiǎn)單了解Python生成器是什么

    這篇文章主要介紹了簡(jiǎn)單了解Python生成器是什么,生成器就是一個(gè)在行為上和迭代器非常類似的對(duì)象,如果把迭代器比作 Android 系統(tǒng),那么生成器就是 iOS,二者功能上差不多,但是生成器更優(yōu)雅,需要的朋友可以參考下
    2019-07-07
  • 詳解python實(shí)現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe

    詳解python實(shí)現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe

    這篇文章主要為大家介紹了python實(shí)現(xiàn)多張多格式圖片轉(zhuǎn)PDF并打包成exe方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法

    windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法

    這篇文章主要介紹了windows 10 設(shè)定計(jì)劃任務(wù)自動(dòng)執(zhí)行 python 腳本的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享

    Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享

    這篇文章主要介紹了Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • Python?Pandas多種添加行列數(shù)據(jù)方法總結(jié)

    Python?Pandas多種添加行列數(shù)據(jù)方法總結(jié)

    在進(jìn)行數(shù)據(jù)分析時(shí)經(jīng)常需要按照一定條件創(chuàng)建新的數(shù)據(jù)列,然后進(jìn)行進(jìn)一步分析,下面這篇文章主要給大家介紹了關(guān)于Python?Pandas多種添加行列數(shù)據(jù)方法的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 基于Python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲的示例代碼

    基于Python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲的示例代碼

    植物大戰(zhàn)僵尸是一款經(jīng)典的塔防類游戲,玩家通過種植各種植物來抵御僵尸的攻擊,本文將詳細(xì)介紹如何使用Python和Pygame庫來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的植物大戰(zhàn)僵尸游戲,文中通過代碼示例講解的非常詳細(xì),感興趣的小伙伴跟著小編一起來看看吧
    2024-10-10
  • 揭秘Python高效編程十招必備技巧

    揭秘Python高效編程十招必備技巧

    這篇文章主要為大家介紹了Python高效編程十招必備技巧實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01

最新評(píng)論

聊城市| 通化县| 涿鹿县| 和田县| 祁门县| 化州市| 秦安县| 忻城县| 绍兴县| 泰安市| 通道| 松溪县| 周宁县| 塔城市| 固原市| 盈江县| 松滋市| 渑池县| 伊宁县| 江北区| 偏关县| 通山县| 滨海县| 塔河县| 论坛| 凌海市| 张家港市| 集贤县| 古蔺县| 东辽县| 石柱| 晋城| 岱山县| 平邑县| 深水埗区| 大同县| 墨脱县| 容城县| 东阳市| 赤水市| 隆化县|