學習筆記TF028:實現簡單捲積網路

来源:http://www.cnblogs.com/libinggen/archive/2017/07/24/7231068.html
-Advertisement-
Play Games

載入MNIST數據集。創建預設Interactive Session。 初始化函數,權重製造隨機雜訊打破完全對稱。截斷正態分佈雜訊,標準差設0.1。ReLU,偏置加小正值(0.1),避免死亡節點(dead neurons)。 捲積層函數,tf.nn.conv2d,TensorFlow 2 維捲積函數 ...


載入MNIST數據集。創建預設Interactive Session。

初始化函數,權重製造隨機雜訊打破完全對稱。截斷正態分佈雜訊,標準差設0.1。ReLU,偏置加小正值(0.1),避免死亡節點(dead neurons)。

捲積層函數,tf.nn.conv2d,TensorFlow 2 維捲積函數,參數x輸入,W捲積參數,捲積核尺寸,channel個數,捲積核數量(捲積層提取特征數量)。Strides捲積模板移動步長,全1代表不遺漏划過圖片每一個點。Padding代表邊界處理方式,SAME邊界加Padding,捲積輸出、輸入保持同樣尺寸。

池化層函數,tf.nn.max_pool,TensorFlow 最大池化函數。2x2最大池化,2x2像素塊降為1x1像素。最大池化保留原始像素塊灰度值最高像素,保留最顯著特征。strides設橫豎方向2步長。

定義輸入placeholder,x特征,y真實label。捲積神經網路空間結構信息,1D輸入向量,轉為2D圖片結構。尺寸[-1,28,28,1]。-1代表樣本數量不固定。1代表顏色通道數量。tf.reshape tensor變形函數。

第一個捲積層,捲積函數初始化,weights、bias。[5,5,1,32]代表捲積核尺寸5x5,1個顏色通道,32個不同捲積核。使用conv2d函數捲積操作,加偏置,使用ReLU激活函數非線性處理。使用最大池化函數max_pool_2x2池化操作捲積輸出結果。

第二個捲積層,捲積核64個,提取64種特征。經歷兩次步長2x2最大池化,邊長只有1/4,圖片尺寸28x28變7x7.第二個捲積層捲積核數量64,輸出tensor尺寸7x7x64。使用tf.reshape函數對第二個捲積層輸出tensor變形,轉成1D向量,連接一個全連接層,隱含節點1024,使用ReLU激活函數。

使用Dropout層減輕過擬合。Dropout,通過一個placeholder傳入keep_prob比率控制。訓練時,隨機丟棄部分節點數據減輕過擬合,預測時保留全部數據追求最好預測性能。

Dropout層輸出連接Softmax層,得到最後概率輸出。

定義損失函數cross_entropy。優化器使用Adam,給予較小學習速率1e-4。

定義評測準確率操作。

訓練,初始化所有參數,設置訓練時Dropout的keep_prob比率0.5.使用大小50的mini-batch,進行20000次訓練迭代,樣本數量100萬。每100次訓練,評測準確率,keep_prob設1,實時監測模型性能。

全部訓練完成,測試集全面測試,得到整體分類準確率。

99.2%準確率,捲積網路對圖像特征提取抽象,捲積核權值共用。

    from tensorflow.examples.tutorials.mnist import input_data
    import tensorflow as tf
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    sess = tf.InteractiveSession()
    def weight_variable(shape):
      initial = tf.truncated_normal(shape, stddev=0.1)
      return tf.Variable(initial)
    def bias_variable(shape):
      initial = tf.constant(0.1, shape=shape)
      return tf.Variable(initial)
  
    def conv2d(x, W):
      return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    def max_pool_2x2(x):
      return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')  
                        
    x = tf.placeholder(tf.float32, [None, 784])
    y_ = tf.placeholder(tf.float32, [None, 10])
    x_image = tf.reshape(x, [-1,28,28,1])
                        
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    W_fc1 = weight_variable([7 * 7 * 64, 1024])
    b_fc1 = bias_variable([1024])
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1]))
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.global_variables_initializer().run()
    for i in range(20000):
      batch = mnist.train.next_batch(50)
      if i%100 == 0:
        train_accuracy = accuracy.eval(feed_dict={
        x:batch[0], y_: batch[1], keep_prob: 1.0})
        print("step %d, training accuracy %g"%(i, train_accuracy))
      train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
    print("test accuracy %g"%accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

 

參考資料:
《TensorFlow實踐》

歡迎付費咨詢(150元每小時),我的微信:qingxingfengzi


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為腳本,python具備了弱類型語言的靈活性,便捷性。這在日常的開發使用中能夠大幅度的減輕開發人員的編碼負擔,開發者也能夠將精力集中在程式的邏輯管理和總體構架設計上。一般而言,隨著經驗的積累,開發人員都能使用python寫出漂亮的代碼,簡潔而美觀。 python也是嚴謹的,從對各類預定義錯誤的設定 ...
  • 知乎的整個網站架構圖如下: 知乎是國內很少的使用Python開發的一個網站,也很多值得我們學習的地方,從知乎讓我們也可以瞭解到一些新的WEB技術。 一、Python框架 知乎目前使用的是Tornado 框架。Tornado 全稱Tornado Web Server,是一個用Python 語言寫成的W ...
  • 一 log4j log4j是Apache的一個開源項目,用於輸出程式的運行狀況。 相比於在程式內部添加System.out.println()做日誌輸出,log4j有如下優點: 可以設定信息輸出的目的地,常用的有控制台、文件等。 根據日誌的嚴重程度,將日誌分為6級,從高到低依次是:fatal、err ...
  • 消息保證送達是指消息發送方保證在任何情況下都會至少一次確定的消息送達。AtleastOnceDelivery是一個獨立的trait,主要作用是對不確定已送達的消息進行補發,這是一種自動的操作,無需用戶干預。既然涉及到消息的補發,就不可避免地影響發送方和接收方之間消息傳遞的順序、接收方重覆收到相同的消 ...
  • 1、函數嵌套 1.1函數的嵌套調用 在調用一個函數的過程中,又調用了其他函數 1.2函數的嵌套定義 在一個函數的內部,又定義另外一個函數 2、名稱空間 2.1名稱空間 名稱空間:存放名字的地方,準確的說名稱空間是存放名字與變數值綁定關係的地方 內置名稱空間:在python解釋器啟動時產生,存放一些p ...
  • 一 概述 1.整合目的 有了Spring以後,所有對象的創建任務都應該交給Spring容器來完成,這樣做不僅是為了降低代碼的耦合度,而且可以利用Spring容器作為代理工廠實現代理。 2.整合目標 將Spring容器中的bean註入Action中,將Action的創建與管理工作交給Spring容器。 ...
  • 一 概述 1.整合目的 將所有對象的創建與管理任務交給Spring容器,降低程式的耦合度。 2.整合途徑 將Spring容器註入到Web容器中。 3.具體實現 使用ServletContextListener監聽ServletContext,當ServletContexxt創建時同時創建Spring ...
  • 經典數據集CIFAR-10,60000張32x32彩色圖像,訓練集50000張,測試集10000張。標註10類,每類圖片6000張。airplance、automobile、bird、cat、deer、dog、frog、horse、ship、truck。沒有任何重疊。CIFAR-100,100類標註 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...