TensorBoard中CNN模型图节点断开及左置布局的疑问
答:修复TensorBoard中CNN模型图的连接问题与结构堆叠
嘿,我看到你的模型功能正常但TensorBoard可视化出了问题,这两个现象其实都有明确的原因,咱们一步步解决:
一、节点断开的核心原因:TensorBoard写入方式错误
你当前写TensorBoard的代码用了graph_def=sess.graph_def,这会导致TensorBoard丢失节点连接的元数据:
summary_writer = tf.summary.FileWriter(filename, graph_def=sess.graph_def)
graph_def是图的序列化二进制格式,它只保留了计算图的核心结构,却丢掉了TensorBoard用来渲染连接关系的额外信息。改成直接传入会话的graph对象就能立即解决断开问题:
summary_writer = tf.summary.FileWriter(filename, sess.graph)
二、节点集中左侧堆叠的优化:给层添加命名空间
虽然你没刻意用Namescopes,但自定义层的节点没有分组,才导致所有节点挤在一起混乱堆叠。给每个组件加上tf.name_scope,TensorBoard会自动把同组节点折叠成可展开的块,结构瞬间清晰。
1. 改造你的层函数,支持命名空间和自定义名称
更新权重、偏置和层的定义,加入命名参数和命名空间:
def init_weights(shape, name=None): init_random_dist = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(init_random_dist, name=name) def init_bias(shape, name=None): init_bias = tf.constant(0.1, shape=shape) return tf.Variable(init_bias, name=name) def conv1d(x, weights): return tf.nn.conv1d(value=x, filters=weights, stride=1, padding='VALID') def convolution_layer(input_x, shape, name=None): with tf.name_scope(name or 'conv_layer'): w1 = init_weights(shape, name='conv_weights') b = init_bias([shape[2]], name='conv_bias') conv_out = conv1d(input_x, weights=w1) return tf.nn.relu(conv_out + b, name='relu_output') def normal_full_layer(input_layer, size, name=None): with tf.name_scope(name or 'full_layer'): input_size = int(input_layer.get_shape()[1]) W = init_weights([input_size, size], name='fc_weights') b = init_bias([size], name='fc_bias') return tf.matmul(input_layer, W) + b
2. 构建模型时给每个层指定唯一名称
这样每个层的节点会被自动分组:
con_layer_1 = convolution_layer(x, shape=[4,3,32], name='conv_layer_1') max_pool_1 = tf.layers.max_pooling1d(inputs=con_layer_1, pool_size=2, strides=2, padding='Valid', name='max_pool_1') con_layer_2 = convolution_layer(max_pool_1, shape=[4,32,64], name='conv_layer_2') max_pool_2 = tf.layers.max_pooling1d(inputs=con_layer_2, pool_size=2, strides=2, padding='Valid', name='max_pool_2') flat = tf.reshape(max_pool_2, [-1, max_pool_2.get_shape()[1]*max_pool_2.get_shape()[2]], name='flatten_layer') fully_conected = tf.nn.relu(normal_full_layer(flat, 1024, name='fc_layer_1')) second_hidden_layer = tf.nn.relu(normal_full_layer(fully_conected, 512, name='fc_layer_2')) hold_prob = tf.placeholder(tf.float32, name='dropout_keep_prob') full_one_dropout = tf.nn.dropout(second_hidden_layer, keep_prob=hold_prob, name='dropout_layer') y_pred = normal_full_layer(full_one_dropout, 6, name='output_logits')
额外小建议:改用官方高层API简化流程
如果想进一步减少代码量并优化可视化,可以直接用tf.layers.conv1d替代自定义卷积层,官方API会自动处理命名空间和变量管理,可视化效果更规整:
con_layer_1 = tf.layers.conv1d(inputs=x, filters=32, kernel_size=4, padding='VALID', activation=tf.nn.relu, name='conv1')
按照上面的方法修改后,重新运行训练脚本,刷新TensorBoard就能看到连接完整、结构清晰的模型图啦!
内容的提问来源于stack exchange,提问作者Salman Shaukat
相关产品推荐
相关产品推荐

