如何记录TensorFlow变量中的单个标量值?

如何使用SummaryWriter(例如用于TensorBoard)记录张量Variable的单个标量元素?例如,如何记录网络中给定层或节点的各个权重?

在我的示例代码中,我使用了一个通用的前馈神经网络来进行简单的线性回归,并且希望(在这种情况下)记录学习过程中唯一隐藏层中唯一节点的权重。

我可以在会话中明确获取这些值,例如

sess.run(layer_weights)[0][i][0]

用于第i个权重,其中layer_weights是权重Variable的列表;但我不知道如何记录相应的标量值。如果我尝试

w1 = tf.slice(layer_weights[0], [0], [1])[0]tf.scalar_summary('w1', w1)

w1 = layer_weights[0][1][0]tf.scalar_summary('w1', w1)

我会得到

ValueError: Shape (5, 1) must have rank 1

如何记录TensorFlow Variable中的单个标量值?


from __future__ import (absolute_import, print_function, division, unicode_literals)import numpy as npimport tensorflow as tf# 基本模型参数作为外部标志flags = tf.app.flagsFLAGS = flags.FLAGSflags.DEFINE_float('network_nodes', [5, 1], '每层节点的数量,包括输入和输出。')flags.DEFINE_float('epochs', 250, '运行的轮数')flags.DEFINE_float('learning_rate', 0.15, '初始学习率。')flags.DEFINE_string('data_dir', './data', '保存训练和测试数据的目录。')flags.DEFINE_string('train_dir', './_tmp/train', '记录训练(和网络定义)的目录。')flags.DEFINE_string('test_dir', './_tmp/test', '记录测试的目录。')def variable_summaries(var, name):    with tf.name_scope("summaries"):        mean = tf.reduce_mean(var)        tf.scalar_summary('mean/' + name, mean)        with tf.name_scope('stddev'):            stddev = tf.sqrt(tf.reduce_sum(tf.square(var - mean)))            tf.scalar_summary('sttdev/' + name, stddev)    tf.scalar_summary('max/' + name, tf.reduce_max(var))    tf.scalar_summary('min/' + name, tf.reduce_min(var))    tf.histogram_summary(name, var)def add_layer(input_tensor, input_dim, output_dim, neuron_fn, layer_name):    with tf.name_scope(layer_name):        with tf.name_scope("weights"):            weights = tf.Variable(tf.truncated_normal([input_dim, output_dim], stddev=0.1))        with tf.name_scope("biases"):            biases = tf.Variable(tf.constant(0.1, shape=[output_dim]))        with tf.name_scope('activations'):            with tf.name_scope('weighted_inputs'):                weighted_inputs = tf.matmul(input_tensor, weights) + biases                tf.histogram_summary(layer_name + '/weighted_inputs', weighted_inputs)            output = neuron_fn(weighted_inputs)    return output, weights, biasesdef make_ff_network(nodes, input_activation, hidden_activation_fn=tf.nn.sigmoid, output_activation_fn=tf.nn.softmax):    layer_activations = [input_activation]    layer_weights = []    layer_biases = []    n_layers = len(nodes)    for l in range(1, n_layers):        a, w, b = add_layer(layer_activations[l - 1], nodes[l - 1], nodes[l],                         output_activation_fn if l == n_layers - 1 else hidden_activation_fn,                         'output_layer' if l == n_layers - 1 else 'hidden_layer' + (                             '_{}'.format(l) if n_layers > 3 else ''))        layer_activations += [a]        layer_weights += [w]        layer_biases += [b]    with tf.name_scope('output'):        net_activation = tf.identity(layer_activations[-1], name='network_activation')    return net_activation, layer_weights, layer_biases# 输入和输出with tf.name_scope('data'):    x = tf.placeholder(tf.float32, shape=[None, FLAGS.network_nodes[0]], name='inputs')    y_ = tf.placeholder(tf.float32, shape=[None, FLAGS.network_nodes[-1]], name='correct_outputs')# 网络结构y, layer_weights, layer_biases = make_ff_network(FLAGS.network_nodes, x, output_activation_fn=tf.identity)# 指标和操作with tf.name_scope('accuracy'):    with tf.name_scope('loss'):        loss = tf.reduce_mean(tf.square(y - y_))    # 这些都不起作用:    #w1 = tf.slice(layer_weights[0], [0], [1])[0]    #tf.scalar_summary('w1', w1)    #w1 = layer_weights[0][1][0]    #tf.scalar_summary('w1', w1)    tf.scalar_summary('loss', loss)train_step = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(loss)# 记录train_writer = tf.train.SummaryWriter(FLAGS.train_dir, tf.get_default_graph())test_writer = tf.train.SummaryWriter(FLAGS.test_dir)merged = tf.merge_all_summaries()W = np.array([1.0, 2.0, 3.0, 4.0, 5.0])train_x = np.random.rand(100000, FLAGS.network_nodes[0])train_y = np.array([np.dot(W, train_x.T)+ 6.0]).Ttest_x = np.random.rand(1000, FLAGS.network_nodes[0])test_y = np.array([np.dot(W, test_x.T)+ 6.0]).Twith tf.Session() as sess:    sess.run(tf.initialize_all_variables())    for ep in range(FLAGS.epochs):        sess.run(train_step, feed_dict={x: train_x, y_: train_y})        summary = sess.run(merged, feed_dict={x: test_x, y_: test_y})        test_writer.add_summary(summary, ep+1)    # 这些可以工作    print('w1 = {}'.format(sess.run(layer_weights)[0][0][0]))    print('w2 = {}'.format(sess.run(layer_weights)[0][1][0]))    print('w3 = {}'.format(sess.run(layer_weights)[0][2][0]))    print('w4 = {}'.format(sess.run(layer_weights)[0][3][0]))    print('w5 = {}'.format(sess.run(layer_weights)[0][4][0]))    print(' b = {}'.format(sess.run(layer_biases)[0][0]))

回答:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注