复现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
相关产品推荐
相关产品推荐

