日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用MNIST数据集,在TensorFlow上实现基础LSTM网络

發布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用MNIST数据集,在TensorFlow上实现基础LSTM网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用MNIST數據集,在TensorFlow上實現基礎LSTM網絡

By?路雪2017年9月29日 13:39 本文介紹了如何在 TensorFlow 上實現基礎 LSTM 網絡的詳細過程。作者選用了 MNIST 數據集,本文詳細介紹了實現過程。


長短期記憶(LSTM)是目前循環神經網絡最普遍使用的類型,在處理時間序列數據時使用最為頻繁。關于 LSTM 的更加深刻的洞察可以看看這篇優秀的博客:http://colah.github.io/posts/2015-08-Understanding-LSTMs/。


我們的目的


這篇博客的主要目的就是使讀者熟悉在 TensorFlow 上實現基礎 LSTM 網絡的詳細過程。

我們將選用 MNIST 作為數據集。

  • from tensorflow.examples.tutorials.mnist import input_data

  • mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)


  • MNIST 數據集


    MNIST 數據集包括手寫數字的圖像和對應的標簽。我們可以根據以下內置功能從 TensorFlow 上下載并讀取數據。


    from tensorflow.examples.tutorials.mnist import input_data

    mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)


    數據被分成 3 個部分:


    1. 訓練數據(mnist.train):55000 張圖像

    2. 測試數據(mnist.test):10000 張圖像

    3. 驗證數據(mnist.validation):5000 張圖像


    數據的形態


    討論一下 MNIST 數據集中的訓練數據的形態。數據集的這三個部分的形態都是一樣的。

    訓練數據集包括 55000 張 28x28 像素的圖像,這些 784(28x28)像素值被展開成一個維度為 784 的單一向量,所有 55000 個像素向量(每個圖像一個)被儲存為形態為 (55000,784) 的 numpy 數組,并命名為 mnist.train.images。


    所有這 55000 張圖像都關聯了一個類別標簽(表示其所屬類別),一共有 10 個類別(0,1,2...9),類別標簽使用獨熱編碼的形式表示。因此標簽將作為形態為 (55000,10) 的數組保存,并命名為 mnist.train.labels。


    為什么要選擇 MNIST?


    LSTM 通常用來解決復雜的序列處理問題,比如包含了 NLP 概念(詞嵌入、編碼器等)的語言建模問題。這些問題本身需要大量理解,那么將問題簡化并集中于在 TensorFlow 上實現 LSTM 的細節(比如輸入格式化、LSTM 單元格以及網絡結構設計),會是個不錯的選擇。


    MNIST 就正好提供了這樣的機會。其中的輸入數據是一個像素值的集合。我們可以輕易地將其格式化,將注意力集中在 LSTM 實現細節上。


    實現


    在動手寫代碼之前,先規劃一下實現的藍圖,可以使寫代碼的過程更加直觀。


    VANILLA RNN


    循環神經網絡按時間軸展開的時候,如下圖所示:




    圖中:


    1.x_t 代表時間步 t 的輸入;

    2.s_t 代表時間步 t 的隱藏狀態,可看作該網絡的「記憶」;

    3.o_t 作為時間步 t 時刻的輸出;

    4.U、V、W 是所有時間步共享的參數,共享的重要性在于我們的模型在每一時間步以不同的輸入執行相同的任務。


    當把 RNN 展開的時候,網絡可被看作每一個時間步都受上一時間步輸出影響(時間步之間存在連接)的前饋網絡。


    兩個注意事項


    為了更順利的進行實現,需要清楚兩個概念的含義:

    1.TensorFlow 中 LSTM 單元格的解釋;

    2. 數據輸入 TensorFlow RNN 之前先格式化。


    TensorFlow 中 LSTM 單元格的解釋


    在 TensorFlow 中,基礎的 LSTM 單元格聲明為:

  • tf.contrib.rnn.BasicLSTMCell(num_units)

  • 這里,num_units 指一個 LSTM 單元格中的單元數。num_units 可以比作前饋神經網絡中的隱藏層,前饋神經網絡的隱藏層的節點數量等于每一個時間步中一個 LSTM 單元格內 LSTM 單元的 num_units 數量。下圖可以幫助直觀理解:

    每一個 num_units LSTM 單元都可以看作一個標準的 LSTM 單元:

    以上圖表來自博客(地址:http://colah.github.io/posts/2015-08-Understanding-LSTMs/),該博客有效介紹了 LSTM 的概念。
    數據輸入 TensorFlow RNN 之前先格式化


    在 TensorFlow 中最簡單的 RNN 形式是 static_rnn,在 TensorFlow 中定義如下:

  • tf.static_rnn(cell,inputs)

  • 雖然還有其它的注意事項,但在這里我們僅關注這兩個。


    inputs 引數接受形態為 [batch_size,input_size] 的張量列表。列表的長度為將網絡展開后的時間步數,即列表中每一個元素都分別對應網絡展開的時間步。比如在 MNIST 數據集中,我們有 28x28 像素的圖像,每一張都可以看成擁有 28 行 28 個像素的圖像。我們將網絡按 28 個時間步展開,以使在每一個時間步中,可以輸入一行 28 個像素(input_size),從而經過 28 個時間步輸入整張圖像。給定圖像的 batch_size 值,則每一個時間步將分別收到 batch_size 個圖像。詳見下圖說明:

    由 static_rnn 生成的輸出是一個形態為 [batch_size,n_hidden] 的張量列表。列表的長度為將網絡展開后的時間步數,即每一個時間步輸出一個張量。在這個實現中我們只需關心最后一個時間步的輸出,因為一張圖像的所有行都輸入到 RNN,預測即將在最后一個時間步生成。

    現在,所有的困難部分都已經完成,可以開始寫代碼了。只要理清了概念,寫代碼過程是很直觀的。

    代碼

    在開始的時候,先導入一些必要的依賴關系、數據集,并聲明一些常量。設定 batch_size=128 、 num_units=128。

  • import tensorflow as tf

  • from tensorflow.contrib import rnn

  • #import mnist dataset

  • from tensorflow.examples.tutorials.mnist import input_data

  • mnist=input_data.read_data_sets("/tmp/data/",one_hot=True)

  • #define constants

  • #unrolled through 28 time steps

  • time_steps=28

  • #hidden LSTM units

  • num_units=128

  • #rows of 28 pixels

  • n_input=28

  • #learning rate for adam

  • learning_rate=0.001

  • #mnist is meant to be classified in 10 classes(0-9).

  • n_classes=10

  • #size of batch

  • batch_size=128

  • 現在設置占位、權重以及偏置變量(用于將輸出的形態從 [batch_size,num_units] 轉換為 [batch_size,n_classes]),從而可以預測正確的類別。

  • #weights and biases of appropriate shape to accomplish above task

  • out_weights=tf.Variable(tf.random_normal([num_units,n_classes]))

  • out_bias=tf.Variable(tf.random_normal([n_classes]))

  • #defining placeholders

  • #input image placeholder

  • x=tf.placeholder("float",[None,time_steps,n_input])

  • #input label placeholder

  • y=tf.placeholder("float",[None,n_classes])

  • 現在我們得到了形態為 [batch_size,time_steps,n_input] 的輸入,我們需要將其轉換成形態為 [batch_size,n_inputs] 、長度為 time_steps 的張量列表,從而可以將其輸入 static_rnn。

  • #processing the input tensor from [batch_size,n_steps,n_input] to "time_steps" number of [batch_size,n_input] tensors

  • input=tf.unstack(x ,time_steps,1)

  • 現在我們可以定義網絡了。我們將利用 BasicLSTMCell 的一個層,將我們的 static_rnn 從中提取出來。

  • #defining the network

  • lstm_layer=rnn.BasicLSTMCell(num_units,forget_bias=1)

  • outputs,_=rnn.static_rnn(lstm_layer,input,dtype="float32")

  • 我們只考慮最后一個時間步的輸入,從中生成預測。

  • #converting last output of dimension [batch_size,num_units] to [batch_size,n_classes] by out_weight multiplication

  • prediction=tf.matmul(outputs[-1],out_weights)+out_bias

  • 定義損失函數、優化器和準確率。

  • #loss_function

  • loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))

  • #optimization

  • opt=tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(loss)

  • #model evaluation

  • correct_prediction=tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))

  • accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

  • 現在我們已經完成定義,可以開始運行了。

  • #initialize variables

  • init=tf.global_variables_initializer()

  • with tf.Session() as sess:

  • ? ?sess.run(init)

  • ? ?iter=1

  • ? ?while iter<800:

  • ? ? ? ?batch_x,batch_y=mnist.train.next_batch(batch_size=batch_size)

  • ? ? ? ?batch_x=batch_x.reshape((batch_size,time_steps,n_input))

  • ? ? ? ?sess.run(opt, feed_dict={x: batch_x, y: batch_y})

  • ? ? ? ?if iter %10==0:

  • ? ? ? ? ? ?acc=sess.run(accuracy,feed_dict={x:batch_x,y:batch_y})

  • ? ? ? ? ? ?los=sess.run(loss,feed_dict={x:batch_x,y:batch_y})

  • ? ? ? ? ? ?print("For iter ",iter)

  • ? ? ? ? ? ?print("Accuracy ",acc)

  • ? ? ? ? ? ?print("Loss ",los)

  • ? ? ? ? ? ?print("__________________")

  • ? ? ? ?iter=iter+1

  • 需要注意的是我們的每一張圖像在開始時被平坦化為 784 維的單一向量,函數 next_batch(batch_size) 必須返回這些 784 維向量的 batch_size 批次數。因此它們的形態要被改造成 [batch_size,time_steps,n_input],從而可以被我們的占位符接受。


    我們還可以計算模型的準確率:

  • #calculating test accuracy

  • test_data = mnist.test.images[:128].reshape((-1, time_steps, n_input))

  • test_label = mnist.test.labels[:128]

  • print("Testing Accuracy:", sess.run(accuracy, feed_dict={x: test_data, y: test_label}))

  • 在運行的時候,模型的測試準確率為 99.21%。


    這篇博客旨在讓讀者熟悉 TensorFlow 中 RNN 的實現細節。我們將會在 TensorFlow 中建立更加復雜的模型以更有效的利用 RNN。敬請期待!

    聲明:本文由機器之心編譯出品,原文來自GitHub,轉載請查看要求,機器之心對于違規侵權者保有法律追訴權。

    總結

    以上是生活随笔為你收集整理的使用MNIST数据集,在TensorFlow上实现基础LSTM网络的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 韩产日产国产欧产 | 国产精品扒开腿做爽爽爽男男 | 99久久久无码国产精品衣服 | 五月激情六月丁香 | 无码 人妻 在线 视频 | 人妻精品久久久久中文字幕69 | 久久久久久91亚洲精品中文字幕 | 成人国产视频在线观看 | 涩涩成人| 欧美熟妇一区二区 | 人妻一区二区视频 | 一个色综合网 | 中文字幕永久在线 | 99在线免费观看 | 羞羞的网站在线观看 | 国产麻豆精品一区 | 农村少妇久久久久久久 | 天堂网2018| 日韩免费黄色 | 91欧美激情一区二区三区 | 亚洲自拍偷拍在线 | 有声小说 成人专区 | 久草视频免费 | 欧美极品少妇xxxxⅹ猛交 | 羞羞漫画在线播放 | 毛片传媒| 狠狠干中文字幕 | 91九色视频在线观看 | 婷婷伊人 | 九九热精品视频在线 | 秘密爱大尺度做爰呻吟 | 天天干夜夜想 | www在线免费观看 | 久久九九国产精品 | 亚洲精品在线免费播放 | 狠狠干b | 青青草狠狠操 | 韩国美女被c | 日韩爱爱爱 | 淫片网站 | 日韩精品1区 | av软件在线观看 | 天天综合av | 国产一区一区 | 久久黑丝| 91午夜精品亚洲一区二区三区 | 在线观看视频一区 | 人成在线免费视频 | 中文字幕在线二区 | 人禽l交视频在线播放 视频 | 欧美网站在线观看 | 91精彩视频在线观看 | 中文字幕五码 | 黄色片网站大全 | 精品成人在线视频 | 91啦丨九色丨刺激 | 四虎久久久久 | 一区二区三区免费在线视频 | 献给魔王伊伏洛基亚吧动漫在线观看 | 黄网址在线观看 | 国产精品久久久久毛片大屁完整版 | 国产情侣一区二区三区 | 伊人影院在线观看 | 欧美色图另类 | 丁香婷婷网| 婷婷色在线 | 大乳村妇的性需求 | 国产女人18毛片水真多18 | 日本韩国欧美一区 | 亚洲精品一线二线三线 | 精品无码久久久久久久久成人 | 欧美日韩综合一区二区三区 | 日韩久久一区二区三区 | 色91视频 | 黑人毛片网站 | 欧美a在线观看 | 91精品在线观看视频 | 黑人巨大xxxxx性猛交 | 国产精品伦一区二区三级视频 | 国产强伦人妻毛片 | 91精品在线视频观看 | 最近高清中文在线字幕在线观看 | 久久久久久久黄色片 | 伊人久久大香线蕉av一区 | 国产做受高潮 | 超碰免费在线播放 | 精产国品一区二区三区 | 免费看黄色网址 | 精品久久国产视频 | 污片免费在线观看 | 激情内射人妻1区2区3区 | 久久国精品 | av黄色在线播放 | 浮力影院国产第一页 | 天天上天天干 | 久久精品影视 | 在线艹| 99中文字幕在线观看 | 粉嫩av蜜桃av蜜臀av |