1. 程式人生 > >tensorflow學習筆記(一)-基礎模型

tensorflow學習筆記(一)-基礎模型

  • Tensor

    tensor基本可以視作矩陣處理,如下面的程式碼就構造了一個1x2的0矩陣。

    import tensorflow as tf # 在下面所有程式碼中,都去掉了這一行,預設已經匯入
    a = tf.zeros(shape=[1,2])
  • Variable

    Variable表示變數,下面的程式碼就用最簡單的方式構建了一個Variable。

          W = tf.Variable(tf.zeros(shape=[1,2]))

    與Tensor不同,Variable必須初始化以後才能使用,

    tensor = tf.zeros(shape=[1,2])
    variable = tf.Variable(tensor)
    sess = tf.InteractiveSession()
    
    # print(sess.run(variable))  # 會報錯
    sess.run(tf.initialize_all_variables()) # 對variable進行初始化 print(sess.run(variable))
  • placeholder

    個人認為placeholder與Variable較為相似,區別在於placeholder常用來表示輸入及輸出,而Variable常用來表示中間變數。placeholder至少要求指定變數型別和shape。

    x = tf.placeholder(tf.float32,[1, 28*28])
    y = tf.placeholder(tf.float32,[None, 10])

    上面x中[1,28*28]表示輸入的資料有1行,每行有28x28個值。
    而y中出現了[None,10]

    這種語法,表示接受任意行數的資料,輸出為10個值。

  • Session

    上面構建的Tensor、Variable、placeholder都屬於抽象變數,需要通過Session控制模型執行(run)。

    Session非常重要,我在學習之初一直沒有找到程式碼到底在哪裡對model進行呼叫並更新值,直到後來偶然間發現通過session.run(model.something)就可以更新該目標及所有該目標所涉及到的值。假設有以下程式碼:

    class Model(object):
      def __init__(self, is_training, config, input_):
          self._input = input_
    
          batch_size = input_.batch_size
          num_steps = input_.num_steps
          size = config.hidden_size
          vocab_size = config.vocab_size
    
        # 一些相關設定
    output = tf.reshape(tf.concat(1, outputs), [-1, size]) softmax_w = tf.get_variable( "softmax_w", [size, vocab_size], dtype=data_type()) softmax_b = tf.get_variable("softmax_b", [vocab_size], dtype=data_type()) logits = tf.matmul(output, softmax_w) + softmax_b loss = tf.nn.seq2seq.sequence_loss_by_example( [logits], [tf.reshape(input_.targets, [-1])], [tf.ones([batch_size * num_steps], dtype=data_type())]) self._cost = cost = tf.reduce_sum(loss) / batch_size

    上面的程式碼可以構建一個抽象模型,但是他自己是無法主動執行的。必須在外部通過session.run()對其進行呼叫:

            cost=session.run(model._cost, feed_dict={})

    這個run要求更新_cost,而cost會涉及loss,loss又要用到logits等許多引數,所以model就會回溯更新所有用到的值,並且在最後將求得cost返回。

    每一次run都會更新相當多的引數,那麼如果我想獲得多個引數數值應該怎麼辦?我在一開始就犯了在一個迴圈中用run獲得多個引數值的錯誤,這樣就會導致引數重複更新。正確的解決方法是:

            fetches = {
                "cost": model.cost,
                "final_state": model.final_state,
                "input_data":model._input_data,
                "targets":model._targets,
            }
            vals = session.run(fetches, feed_dict)
    
            cost = vals["cost"]
            state = vals["final_state"]

    通過這種方式,就可以在一個run中獲取多個引數的值。

    注意到有一個feed_dict變數,這個就是要提供給模型的input,留意一下稍後介紹。

  • mnist程式碼示例

    本小節會涉及到一些softmax、交叉熵、梯度下降等知識,如有需要個人推薦憂達學城深度學習視訊結合書籍和網上資料的方式補充一下這些必要內容。

    mnist中每個圖片均為28x28,共有A-J10個分類。

    下面來演示如何用tf構造一個最簡單的LogisticRegression Classifier,基本公式為:

    t=Wx+b

    a=softmax(t)

    • 構建抽象模型

      
      # 建立抽象模型
      
      x = tf.placeholder(tf.float32, [None, 784]) # 輸入佔位符
      y = tf.placeholder(tf.float32, [None, 10])  # 輸出佔位符(預期輸出)
      
      W = tf.Variable(tf.zeros([784, 10]))        
      b = tf.Variable(tf.zeros([10]))
      a = tf.nn.softmax(tf.matmul(x, W) + b)      # a表示模型的實際預測輸出
      
      
      # 定義損失函式和訓練方法
      
      cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1])) # 損失函式為交叉熵
      optimizer = tf.train.GradientDescentOptimizer(0.5) # 梯度下降法,學習速率為0.5
      train = optimizer.minimize(cross_entropy)  # 訓練目標:最小化損失函式
      
      
      # 判斷a和y是否匹配,並計算accuracy
      
      correct_prediction = tf.equal(tf.argmax(a, 1), tf.argmax(y, 1))
      accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
      • x為輸入28*28特徵值,y為輸出的10種分類。
      • w和b要將輸入的28*28轉換為10種分類,利用softmax可以得到模型對某個圖片應該劃分哪個各類別的概率。
      • loss與交叉熵屬於套路,掌握即可。
      • 最後要判斷本次預測的精度,tf.argmax(a,1)可以找到各行a的最大值的index,將其與對應的y的index比較,得到一個Ture or False矩陣,代表本輪預測的正確與否,最後計算true的比例求得accuracy。
    • 開始訓練

      from tensorflow.examples.tutorials.mnist import input_data
      
      flags = tf.app.flags
      FLAGS = flags.FLAGS
      flags.DEFINE_string('data_dir', r'C:\Users\hasee\Desktop\tempdata', 'Directory for storing data') # data_dir表示資料存放路徑
      
      mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)   # 讀取資料集
      
      session=tf.InteractiveSession()
      tf.initialize_all_variables().run()
      
      
      # fetches在session要run多個值時會用到
      
      fetches={
        'step':train_step,
        'intermediate_accuracy':accuracy
      }
      begin_time=time()
      for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(1000)    # 獲得一批100個數據
        train_step.run({x: batch_xs, y: batch_ys})   # 給訓練模型提供輸入和輸出
        # session.run(train_step, {x: batch_xs, y: batch_ys}) # 和上面這句是等效的
      
        # 如果想要把模型的中間結果輸出看看,使用方法一。
        # 方法一:fetches為想要檢視的值,已經在外部定義。此方法在我的機器上耗時7.5s
        # vals=session.run(fetches, {x: batch_xs, y: batch_ys}) # 和上面這句是等效的
        # intermediate_accuracy=vals['intermediate_accuracy']
      
        # 方法二:分別run各值。這種方法在我的機器上耗時35s,而且在很多情況下會導致model不能正常執行(我學習時遇到的大坑之一)。
        # session.run(train_step, {x: batch_xs, y: batch_ys}) # 和上面這句是等效的
        # ans=session.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels})
      print(session.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels}))
      print(time()-begin_time)
      

      在model外部只需要為model提供資料並通過session讓model運作起來就可以了,模型會在執行時按照預設的程式碼完成求導、計算loss等操作並更新內部數值。最後輸出accuracy,約為0.92.

    • 完整程式碼:

      強烈建議和我一樣的初學者儘量透徹地理解這份程式碼的意義,然後將其裸寫一遍。之後無論是CNN還是LSTM都逃不開這種最基礎的建立模型、訓練模型的套路。

      
      # encoding:utf-8
      
      
      import tensorflow as tf
      
      
      # 建立模型
      
      x=tf.placeholder(tf.float32, [None, 28 * 28])
      y=tf.placeholder(tf.float32, [None, 10])
      
      w=tf.Variable(tf.zeros([28*28,10]))
      b=tf.Variable(tf.zeros([10]))
      a=tf.nn.softmax(tf.matmul(x, w) + b)
      
      cross_entropy=tf.reduce_mean(-tf.reduce_sum(y * tf.log(a), reduction_indices=[1]))
      optimizer=tf.train.GradientDescentOptimizer(0.5)
      train_step=optimizer.minimize(cross_entropy)
      
      correct_prediction=tf.equal(tf.argmax(a,1), tf.argmax(y, 1))
      accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
      
      
      # 輸入資料,呼叫模型
      
      
      from tensorflow.examples.tutorials.mnist import input_data
      from time import time
      
      flags = tf.app.flags
      FLAGS = flags.FLAGS
      flags.DEFINE_string('data_dir', r'C:\Users\hasee\Desktop\tempdata', 'Directory for storing data') # 把資料放在/tmp/data資料夾中
      
      mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)   # 讀取資料集
      
      session=tf.InteractiveSession()
      tf.initialize_all_variables().run()
      
      fetches={
          'step':train_step,
          'intermediate_accuracy':accuracy
      }
      begin_time=time()
      for i in range(1000):
          batch_xs, batch_ys = mnist.train.next_batch(1000)    # 獲得一批100個數據
          train_step.run({x: batch_xs, y: batch_ys})   # 給訓練模型提供輸入和輸出
          # session.run(train_step, {x: batch_xs, y: batch_ys}) # 和上面這句是等效的
      
          # 如果想要把模型的中間結果輸出看看,使用方法一。
          # 方法一:fetches為想要檢視的值,已經在外部定義。此方法在我的機器上耗時7.5s
          # vals=session.run(fetches, {x: batch_xs, y: batch_ys}) # 和上面這句是等效的
          # intermediate_accuracy=vals['intermediate_accuracy']
      
          # 方法二:分別run各值。這種方法在我的機器上耗時35s,而且在很多情況下會導致model不能正常執行(我學習時遇到的大坑之一)。
          # session.run(train_step, {x: batch_xs, y: batch_ys}) # 和上面這句是等效的
          # ans=session.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels})
      print(session.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels}))
      print(time()-begin_time)

相關推薦

tensorflow學習筆記()-基礎模型

Tensor tensor基本可以視作矩陣處理,如下面的程式碼就構造了一個1x2的0矩陣。 import tensorflow as tf # 在下面所有程式碼中,都去掉了這一行,預設已經匯入 a = tf.zeros(shape=[1,2]) Variable Variable表示變數,下面的程式碼

Chef學習筆記()--基礎知識與安裝配置

Chef 概念 安裝 配置 示例 通常Chef由三部分組成:Workstation、Chef Server、Chef Node。 Workstation是進行日常工作的機器,需安裝Chef Development Kit,用來編寫cookbooks,管理Chef Server和Node。

tensorflow學習筆記----------tensorflow安裝

all python 出現 版本 install chan highlight clas sta 2016年11月30日,tensorflow(https://www.tensorflow.org/)更新了0.12版本,這標誌著我們終於可以在windows下使用te

tensorflow學習筆記

系統架構 運算 正常的運算 t=7+8 print(t) tensorflow計算方式好像不太一樣,需要先寫好資料流圖,需要用session去執行這個圖, import tensorflow as tf import os os.environ['TF_C

Tensorflow學習筆記:VGG16模型——Finetuning,貓狗大戰,VGGNet的重新針對訓練

這一篇介紹一下VGG16模型的修改 Step 1: 對模型的修改 首先是對模型的修改(VGG16_model.py檔案),在這裡原先的輸出結果是對1000個不同的類別進行判定,而在此是對2個影象,也就是貓和狗的判斷,因此首先第一步就是修改輸出層的全連線資料。

深度學習框架Tensorflow學習筆記()

1.需要在會話中完成op 2.初始化操作 init = tf.global_variables_initializer() 3.fetch run多個op print(sess.run([mul,add])) 4.placeholder + feed_dict 

springboot學習筆記():基礎程式和配置

1 , springboot 介紹(來自百度百科) 簡介 微服務是一個新興的軟體架構,就是把一個大型的單個應用程式和服務拆分為數十個的支援微服務。一個微服務的策略可以讓工作變得更為簡便,它可擴充套件單個元件而不是整個的應用程式堆疊,從而滿足服務等級協議。

Tensorflow學習筆記()環境配置

目標:完成tensorflow的環境配置 寫在前面:第一次構建神經網路,本來想用Tensorflow的……但是Windows上使用Tensorflow需要用Docker,然後在使用過程中掛載磁碟一直報錯(mount:permission denied)…

TensorFlow學習筆記(1)-基礎筆記

文章目錄 1. 計算圖的概念 2. 常量與變數 3. 互動式使用 4. Fetch & Feed 參考資料: 1. 計算圖的概念   TensorFlow

Python的學習筆記()(基礎)

* Base* 1.Python的輸出是print 2.Python的字串連線符是”,”.該符號還會自動新增一個空格 3.Python的註釋符是:”#” 4.Python的轉義: \n 表示換行 | \t 表示一個製表符 | \ 表示 \ 字元本

tensorflow學習筆記tensorflow實現卷積部分常用函式

1. Z1=tf.nn.conv2d(X,W1, strides = [1,1,1,1], padding = 'SAME')tf.nn.conv2d(input,filter,strides, padding, use_cudnn_on_gpu=None, name=Non

Tensorflow學習筆記基礎篇(7)——Mnist手寫集改進版(Tensorboard視覺化)

Tensorflow學習筆記:基礎篇(7)——Mnist手寫集改進版(Tensorboard視覺化介面) 前序 — 前文中,我們在三層全連線神經網路中使用了學習率隨迭代次數增加而逐漸衰減的AdamOptimizer優化器來完成MNIST資料的分類問題,最

TensorFlow學習筆記[]—— 填充張量函式 tf.pad 解析

函式的作用:對張量按照你的需求進行填充函式原型:pad( tensor, paddings, mode='CONSTANT', name=None )引數說明:tensor: A 'Tensor'. #tensor是要填充的張量;

TensorFlow學習筆記)-- Softmax迴歸模型識別MNIST

最近學習Tensorflow,特此筆記,學習資料為21個專案玩轉深度學習 基於TensorFlow的實踐詳解 Softmax迴歸是一個線性的多分類模型,它是從Logistic迴歸模型轉化而來的,不同的是Logistic迴歸模型是一個二分類模型,而Softmax迴歸模型是一個多分類模型

Tensorflow學習筆記)--變數作用域與模型載入

1、變數作用域機制主要由兩個函式實現: tf.get_variable(<name>, <shape>, <initializer>) tf.variable_scope(<scope_name>) 2、常用的initial

tensorflow學習筆記:用別人訓練好的模型來進行影象分類

谷歌在大型影象資料庫ImageNet上訓練好了一個Inception-v3模型,這個模型我們可以直接用來進來影象分類。下載完解壓後,得到幾個檔案:其中的classify_image_graph_def.pb 檔案就是訓練好的Inception-v3模型。imagenet_sy

Tensorflow學習筆記):基礎知識

博主準備開始學習Tensorflow,將自己學到的東西總結出來,既能夠加深記憶,並且便於複習,如果能夠幫助到別人那更是再好不過了。 隨著深度學習的快速發展,深度學習工具也有很多。主流的深度學習框架包括Tensorflow,Caffe,Theano,Torch等

HTML學習筆記 w3sCss盒子模型應用 第十節 (原創)

.com foo margin images href ack har htm com <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &l

FPGA軟硬協同設計學習筆記基礎知識(

擴展性 產生 新的 pll 多個 分配 每次 調用 span 一、FPGA軟件硬件協同定義: 軟件:一般以軟件語言來描述,類似ARM處理器的嵌入式設計。硬件定義如FPGA,裏面資源有限但可重配置性有許多優點,新的有動態可充配置技術。

Scala學習筆記基礎語法,條件控制,循環控制,函數,數組,集合

new 增強 指定位置 因此 手動 tex class break 減少 前言:Scala的安裝教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基礎語法學習筆記: 1:聲明val變量:可以使用va