sess.run()详解
TensorFlow與我們正常的編程思維略有不同:
- 先預定義一些操作/占位符構建graph,所有的操作op和變量都視為節點,TensorFlow中的語句不會立即執行;
- 當構建完graph圖后,需要在一個session會話中啟動圖,啟動的第一步是創建一個Session對象。
- 等到開啟會話session的時候,才會執行session.run()中的語句。在執行session.run()時,tensorflow并不是計算了整個圖,只是計算了與想要fetch的值相關的部分。
創建session對象
tf.compat.v1.Session(
target=’’, graph=None, config=None
)
會話可能擁有資源,當不再需要這些資源時,釋放這些資源很重要。為此,要么調用tf.Session.close會話上的方法,要么將會話用作上下文管理器。下面兩個例子是等價的:
# Using the `close()` method. sess = tf.compat.v1.Session() sess.run(...) sess.close() #關閉此會話# Using the context manager. with tf.compat.v1.Session() as sess:sess.run(...)Session對象的方法run()
run(fetches, feed_dict=None, options=None, run_metadata=None)
參數:
- fetches:可以是list或者tensor向量
- feed_dict:以字典的方式填充占位
返回值: sess.run()可以將tensor格式轉成numpy格式,在python語言中,返回的tensor是numpy ndarray對象。
feed_dict 作用
feed_dict只在調用它的方法內有效,方法結束,feed_dict就會消失。
替換graph中的某個tensor
feed_dict使用一個值臨時替換一個 op 的輸出結果
a = tf.add(2, 5) b = tf.multiply(a, 3) with tf.Session() as sess: sess.run(b, feed_dict = {a:15}) # 重新給a賦值為15 運行結果:45sess.run(b) #feed_dict只在調用它的方法內有效,方法結束,feed_dict就會消失。 所以運行結果是:21設置graph的輸入值
feed_dict可以給使用placeholder創建出來的tensor賦值
# 使用tf.placeholder()創建占位符 ,在session.run()過程中再投遞數據 x = tf.placeholder(tf.float32, shape=(1, 2)) #設置矩陣x,用占位符表示 w1 = tf.Variable(tf.random_normal([2, 3],stddev=1,seed=1)) w2 = tf.Variable(tf.random_normal([3, 1],stddev=1,seed=1))# 創建op, 設置矩陣相乘 a = tf.matmul(x,w1) y = tf.matmul(a,w2)# 啟動graph,運行op with tf.Session() as sess:# 對變量進行初始化,變量運行前必須做初始化操作sess.run(tf.global_variables_initializer())# 使用feed_dict將數據投入到y中print(sess.run(y, feed_dict={x:[[0.7, 0.5]]})) #運行結果: [[3.0904665]]注意:此時的x是一個占位符(placeholder)。我們定義了它的type和shape,但是并沒有具體的值。在后面定義graph的代碼中,placeholder看上去和普通的tensor對象一樣。在運行程序的時候我們用feed_dict的方式把具體的值提供給placeholder,達到了給graph提供input的目的。
placeholder有點像在定義函數的時候用到的參數。我們在寫函數內部代碼的時候,雖然用到了參數,但并不知道參數所代表的值。只有在調用函數的時候,我們才把具體的值傳遞給參數。
總結
以上是生活随笔為你收集整理的sess.run()详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow函数方法
- 下一篇: angular创建组件命令