常量、變量、占位符、會話是tensorflow編程的基礎也是最常用到的東西,tensorflow中定義的變量、常量都是tensor(張量)類型。
常量tf.constant()
tensorflow中定義的變量、常量都是tensor(張量)類型常用是在運行過程中不會改變的量,如作線性回歸Y = w*X + b ,知道一系列(X, Y) ,通過梯度下降找w和b,X和Y的值在程序運行時就不會去改變,只不斷改變w和b去減小與真實值的誤差,所以常量常用來表示輸入輸出。
聲明一個標量常量:
t_1 = tf.constant(5)
聲明一個向量常量:
t_2 = tf.constant([2, 3, 5])
變量tf.Variable()
作線性回歸時要不斷調整 w、b 做擬合,w和b就要聲明為變量,所以變量常用來表示模型中的參數。
聲明一個M行N列,全為零的變量:
b_1 = tf.Variable(tf.zeros([M, N], tf.float32)) # tf.zeros 創建全0張量,數字的類型是float32 ,然后用tf.Variable()將其變成變量
聲明一個呈正態分布的 均值是2(默認=0.0)標准差是4(默認是1.0)的2行3列張量:
w_1 = tf.Variable(tf.random_nomarl([2, 3], mean=2.0, stddev=4, seed=2)
會話Session()
如同main()函數一樣,會話是tensorflow程序的入口,tf 程序一般是先定義節點和節點的關系(運算),然后在會話中根據定義的運算自動算出結果 。
import tensorflow as tf a = tf.constant([1, 2]) b = tf.constant([2, 3]) # 定義常量a,b是1X2的張量 c = tf.add(a, b) # 定義 c=a+b d = tf.scalar_mul(tf.constant(2),c) # 定義 d=2*c with tf.Session() as sess: print(sess.run(d)) # 根據定義的運算(圖)計算 d 的值,並打印
第四行第五行定義c、d的運算,但是在那里並沒有直接得出c和d的結果,在會話中sess.run(d) 計算d ,它會自動根據前面定義好的運算計算出d的結果,而不需顯示的先計算c sess.run(c) 再計算d。如果在會話總只sess.run(c),程序就不會計算d了。
占位符tf.placeholder()
如名字一樣,占位符就是先給變量占一個位,可以先不給變量賦具體值,先給變量一個位置,在會話運行時給變量傳入具體的值。即占位符用於將數據提供給計算圖。
tf.placeholder(dtype,shape=None,name=None)
dtype是變量的數據類型,shape是變量的形狀(幾行幾列),name是變量的名稱。
import tensorflow as tf import numpy as np a = np.array([1, 2]) b = np.array([2, 3]) # 創建a,b兩個1x2的ndarry變量 X = tf.placeholder(tf.int32) Y = tf.placeholder(tf.int32) # 定義兩個占位符,張量形狀可以不寫,傳入值的時候會自動判斷 c = tf.add(X, Y) d = tf.scalar_mul(tf.constant(2),c) with tf.Session() as sess: re = sess.run(d, feed_dict={X:a, Y:b}) # 在圖計算時提供具體值 print(re)
會話在用feed_dict = { } 傳入值的時候傳入的不能是tf.constant()這種類型,必須是數組、np.ndarry等具體數值的類型。