最近在复现各种代码时候,遇到了版本不匹配问题。每次新建环境太久了,就开始改代码。这里总结一下有哪些点可以改。
从 TensorFlow 1 到 TensorFlow 2 迁移时,TensorBoard 的使用方式也发生了一些变化。这主要是因为 TensorFlow 2 强调更简单和更直观的 API,以及默认启用的 Eager Execution 模式。下面是一些主要的改变和你需要注意的点:
1. Eager Execution 默认启用
TensorFlow 2 默认启用 Eager Execution,这意味着运算会立即执行并返回结果,不再需要在一个会话中手动运行 tf.Session()
。这简化了很多开发流程,包括在 TensorBoard 中记录数据。
2. API 更新
- Summary 写入器:
tf.summary.FileWriter
被替换为tf.summary.create_file_writer
,这是 TensorFlow 2 中创建写入器的方式。 - 记录标量和其他摘要:TensorFlow 1 中的
tf.summary.scalar
、tf.summary.image
等函数在 TensorFlow 2 中仍然存在,但使用方式有所不同。在 TensorFlow 2 中,你通常会结合with writer.as_default()
使用这些函数,而不是创建tf.Summary
对象。 - 记录操作:在 TensorFlow 1 中,你可能习惯于创建复合的
tf.Summary
对象,并将它们传递到FileWriter
。在 TensorFlow 2 中,推荐直接在with writer.as_default():
块中调用tf.summary
的各种方法(如tf.summary.scalar
,tf.summary.image
等),它们会自动处理数据的记录。
3. 移除 Session 和 Graph
由于不再需要 tf.Session()
,所有相关的代码也应当从 TensorBoard 记录中移除。此外,tf.Graph()
的使用在很多情况下也变得不再必要,因为 Eager Execution 支持动态的图结构。
4. 实例化和使用更简洁
在 TensorFlow 2 中,整个过程更为直接和自动化。你不需要显式地管理多个会话或复杂的图状态,这使得代码更容易编写和理解。
示例代码对比
TensorFlow 1.x:
import tensorflow as tf
logdir = './logs'
sess = tf.Session()
writer = tf.summary.FileWriter(logdir, sess.graph)
value1 = tf.placeholder(tf.float32)
summary = tf.summary.scalar('value1', value1)
sess.run(tf.global_variables_initializer())
for i in range(100):
summary_str = sess.run(summary, feed_dict={value1: i})
writer.add_summary(summary_str, i)
writer.close()
TensorFlow 2.x:
import tensorflow as tf
logdir = './logs'
writer = tf.summary.create_file_writer(logdir)
with writer.as_default():
for i in range(100):
tf.summary.scalar('value1', i, step=i)
writer.flush()
writer.close()
通过这些改变,TensorFlow 2 的 TensorBoard 集成更为直接和“Pythonic”,减少了许多冗余和模板代码,使得数据的记录和可视化更加高效和简洁。