You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复现TensorBoard图表遇问题:与Google Developers视频示例存差异

问题解决:TensorBoard图表与视频演示不一致的原因及修正方案

我仔细对比了你的代码和视频里的演示内容,发现几个关键差异点,修正后就能复现视频里的图表结构:

1. 给层内操作添加显式命名

你的conv_layer和fc_layer里的卷积、激活等操作没有指定name参数,TensorFlow会自动生成默认名称,导致TensorBoard里的子节点结构不够清晰。修改代码如下:

修正后的卷积层:

def conv_layer(input, channels_in, channels_out, name = "conv"):
    with tf.name_scope(name):
        w = tf.Variable(tf.zeros([5, 5, channels_in, channels_out]), name = "W")
        b = tf.Variable(tf.zeros([channels_out]), name = "B")
        # 给conv和relu操作添加显式name
        conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME", name="conv")
        act = tf.nn.relu(conv + b, name="relu")
        return act

修正后的全连接层:

def fc_layer(input, channels_in, channels_out, name = "fc"):
    with tf.name_scope(name):
        w = tf.Variable(tf.zeros([channels_in, channels_out]), name = "W")
        b = tf.Variable(tf.zeros([channels_out]), name = "B")
        # 给matmul和relu操作添加显式name
        logits = tf.matmul(input, w, name="matmul") + b
        act = tf.nn.relu(logits, name="relu")
        return act

2. 修正输出层的激活逻辑

视频里的fc2是分类输出层(logits),不需要经过ReLU激活,但你的代码复用了带ReLU的fc_layer,这不仅不符合分类任务的逻辑,也会导致图结构不一致。单独实现输出层:

with tf.name_scope("fc2"):
    w = tf.Variable(tf.zeros([1024, 10]), name="W")
    b = tf.Variable(tf.zeros([10]), name="B")
    logits = tf.matmul(fcl, w, name="matmul") + b  # 无ReLU激活

3. 添加Summary记录(关键!)

视频里的TensorBoard图表包含了变量直方图、激活值分布等内容,你的代码只写入了计算图结构,没有添加任何Summary操作。需要在每个层的name_scope里添加直方图Summary,并合并后写入:

给卷积层添加Summary:

def conv_layer(input, channels_in, channels_out, name = "conv"):
    with tf.name_scope(name):
        w = tf.Variable(tf.zeros([5, 5, channels_in, channels_out]), name = "W")
        b = tf.Variable(tf.zeros([channels_out]), name = "B")
        # 添加变量直方图Summary
        tf.summary.histogram("weights", w)
        tf.summary.histogram("biases", b)
        
        conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME", name="conv")
        act = tf.nn.relu(conv + b, name="relu")
        # 添加激活值直方图Summary
        tf.summary.histogram("activations", act)
        return act

给全连接层添加Summary:

def fc_layer(input, channels_in, channels_out, name = "fc"):
    with tf.name_scope(name):
        w = tf.Variable(tf.zeros([channels_in, channels_out]), name = "W")
        b = tf.Variable(tf.zeros([channels_out]), name = "B")
        tf.summary.histogram("weights", w)
        tf.summary.histogram("biases", b)
        
        logits = tf.matmul(input, w, name="matmul") + b
        act = tf.nn.relu(logits, name="relu")
        tf.summary.histogram("activations", act)
        return act

合并Summary并在训练中写入:

另外,你的代码缺少训练循环,视频里的演示是在训练过程中不断写入Summary的,补充完整代码:

# 添加MNIST数据加载
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# 合并所有Summary
merged_summary = tf.summary.merge_all()

sess = tf.Session()
sess.run(tf.global_variables_initializer())
writer = tf.summary.FileWriter("/Users/jianxiongji/graphs/change3/")
writer.add_graph(sess.graph)

# 训练循环,每10步写入一次Summary
for i in range(1000):
    batch = mnist.train.next_batch(50)
    if i % 10 == 0:
        summary, acc = sess.run([merged_summary, accuracy], feed_dict={x: batch[0], y: batch[1]})
        writer.add_summary(summary, i)
        print(f"Step {i}, Accuracy: {acc}")
    sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})

TensorBoard优质学习资料推荐

  • TensorFlow官方文档:官方提供的TensorBoard指南是最权威的资料,涵盖了所有可视化工具(标量、直方图、计算图、嵌入等)的详细使用方法。
  • 《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》:这本书中有专门章节讲解TensorBoard,结合MNIST、CNN等实际案例,非常适合上手。
  • TensorFlow Dev Summit系列视频:除了你看的2017年版本,后续年份的Summit也有TensorBoard的更新讲解,能学习到更多新功能(比如Profile、Debugger等)。
  • TensorFlow官方示例仓库:官方示例里有很多带完整TensorBoard可视化的项目,可以直接运行并对照代码学习。

内容的提问来源于stack exchange,提问作者Jianxiong Ji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:12:55