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

Python利用全連接神經(jīng)網(wǎng)絡求解MNIST問題詳解

 更新時間:2020年01月14日 11:35:41   作者:theVicTory  
這篇文章主要介紹了Python利用全連接神經(jīng)網(wǎng)絡求解MNIST問題,結合實例形式詳細分析了單隱藏層神經(jīng)網(wǎng)絡與多層神經(jīng)網(wǎng)絡,以及Python全連接神經(jīng)網(wǎng)絡求解MNIST問題相關操作技巧,需要的朋友可以參考下

本文實例講述了Python利用全連接神經(jīng)網(wǎng)絡求解MNIST問題。分享給大家供大家參考,具體如下:

1、單隱藏層神經(jīng)網(wǎng)絡

人類的神經(jīng)元在樹突接受刺激信息后,經(jīng)過細胞體處理,判斷如果達到閾值,則將信息傳遞給下一個神經(jīng)元或輸出。類似地,神經(jīng)元模型在輸入層輸入特征值x之后,與權重w相乘求和再加上b,經(jīng)過激活函數(shù)判斷后傳遞給下一層隱藏層或輸出層。

單神經(jīng)元的模型只有一個求和節(jié)點(如左下圖所示)。全連接神經(jīng)網(wǎng)絡(Full Connected Networks)如右下圖所示,中間層有多個神經(jīng)元,并且每層的每個神經(jīng)元都是與上一層和下一層的節(jié)點都對應連接。中間隱藏層只有一層的神經(jīng)元網(wǎng)絡稱為單隱藏層神經(jīng)網(wǎng)絡。如果有多個中間隱藏層則稱為多隱藏層神經(jīng)網(wǎng)絡。

          

常見的激活函數(shù)如下所示:

下面是在單個神經(jīng)元邏輯回歸求解MNIST手寫數(shù)字識別問題的基礎上,采用單隱藏層神經(jīng)網(wǎng)絡進行求解的過程。

首先載入數(shù)據(jù),從Tensor FLow提供的數(shù)據(jù)庫中導入MNIST數(shù)據(jù)

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)

構建輸入層,其中x是圖像的特征值,由于是28×28=784個像素點,所有輸入為未知行數(shù)、每行784的二維數(shù)組。y是圖像的標簽值,共有0~9十種可能,所有為[None,10]的二維數(shù)組

x=tf.placeholder(tf.float32,[None,784],name='x')
y=tf.placeholder(tf.float32,[None,10],name='y')

構建隱藏層,設置隱藏層神經(jīng)元個數(shù)為256,由于輸入層輸入為784,而隱藏層神經(jīng)元為h1_num,所以W1為[784,h1_num]形式的二維數(shù)組,b為[h1_num]的一維向量。此外采用ReLU作為激活函數(shù)處理輸出。

h1_num=256                        #設置隱藏層神經(jīng)元數(shù)量
W1=tf.Variable(tf.random_normal([784,h1_num]),name='W1')
b1=tf.Variable(tf.zeros([h1_num]),name='b1')
Y1=tf.nn.relu(tf.matmul(x,W1)+b1)             #激活函數(shù)

構建輸出層,由于隱藏層有h1_num個神經(jīng)元輸出,輸出層輸出10種輸出結果,所以W2為[h1_num,10]的二維數(shù)組,b2為[10]的一維向量。最后結果通過softmax將線性輸出Y2轉化為獨熱編碼方式。

W2=tf.Variable(tf.random_normal([h1_num,10]),name='W2')
b2=tf.Variable(tf.zeros([10]),name='b2')
Y2=tf.matmul(Y1,W2)+b2
pred=tf.nn.softmax(Y2)

設置訓練的超參數(shù)、損失函數(shù)、優(yōu)化器,這里采用Adam Optimizer進行優(yōu)化。準確率是通過比較預測值和標簽值是否一致來定義。在定義損失函數(shù)時,如果直接使用交叉熵的方式定義,會出現(xiàn)log0值為NaN的情況,導致數(shù)據(jù)不穩(wěn)定,無法得出結果。Tensor Flow提供了結合softmax定義交叉熵的方式softmax_cross_entropy_with_logits(),第一個參數(shù)為不經(jīng)softmax處理的前向計算結果Y2,第二個參數(shù)為標簽值y

train_epochs=20                    #訓練輪數(shù)
batch_size=50                     #每個批次的樣本數(shù)
batch_num=int(mnist.train.num_examples/batch_size)  #一輪需要訓練多少批
learning_rate=0.01
#定義損失函數(shù)、優(yōu)化器
loss_function=tf.reduce_mean(             #softmax交叉熵損失函數(shù)
       tf.nn.softmax_cross_entropy_with_logits(logits=Y2,labels=y)) 
optimizer=tf.train.AdamOptimizer(learning_rate).minimize(loss_function)
#定義準確率
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

進行訓練并輸出損失值與準確率,訓練進行多輪,每輪一開始分批次讀入數(shù)據(jù)進行訓練,每結束一輪輸出一次損失和準確率。

ss=tf.Session()
ss.run(tf.global_variables_initializer())           #進行全部變量的初始化
 
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})
  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))
 
ss.close()

運行結果如下圖,與單個神經(jīng)元相比,可以較快得到較高的準確率

評估模型,將測試集數(shù)據(jù)填充入占位符x,y去求準確率,

test_res=ss.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
print('測試集的準確率為:%.4f'%(test_res))

2、多層神經(jīng)網(wǎng)絡

多層是指中間的隱藏層有多個,例如使用兩層隱藏層,第一個隱藏層在計算后將結果輸出到第二個隱藏層,再由第二個隱藏層計算后交給輸出層,而第二個隱藏層的設置與第一個基本相同,例如:

#構建輸入層
x=tf.placeholder(tf.float32,[None,784],name='x')
y=tf.placeholder(tf.float32,[None,10],name='y')
#構建第一個隱藏層
h1_num=256                            #第一隱藏層神經(jīng)元數(shù)量256
W1=tf.Variable(tf.truncated_normal([784,h1_num],stddev=0.1),name='W1')
b1=tf.Variable(tf.zeros([h1_num]),name='b1')
Y1=tf.nn.relu(tf.matmul(x,W1)+b1)
#構建第二個隱藏層
h2_num=64                             #第二隱藏層神經(jīng)元數(shù)量64
W2=tf.Variable(tf.random_normal([h1_num,h2_num],stddev=0.1),name='W2')
b2=tf.Variable(tf.zeros([h2_num]),name='b2')
Y2=tf.nn.relu(tf.matmul(Y1,W2)+b2)
#構建輸出層
W3=tf.Variable(tf.random_normal([h2_num,10],stddev=0.1),name='W3')
b3=tf.Variable(tf.zeros([10]),name='b3')
Y3=tf.matmul(Y2,W3)+b3
pred=tf.nn.softmax(Y3)

在第一隱藏層產(chǎn)生參數(shù)W1時采用的是截斷正態(tài)分布的隨機函數(shù)tf.truncated_normal(),與普通正太分布相比,截斷正態(tài)分布生成的值之間的差距不會太大。

設置的第一隱藏層的神經(jīng)元256個,第二層64個,因此第二層的每個輸入有256個特征值,并產(chǎn)生64個輸出,相應的W2的shape為[h1_num,h2_num],b2的shape為[h2_num]。輸出層W3的shape為[h2_num,10]。函數(shù)的其他部分與單層神經(jīng)網(wǎng)絡相同。

經(jīng)過運算多層的神經(jīng)網(wǎng)絡訓練的準確率不一定比單層的高,因為還涉及到訓練的超參數(shù)的設置等多種因素。但是多層神經(jīng)網(wǎng)絡的運行速度比單層慢,越多層的神經(jīng)網(wǎng)絡意味著更加復雜的計算量。

全連接層函數(shù)

通過以上多層神經(jīng)網(wǎng)絡的定義可以看出兩個隱藏層與輸出層的構建方法基本類似,都是定義對應的變量W、b,在定義W時其shape為[輸出維度,輸出維度],因此可以將隱藏層與輸出層統(tǒng)一定義為一個全連接層函數(shù):

#定義一個通用的全連接層函數(shù)模型
def fcn_layer(inputs,in_dim,out_dim,activation=None):
  W=tf.Variable(tf.truncated_normal([in_dim,out_dim],stddev=0.1))
  b=tf.Variable(tf.zeros([out_dim]))
  Y=tf.matmul(inputs,W)+b
  if activation==None:
    output=Y
  else:
    output=activation(Y)
  return output
#構建第一個隱藏層
Y1=fcn_layer(x,784,256,tf.nn.relu)
#構建第二個隱藏層
Y2=fcn_layer(Y1,256,64,tf.nn.relu)
#構建輸出層
Y3=fcn_layer(Y2,64,10)
pred=tf.nn.softmax(Y3)

其中inputs為本層的輸入,in_dim為本層的輸入維度,也就是上一層的輸出維度,out_dim為本層的輸出維度,activation為激活函數(shù),默認為None。將輸入與權重W叉乘再加上偏置值b得到Y,如果定義了激活函數(shù),用激活函數(shù)處理Y,否則直接將Y賦給output輸出。

3、模型的保存與讀取

在模型訓練結束后,如果希望下次繼續(xù)使用或訓練模型則需要將儲存起來。

模型的儲存

首先需要定義模型數(shù)據(jù)的保存路徑:

import os
save_dir='D:/Temp/MachineLearning/ModelSaving/'    #定義模型的保存路徑
if not os.path.exists(save_dir):            #如果不存在該路徑則創(chuàng)建
  os.makedirs(save_dir)

定義儲存粒度與saver,所謂儲存粒度即每個幾輪數(shù)據(jù)進行一次儲存

save_step=5            #定義存儲粒度
 
saver=tf.train.Saver()      #定義saver

在每輪訓練結束后進行判斷,每隔5輪儲存一次,儲存路徑中拼接輪數(shù)信息,

if epoch%save_step==0:
    saver.save(ss,os.path.join(save_dir,'mnist_fcn_{:02d}.ckpt'.format(epoch+1)))

在所有迭代訓練執(zhí)行結束后,再整體儲存一次

saver.save(ss,os.path.join(save_dir,'mnist_fcn.ckpt'))

這樣就會在指定目錄下生成模型的保存文件:

模型的讀取

從定義的模型目錄中讀取存盤點數(shù)據(jù),并將其中的參數(shù)賦值給當前的session,然后便可以直接利用session進行測試,其準確率與保存時一致。

save_dir='D:/Temp/MachineLearning/ModelSaving/'    #定義模型的保存路徑
saver=tf.train.Saver()                 #定義saver
 
ss=tf.Session()
ss.run(tf.global_variables_initializer())
 
ckpt=tf.train.get_checkpoint_state(save_dir)      #讀取存盤點
if ckpt and ckpt.model_checkpoint_path:
  saver.restore(ss,ckpt.model_checkpoint_path)    #從存盤中恢復參數(shù)到當前的session
  print('數(shù)據(jù)恢復從',ckpt.model_checkpoint_path)
 
test_res=accuracy.eval(session=ss,feed_dict={x:mnist.test.images,y:mnist.test.labels})
print('測試集的準確率為:%.4f'%(test_res))

在讀取模型時有時候會遇到報錯:

NotFoundError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a Variable name or other graph key that is missing from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint.

這時只需重啟kernel即可。

通過圖來保存模型

也可以將訓練好的模型以圖的形式保存為.pb文件,下次直接可以使用,但不可以繼續(xù)訓練。

通過tf.train.write_graph函數(shù)來保存模型如下:

import tensorflow as tf
 
v=tf.Variable(1.0,'new_var')
with tf.Session() as ss:
  tf.train.write_graph(ss.graph_def,'D:\Temp\MachineLearning\ModelSaving\Graph',
            'test_graph.pb',as_text=False)

讀取圖文件并還原:

with tf.Session() as ss:
  with tf.gfile.GFile('D:/Temp\MachineLearning/ModelSaving/Graph/test_graph.pb','rb') as pb_file:
    graph_def=tf.GraphDef()
    graph_def.ParseFromString(pb_file.read())
    ss.graph.as_default()
    tf.import_graph_def(graph_def)
    print(graph_def)

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

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

相關文章

  • Python對列表進行排序的5種實現(xiàn)方式

    Python對列表進行排序的5種實現(xiàn)方式

    這篇文章介紹了五種在Python中進行排序的方法,包括sort()方法、sorted()函數(shù)、lambda表達式作為key參數(shù)進行排序、operator模塊進行排序以及numpy模塊進行排序,每種方法都有其適用的場景和優(yōu)勢,可以根據(jù)具體需要選擇最合適的方法
    2025-12-12
  • Python字典取值全攻略之高效、簡潔地獲取字典值的多種技巧

    Python字典取值全攻略之高效、簡潔地獲取字典值的多種技巧

    這篇文章主要給大家介紹了關于Python字典取值全攻略之高效、簡潔地獲取字典值的多種技巧,dictionary(字典)是除列表以外Python之中最靈活的數(shù)據(jù)類型,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Python自動操作神器PyAutoGUI的使用教程

    Python自動操作神器PyAutoGUI的使用教程

    這篇文章主要是想和大家來聊一聊Python如何利用自動操作 GUI 神器——PyAutoGUI在桌面實現(xiàn)自動化操作,感興趣的小伙伴可以了解一下
    2022-06-06
  • python執(zhí)行使用shell命令方法分享

    python執(zhí)行使用shell命令方法分享

    這篇文章主要介紹了python執(zhí)行使用shell命令方法分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • python3下使用cv2.imwrite存儲帶有中文路徑圖片的方法

    python3下使用cv2.imwrite存儲帶有中文路徑圖片的方法

    今天小編就為大家分享一篇python3下使用cv2.imwrite存儲帶有中文路徑圖片的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • xpath無法定位tbody標簽解決方法示例

    xpath無法定位tbody標簽解決方法示例

    這篇文章主要介紹了xpath無法定位tbody標簽解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 用python處理圖片之打開\顯示\保存圖像的方法

    用python處理圖片之打開\顯示\保存圖像的方法

    本篇文章主要介紹了用python處理圖片之打開\顯示\保存圖像的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • python基礎入門之字典和集合

    python基礎入門之字典和集合

    Python中的字典和集合是非常相似的數(shù)據(jù)類型,字典是無序的鍵值對。集合中的數(shù)據(jù)是不重復的,并且不能通過索引去修改集合中的值,我們可以往集合中新增或者修改數(shù)據(jù)。集合是無序的,并且支持數(shù)學中的集合運算,例如并集和交集等。
    2021-06-06
  • pyqt5+opencv?實現(xiàn)讀取視頻數(shù)據(jù)的方法

    pyqt5+opencv?實現(xiàn)讀取視頻數(shù)據(jù)的方法

    這篇文章主要介紹了pyqt5+opencv?實現(xiàn)讀取視頻數(shù)據(jù)的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • Python實現(xiàn)圖片轉字符畫的示例

    Python實現(xiàn)圖片轉字符畫的示例

    本篇文章主要介紹了Python實現(xiàn)圖片轉字符畫的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08

最新評論

宁城县| 自治县| 南郑县| 区。| 北碚区| 正镶白旗| 壶关县| 女性| 漾濞| 亳州市| 泸州市| 阳朔县| 南木林县| 绥棱县| 鄂尔多斯市| 大丰市| 阜平县| 略阳县| 柳江县| 定襄县| 千阳县| 金寨县| 白银市| 淮北市| 铁岭县| 宁陕县| 大余县| 木兰县| 秭归县| 涿鹿县| 文昌市| 花莲县| 衡阳县| 镇远县| 峡江县| 渝中区| 收藏| 成安县| 大余县| 高州市| 墨竹工卡县|