TensorFlow—上手篇

TensorFlow—上手篇

1,關於import tensorflow的報錯問題:

在這裏插入圖片描述

根據顯示的文件路徑找到相應的文件,採用sublime_text編輯(因爲用這個可以看到行號,用其他的文本編輯也可以顯示行號找到對應位置即可),找到行號爲523的位置,將如下內容:

_np_qint8 = np.dtype([(“qint8”, np.int8, 1)])

修改爲:

_np_qint8 = np.dtype([(“qint8”, np.int8, (1,))])

2,關於tensorflow的結構概念問題:

定義如下:

​  使用圖(graphs)來表示計算任務

​  在被稱之爲會話(Session)的上下文(context)中執行圖

​  使用tensor表示數據

​  通過變量(Variable)維護狀態

​  使用feed和fetch可以爲任意的操作賦值或者從其中獲取數據

​ tensorflow主要由4個部分組成,Tensor數據層,variable變量層,operation操作層,以上三層組合爲graph,最後將graph封裝在Session圖中。

在這裏插入圖片描述

具體的栗子如下:

​ 構造2個矩陣作爲tensor層,乘法作爲操作層,結果的計算作爲graph,用默認的Session圖封裝並調用。

#導入tensorflow庫
import tensorflow as tf
#定義2個矩陣作爲tensor數據層
m1=tf.constant([[2,3]])
m2=tf.constant([[2],[3]])
#調用matmul作爲operation操作層,並且pro作爲gragh
pro=tf.matmul(m1,m2)
#採用Session默認圖,通過ss封裝並調用graph(pro)
with tf.Session() as ss:
    res=ss.run(pro)
    print(res)

最終顯示結果爲:

​ [[13]]

3,關於Variable的語法問題:

1.如何進行variable的賦值?

​ 採用tensorflow.Variable()賦值:

import tensorflow as tf
#定義一個自變量x1
x1=tf.Variable([2,3])
#定義一個常量m1
m1=tf.constant([2,3])
#定義一個op減法
op1=tf.subtract(x1,m1)
#定義一個op加法
op2=tf.add(x1,op1)
#初始化全局變量
init=tf.global_variables_initializer()
#使用默認圖Session()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(op1))
    print(sess.run(op2))

​ 顯示結果爲:

​ [0 0] [2 3]

2.使用tensorflow實現累加操作?

​ 採用tensorflow.assign()進行賦值更新操作:

#實現0~5的自加
x2=tf.Variable(0)
m2=tf.constant(1)
res=tf.add(x2,m2)
#使用assign()進行賦值的更新
update=tf.assign(x2,res)
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for _ in range(5):
        sess.run(update)
        print(sess.run(x2))

​ 顯示結果爲:

​ 1 2 3 4 5

3.思考題?

​ 如果將print(sess.run(x2))改爲print(sess.run(res)),或者print(sess.run(update))的顯示結果是什麼?

​ print(sess.run(res))的顯示結果爲:2 3 4 5 6

​ 原因在於:每次多加了一個m2。

​ print(sess.run(update))的顯示結果爲:2 4 6 8 10

​ 原因在於:每次多加了一個m2的基礎上還多加了之前上一輪的x2。

4,fetch和feed是什麼東西?

​ fetch,主要用於一次運行多個op:

在這裏插入圖片描述

​ 而feed是什麼呢?

​ feed,用於在調用graph時再向op輸入實參,與fetch需要提前輸入實參不同:

#fetch
in1=tf.placeholder(tf.int32)
in2=tf.placeholder(tf.int32)
op1=tf.multiply(in1,in2)
#init=tf.global_variables_initializer()
with tf.Session() as sess:
    #sess.run(init)
    #feed數據以字典形式傳入
    print(sess.run(op1,feed_dict={in1:21,in2:23}))

4,如何寫一個簡單的二次函數訓練模型?

​ 1.原始數據x_data採用numpy.random.rand()隨機生成。

​ 2.y_data採用自定義(得到精準的k,b),以及對k,b進行變量類型的定義。

​ 3.寫出預測值y,k,b,x_data之間的函數關係式。

​ 4.定義損失代價函數loss。

​ 5.定義梯度下降優化器,設置學習率(0<學習率<1)。

​ 6.最小化代價函數optimizer.minimize(loss)。

​ 7.初始化全局變量,k和b。

​ 8.使用默認圖Session(),調用graph成員cost,進行重複訓練。

​ 9.每訓練30次,打印k和b,以及loss的值。

#梯度下降訓練線性模型
x_data=np.random.rand(100)
y_data=0.1*x_data*x_data+0.2
k=tf.Variable(0.)
b=tf.Variable(0.)
y=k*x_data*x_data+b
#定義二次損失代價函數
loss=tf.reduce_mean(tf.square(y-y_data))
#定義優化器
optimizer=tf.train.GradientDescentOptimizer(0.3)#0.3作爲梯度下降的學習率
#最小化代價函數
cost=optimizer.minimize(loss)
#初始化變量
init=tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for _ in range(300):
        sess.run(cost)
        if _%30==0:
            print(_,sess.run([k,b,loss]))

訓練結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章