TensorFlow中的一些細節

慣例首發在博客啦~

隨著TensorFlow學習的深入,有許多細節不得不注意,Stanford的tensorflow公開課就講解了很多細節,記錄於此,以供參考。

  1. tf.constant()和tf.Variable(),為什麼constant是小寫,Variable是大寫?因為constant是個op(操作節點),而Variable是個class(類)。
  2. Variable的initialize其實就是assign初始值,所以,當定義一個Variable時,如果緊跟了一個assign操作,其實是不用initialize的,例如W = tf.Variable(10), assign_op = W.assign(100), 我們可以直接sess.run(assign_op)而不用sess.run(tf.global_variables_initializer())。詳見源碼,其中有一句是:self._initializer_op = state_ops.assign(self._variable, self._initial_value, validate_shape=validate_shape).op。注意,類似tf.Variable.assign_add(), tf.Variable.assign_sub()之類的方法仍然要求對變數進行initialize,因為這些操作依賴Variable的初始值。
  3. constant是定義在graph(圖)中的,而Variable是和Session綁定的。也就是說,在tensorboard中可視化graph時,可以看到constant但是看不到variable,且不同的session可以維護一個variable的不同值,例如sess1 = tf.Session(), sess2 = tf.Session(), sess1.run(W.assign(10)), sess2.run(W.assign(20))
  4. 用另一個Variable初始化一個Variable時,要注意使用initialized_value()方法,例如W = tf.Variable(tf.truncated_normal([10,10])), U = tf.Variable(W2)是錯誤的,因為U使用W去初始化,在U初始化的時候,W很可能還沒有初始化(TensorFlow的分散式,並行運行的特點所導致),因此,正確寫法是W = tf.Variable(tf.truncated_normal([10,10])), U = tf.Variable(W.initialized_value())
  5. 不只有placeholder可以被feed,只要是feedable的tensor都可以,檢查一個tensor是不是feedable的可以使用方法:tf.Graph.is_feedable(sess.graph, tensor)
  6. 儘可能將graph definition和graph execute分離開,否則,會在execute的時候反覆向graph添加節點,導致graph過大。

推薦閱讀:

向量 L1 範數最小化問題?
深度學習如何優化神經網路結構?
目前火熱的Deep Learning會滅絕傳統的SIFT/ SURF的特徵提取的演算法嗎?
如何評價人們對電腦在圍棋上戰勝人類的時間預測?

TAG:TensorFlow | 深度学习DeepLearning |