惯例首发在博客啦~
随着TensorFlow学习的深入,有许多细节不得不注意,Stanford的tensorflow公开课就讲解了很多细节,记录于此,以供参考。
- tf.constant()和tf.Variable(),为什么constant是小写,Variable是大写?因为constant是个op(操作节点),而Variable是个class(类)。
- 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的初始值。
- 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))
- 用另一个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())
- 不只有placeholder可以被feed,只要是feedable的tensor都可以,检查一个tensor是不是feedable的可以使用方法:tf.Graph.is_feedable(sess.graph, tensor)
- 尽可能将graph definition和graph execute分离开,否则,会在execute的时候反复向graph添加节点,导致graph过大。