TensorFlow(一)

一  基本概念:

  

Tensorflow是一個計算密集型的編程系統,使用圖(graphs)來表示計算任務,圖(graphs)中的節點稱之爲op(operation),一個op得到0個或多個Tensor,執行計算,產生0個或多個Tensor。 Tensor 看做是一個 n 維的數組或列表。圖必須在會話(Session)裏被啓動html

 

使用圖(graphs)來表示計算任務
在被稱之爲會話(Session)的上下文(context)中執行圖
使用tensor表示數據
經過變量(Variable)維護狀態
使用feed和fetch能夠爲任意的操做賦值或者從其中獲取數據
python

 

Tensorflow結構 
linux

 

 二 安裝:

ubantu  py3.5版:

 CPU版本:編程

pip install http://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp35-cp35m-linux_x86_64.whlapi

Windows  在有 安裝Anaconda的狀況下

 CPU版本:數組

  pip install --upgrade --ignore-installed tensorflow瀏覽器

 

三  初識tensorflow   (如下內容都基於1.0版本,不一樣版本會有些差別)

  一、圖

  圖默認已經註冊,一組表示 tf.Operation計算單位的對象和tf.Tensor 表示操做之間流動的數據單元的對象session

  獲取默認圖:app

tf.get_default_graph()

  建立新圖並使用:dom

g = tf.Graph()

with g.as_default():#在上下文管理器(with模塊)中,g做爲默認圖
  a
= tf.constant(1.0)

 

  二、會話

  運行TensorFlow操做圖的類,使用默認註冊的圖(能夠指定運行圖)

  會話可能擁有不少資源,如 tf.Variable,tf.QueueBase 和tf.ReaderBase,會話結束後須要進行資源釋放(能夠用with上下文管理器實現)

  會話運行後返回值異常:     RuntimeError:若是它Session處於無效狀態(例如已關閉)。

             TypeError:若是fetches或feed_dict鍵是不合適的類型。

              ValueError:若是fetches或feed_dict鍵無效或引用 Tensor不存在

  Tensorflow 中Feed操做(佔位):

    意義:在程序執行的時候,不肯定輸入的是什麼,提早「佔個坑」

    語法:placeholder提供佔位符,run時候經過feed_dict指定參數

    例:

import tensorflow as tf
val1 = tf.placeholder(tf.float32)
val2 = tf.placeholder(tf.float32)
sum = tf.add(val1, val2)
with tf.Session() as sess:
    print(sess.run(sum,feed_dict={val1:1.0, val2:2.0}))

 

  三、張量

    張量是Tensorflow基本的數據格式, 有三部分:形狀,數據類型,名字

    張量的階:

    

    張量的數據類型:

    

    張量的屬性:  graph(張量所屬的默認圖)    op(張量的操做名)    name(張量的字符串描述)   shape(張量形狀)

    張量的動態形狀與靜態形狀:

    靜態形狀: 建立一個張量或者由操做推導出一個張量時,初始狀態的形狀

     tf.Tensor.get_shape:獲取靜態形狀

     tf.Tensor.set_shape():更新Tensor對象的靜態形狀,一般用於在不能直接推 斷的狀況下

    注意:

      一、轉換靜態形狀的時候,遵循1-D到1-D,2-D到2-D的規則,不能跨階數改變形狀

      二、 對於已經固定或者設置靜態形狀的張量/變量,不能再次設置靜態形狀

    動態形狀: 一種描述原始張量在執行過程當中的一種形狀

    tf.reshape:改變原來的形狀建立一個具備不一樣動態形狀的新張量

    注意:

       一、tf.reshape()動態建立新張量時,元素個數須要和改變前的個數匹配

    生成張量:

    tf.random_normal(shape,mean=0.0, stddev=1.0,dtype=tf.float32,seed=None,name=None)   (經常使用)

    tf.zeros(shape,dtype=tf.float32,name=None)

    tf.ones(shape,dtype=tf.float32,name=None)

    tf.constant(value,dtype=None,shape=None,name="Const")

    ... ...

    詳細的能夠參考API(中文):http://wiki.jikexueyuan.com/project/tensorflow-zh/api_docs/python/index.html

 

    張量的轉換(經常使用):

    tf.String_to_number(string_tensor,out_type=None,name=None)

    tf.cast(x, dtype, name=None)

    tf.shape(input, name=None)

    tf.reshape(tensor, shape, name=None)

    ... ...

    張量的拓展:

    tf.concat(values, axis, name='concat')

 

  四、變量

      變量也是一種OP,是一種特殊的張量,可以進行存儲持久化,它的 值就是張量

    1)、變量的建立

      tf.Variable(initial_value=None,name=None) 建立一個帶值initial_value的新變量    name屬性表示變量名字

      assign(value) 爲變量分配一個新值 返回新值

      eval(session=None) 計算並返回此變量的值

    2)、變量的初始化

      tf.global_variables_initializer()

    3)、變量的做用域

      做用 : 讓模型代碼更加清晰,做用分明, 在tensorboard中更易閱讀

      建立:

       tf.variable_scope(<scope_name>)建立指定名字的 變量做用域

    如: 

with tf.variable_scope("train"):
    '''
  做用域內的代碼
  '''

 

  五、可視化學習Tensorboard

    TensorBoard 經過讀取 TensorFlow 的數據序列化-events文件來運行

   在程序中加入代碼:

      tf.summary.FileWriter('路徑', graph= 想可視化的圖)       返回filewriter,寫入事件文件到指定目錄(最好用絕對路徑),以提供給tensorboard使用

   在命令行開啓:

       tensorboard --logdir=/tmp/tensorflow/summary/test/

   通常瀏覽器打開爲127.0.0.1:6006

   注:修改程序後,再保存一遍會有新的事件文件,打開默認爲最新

   tensorboard中,圖的符號意義:

    

   在tensorboard中顯示變量的變化:

    一、收集變量: tf.summary.scalar(name=’’,tensor) 收集對於損失函數和準確率 等單值變量,name爲變量的名字,tensor爲值

          tf.summary.histogram(name=‘’,tensor) 收集高維度的變量參數         

          tf.summary.image(name=‘’,tensor) 收集輸入的圖片張量能顯示圖片

    二、合併變量寫入事件文件:merged = tf.summary.merge_all()

    三、運行合併:summary = sess.run(merged),每次迭代都需運行

    四、添加:FileWriter.add_summary(summary,i),i表示第幾回的值

 

  六、模型保存和加載

    建立一個Saver對象(假設返回saver,用於模型保存和加載):

      tf.train.Saver(var_list=None,max_to_keep=5)  其中:

        var_list:指定將要保存和還原的變量。它能夠做爲一個 dict或一個列表傳遞.

        max_to_keep:指示要保留的最近檢查點文件的最大數量。 建立新文件時,會刪除較舊的文件。若是無或0,則保留全部 檢查點文件。默認爲5(即保留最新的5個檢查點文件。)

    保存模型:

    saver.save(sess,"保存模型的路徑(本身指定目錄便可)"

    保存文件格式:checkpoint文件

    加載模型:

    saver.restore(sess,"保存模型的路徑(和上面的路徑一致)"

 

  七、自定義命令行參數

     一、tf.app.flags,它支持應用從命令行接收參數,能夠用來指定集羣配置等.在它下面有各類定義參數的類型:

      DEFINE_string(flag_name, default_value, docstring)

      DEFINE_integer(flag_name, default_value, docstring)

      DEFINE_boolean(flag_name, default_value, docstring)

      DEFINE_float(flag_name, default_value, docstring)

    二、tf.app.flags.,在flags有一個FLAGS標誌,它在程序中能夠調用到咱們 前面具體定義的flag_name

    三、經過tf.app.run()啓動main(argv)函數

  八、用以上知識實現一個簡單的線性迴歸案例

def mylinearregression():
    """
    自實現線性迴歸
    :return: None
    """
    with tf.variable_scope("data"):  #做用域
        # 手動建立訓練數據
        # x表示訓練數據的特徵  有100個樣本,1個特徵   
        X = tf.random_normal([100, 1], mean=0.0, stddev=1.0, name="X")    #生成一組服從標準正太分佈的數據
        # y_true表示訓練數據的標籤,   跟x是線性關係
        y_true = tf.matmul(X, [[0.7]]) + 0.8

    with tf.variable_scope("model"):   #做用域
        # 創建模型
        # 由準備的數據(x是100行1列的數據,y_true也是100行1列的數據)能夠看出,權重是 1行1列的數據
        weights = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="weights")
        bias = tf.Variable(0.0)
        # 得出預測值
        y_predict = tf.matmul(X, weights) + bias

    with tf.variable_scope("Optimize"):   #做用域
        # 計算真實值與預測值之間的均方偏差(損失函數)
        loss = tf.reduce_mean(tf.square(y_true - y_predict))   #tf.square求方差  tf.reduce_mean求均值

        # 梯度降低優化偏差,指定學習率,返回一個梯度降低優化器
        train_op = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

    # 收集變量
    tf.summary.scalar("loss", loss)
    tf.summary.scalar("bias", bias)

    tf.summary.histogram("weight", weights)

    # 定義初始化變量OP
    init_op = tf.global_variables_initializer()

    # 定義一個合併變量的OP
    merged = tf.summary.merge_all()

    # 建立一個Saver
    saver = tf.train.Saver()

    # 開啓會話
    with tf.Session() as sess:
        # 運行初始化
        sess.run(init_op)

        # 打印一下初始化隨機的權重和偏置
        print("隨機初始化的權重爲%f,偏置爲%f" % (weights.eval(), bias.eval()))

        # 建立事件文件
        filewriter = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph) #此路徑只須指定目錄且目錄存在

        # 加載模型
        if os.path.exists("./tmp/ckpt/checkpoint"):  #此路徑中目錄與模型保存的目錄一致,文件名固定爲checkpoint 
            saver.restore(sess, "./tmp/ckpt/regressionmodel")#此路徑與模型保存的路徑一致

        # 循環優化, 30是指定訓練的步數(可更改)
        for i in range(30):
            # 運行優化
            sess.run(train_op)

            # 運行合併結果
            summary = sess.run(merged)

            # 寫入變量結果
            filewriter.add_summary(summary, i)

            print("訓練第%d次的結果:權重爲%f,偏置爲%f" % (i, weights.eval(), bias.eval()))
     # 保存模型 saver.save(sess,
"./tmp/ckpt/regressionmodel")#路徑中的目錄路徑須存在,且要指定文件名稱
return None 

 

# 自定義命令行參數
tf.app.flags.DEFINE_string("data_home", "./data/", "訓練數據來源")
tf.app.flags.DEFINE_integer("max_step", 10000, "訓練步數")

FLAGS = tf.app.flags.FLAGS

def main(argv):
    print(argv)
    print(FLAGS.data_home)
    print(FLAGS.max_step)

if __name__ == "__main__":
    tf.app.run()                        
相關文章
相關標籤/搜索