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]))
訓練結果如下: