Python之TensorFlow的基本介紹-1


  一、TensorFlow™是一個基於數據流編程(dataflow programming)的符號數學系統,被廣泛應用於各類機器學習(machine learning)算法的編程實現,其前身是谷歌的神經網絡算法庫DistBelief。

  TensorFlow:
        神經網絡(深度)
            圖像:卷積神經網絡
            自然語言處理:循環神經網絡
        特點:
            引入各種計算設備(CPU/GPU/TPU),以及能夠很好的運行在移動端。
            合理的C++使用界面,易用的Python使用界面來構造個執行你的graphs,可以直接寫Python/C++程序
            采用數據流圖(data flow graphs),用於數值計算的開源庫,能夠靈活的組裝圖,執行圖
            谷歌支持,希望成為通用語言
        前后端系統:
            前端系統:定義程序圖的機構
            后端系統:運算圖結構
        會話:
            1、運算圖的結構
            2、分配資源計算
            3、掌握資源(變量的資源,隊列,線程)

  二、前面我們已經介紹了TensorFlow在人工智能領域所能做的事情了,下面會主要介紹TensorFlow的一些常用概念。

  1)張量(tensor):

  tensor(張量):
        一個類型化的N維數組
        三部分:
            名字、形狀、數據類型
        階:和數組的維度類似
        屬性:
            graph:張量的默認圖
            op:張量的操作名
            name:張量的字符串描述
            shape:張量的形狀
        動態形狀和靜態形狀:
            動態形狀:(動態形狀,創建一個新的張量並且數據量大小不變)
                一種描述原始張量在執行過程中的一種形狀(動態變化)
                tf.reshape(和numpy類似),創建一個具有不同形態的新張量
            靜態形狀:(靜態形狀,一旦張量固定,不能再次設置靜態形狀,不能誇維度修改)
                創建一個張量,初始的形狀
                tf.get_shape():獲取靜態形狀
                tf.set_shape():更新對象的靜態形狀。通常用於不能推斷的情況下
        張量操作:
            固定值張量:
                tf.zeros(shape, dtype, name)
                tf.ones()
                tf.constant()
            隨機張量:(正太分布)
                tf.random_normal(shape, mean, stddev, dtype, seed, name)
                mean: 平均值
                stddev: 標准差
            類型變換:
                tf.cast(x, dtype, name)
            形狀變換:
                tf.reshape() tf.get_shape() tf.set_shape()
            切片與擴展:
                tf.concat(values, axis, name)
        google提供的數據運算:
            地址:https://tensorflow.google.cn/api_docs/python/tf/math

  

  2)變量(Variable):

  變量:
        也是一種op,是一種特殊的張量,能夠進行儲存持久化,它的值就是張量,默認被訓練 tf.Variable(initial_value, name, trainable)
        注:
            1、變量op能夠持久化保存,普通張量不行
            2、當定義一個變量op的時候,一定要在會話中取運行初始化
            3、name參數:在tensortboard使用的時候展示名字,可以讓相同op名字進行區分

  3)數據流圖(Graph):

數據流圖:
        tensor:張量(numpy中的數組,ndarray類型然后封裝為tensor),簡而言之,就是數組
        operation(op):專門運算的操作節點,所有操作都是一個op
        圖:你的這個程序架構
        會話:運算程序的圖

  這里介紹了上面張量和變量的OP解釋。

  

  4)會話(Session):

  構建tf.Graph時將節點和邊緣對象加入圖中不會觸發計算,圖構建完成后將計算部分分流給tf.Session實現計算

  tf.Session擁有物理資源,通常與Python的with代碼塊中使用,在離開代碼塊后釋放資源 。在不使用with代碼塊的情況下創建tf.Session,應在完成會話時明確調用tf.Session.close結束進程。

  調用Session.run創建的中間張量會在調用結束時或結束之前釋放。tf.Session.run是運行節點對象和評估張量的主要方式,tf.Session.run需要指定fetch並提供供給數據(feed)字典,用戶也可以指定其它選項以監督會話的運行。

  5)可視化(tensorboard):

  可視化tensorboard:
        通過讀取TensorFlow事件文件來運行
        tf.summary.FileWriter(path, graph)
        讀取(cmd中執行):tensorboard --logdir "path"

  

 

 

 

  

  三、簡單的例子

import tensorflow as tf

a = tf.constant(5.0)
b = tf.constant(4.0)

sum = tf.add(a, b)

# 默認的這張圖,相當於一塊內存
graph = tf.get_default_graph()
print(graph)

# 只能運行一個圖
with tf.Session() as sess:
    print(sess.run(sum))

# 圖的創建
# 創建一張圖包含了一組op和tensor,上下文環境
# op:只要使用tensorflow的api定義的函數都是op
# tensor:指數數據
g = tf.Graph()
with g.as_default():
    c = tf.constant(12.0)
    # 有重載機制(默認給運算符重載成op類型)
    d = c + 1.0
print(g)

# 可以在會話中指定運行
# config:
#   log_device_placement: 查看運行設備信息
with tf.Session(graph=g, config=tf.ConfigProto(log_device_placement=True)) as sess:
    print(sess.run(c))
    # eval:只有在會話上下文才可以使用
    print(d.eval())

    # 占位符
    plt = tf.placeholder(tf.float32, [None, 3])
    print(plt)
    # 靜態形狀,一旦張量固定,不能再次設置靜態形狀,不能誇維度修改
    plt.set_shape([2, 3])
    print(plt)
    # 動態形狀,創建一個新的張量並且數據量大小不變
    plt_reshape = tf.reshape(plt, [3,2])
    print(plt_reshape)

    print(sess.run(plt, feed_dict={plt: [[1,2,3], [4,5,6]]}))

    print("*" * 20)
    print(d.graph)
    print("-" * 20)
    print(d.op)
    print("-" * 20)
    print(d.name)
    print("-" * 20)
    # 形狀表示維度大小,如果是()表示0維,?代表不確定
    print(d.shape)
    print("*" * 20)


# 變量
e = tf.constant(1.0, name="e")
f = tf.constant(2.0, name="f")
g = tf.add(e, f, name="g")
var = tf.Variable(tf.random_normal([2,3], mean=0, stddev=1), name="var")
print(e)
print(var)

# 初始化所有變量的op
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    # 必須初始化op,才可運行
    sess.run(init_op)
    # tensorboard 寫入
    tf.summary.FileWriter("tmp/summary/test", graph=sess.graph)
    print(sess.run([g, var]))

  結果

<tensorflow.python.framework.ops.Graph object at 0x0000020B45A05B38>
9.0
<tensorflow.python.framework.ops.Graph object at 0x0000020B58472940>
Device mapping: no known devices.
add: (Add): /job:localhost/replica:0/task:0/cpu:0
add/y: (Const): /job:localhost/replica:0/task:0/cpu:0
Const: (Const): /job:localhost/replica:0/task:0/cpu:0
12.0
13.0
Tensor("Placeholder:0", shape=(?, 3), dtype=float32)
Tensor("Placeholder:0", shape=(2, 3), dtype=float32)
Tensor("Reshape:0", shape=(3, 2), dtype=float32)
[[1. 2. 3.]
 [4. 5. 6.]]
********************
<tensorflow.python.framework.ops.Graph object at 0x0000020B58472940>
--------------------
name: "add"
op: "Add"
input: "Const"
input: "add/y"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}

--------------------
add:0
--------------------
()
********************
Tensor("e:0", shape=(), dtype=float32)
Tensor("var/read:0", shape=(2, 3), dtype=float32)
[3.0, array([[-0.24931028,  0.10012802, -0.8845826 ],
       [-0.08898215, -0.87531203, -0.5762032 ]], dtype=float32)]

  四、TensorFlow總體上面還是非常靈活的,采用數據流圖的方式,提前配置好關系圖,在通過數據傳入的方式來進行下一步的運算。

    通過會話的方式來進行資源等的控制,減少人為的造成的問題。

    總體而言,TensorFlow的靈活度以及適用性還是很不錯的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM