【问题标题】:How can I separate runs of my TensorFlow code in TensorBoard?如何在 TensorBoard 中分离 TensorFlow 代码的运行?
【发布时间】:2016-08-16 08:53:40
【问题描述】:

我的TensorBoard 情节将我的TensorFlow 代码的连续运行视为它们都是同一运行的一部分。例如,如果我首先使用FLAGS.epochs == 10 运行我的代码(如下),然后使用FLAGS.epochs == 40 重新运行它,我会得到

在第一次运行结束时“循环”以开始第二次。

有没有办法将我的代码的多次运行视为不同的日志,例如,可以比较或单独查看?


from __future__ import (absolute_import, print_function, division, unicode_literals)

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# Basic model parameters as external flags.
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('epochs', 40, 'Epochs to run')
flags.DEFINE_integer('mb_size', 40, 'Mini-batch size. Must divide evenly into the dataset sizes.')
lags.DEFINE_float('learning_rate', 0.15, 'Initial learning rate.')
flags.DEFINE_float('regularization_weight', 0.1 / 1000, 'Regularization lambda.')
flags.DEFINE_string('data_dir', './data', 'Directory to hold training and test data.')
flags.DEFINE_string('train_dir', './_tmp/train', 'Directory to log training (and the network def).')
flags.DEFINE_string('test_dir', './_tmp/test', 'Directory to log testing.')

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 nn_layer(input_tensor, input_dim, output_dim, neuron_fn, layer_name):
    with tf.name_scope(layer_name):
        # This Variable will hold the state of the weights for the layer
        with tf.name_scope("weights"):
            weights = tf.Variable(tf.truncated_normal([input_dim, output_dim], stddev=0.1))
            variable_summaries(weights, layer_name + '/weights')
        with tf.name_scope("biases"):
            biases = tf.Variable(tf.constant(0.1, shape=[output_dim]))
            variable_summaries(biases, layer_name + '/biases')
        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)
            tf.histogram_summary(layer_name + '/output', output)
    return output, weights 

# Collect data
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

# Inputs and outputs
x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])

# Network structure
o1, W1 = nn_layer(x, 784, 30, tf.nn.sigmoid, 'hidden_layer')
y, W2 = nn_layer(o1, 30, 10, tf.nn.softmax, 'output_layer')

with tf.name_scope('accuracy'):
    with tf.name_scope('loss'):
        cost = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
        loss = cost + FLAGS.regularization_weight * (tf.nn.l2_loss(W1) + tf.nn.l2_loss(W2))
    with tf.name_scope('correct_prediction'):
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    with tf.name_scope('accuracy'):
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.scalar_summary('accuracy', accuracy)
    tf.scalar_summary('loss', loss)

train_step = tf.train.GradientDescentOptimizer(FLAGS.learning_rate).minimize(loss)

# Logging
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()

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())

    for ep in range(FLAGS.epochs):
        for mb in range(int(len(mnist.train.images)/FLAGS.mb_size)):
            batch_xs, batch_ys = mnist.train.next_batch(FLAGS.mb_size)
            sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

        summary = sess.run(merged, feed_dict={x: mnist.test.images, y_: mnist.test.labels})
        test_writer.add_summary(summary, ep+1)

【问题讨论】:

  • 将它们放在不同的子目录中,然后它们将显示为单独的运行
  • @etarion:是的,除了那种明显的方式。所以:根据定义,相同的目录意味着相同的运行,无论代码是在不同时间实际运行还是(自动)生成不同的文件?或者,换一种说法(这确实是个问题):没有办法区分目录中的单独日志文件?
  • 当你保存/恢复运行时,你不想区分单独的日志文件......可能有一个选项,但如果有,我不知道。跨度>
  • @etarion:我确实想要,而且确实应该有办法。

标签: python machine-learning tensorflow tensorboard


【解决方案1】:
from fs.osfs import OSFS
folder = OSFS(FLAGS.test_dir)
test_n = len(list(n for n in folder.listdir() if n.startswith('test')))
this_test = FLAGS.test_dir+"/test" + str(test_n+1)
test_writer = tf.train.SummaryWriter(this_test)

你可以使用这样的东西来枚举你的运行。

【讨论】:

    【解决方案2】:

    您可以使用(低级)“时间”模块来获取运行开始时的字符串,并相应地命名目录..

    这是一个使用 TensorFlow 后端的 keras 示例

    from keras.callbacks import TensorBoard
    import time
    
    now = time.strftime("%c")
    model.fit(X, Y, batch_size = 2, nb_epoch = 100, shuffle = True,
            verbose = 1, validation_split = 0.1, 
            callbacks =[TensorBoard(log_dir='./logs/'+now, histogram_freq=0, write_graph=True)])
    

    这将为您提供一组目录,例如

    % ls logs
    Fri Sep  2 23:58:39 2016/ Sat Sep  3 00:05:41 2016/
    

    ...是的,名称中有空格,但 Tensorboard 不介意。您将看到一个运行列表、颜色编码和日期时间戳(基于它们的开始时间)。

    【讨论】:

      【解决方案3】:

      您可以将运行放入单独的子目录中,例如:

      ./logdir/2016111301/
      ./logdir/2016111302/
      ./logdir/2016111401/
      

      比你在根目录上调用你的 tensorboard 函数:

      tensorboard --logdir=logdir
      

      您将拥有单独的日志文件,例如:

      【讨论】:

      • 这不是问题。问题是如何做到这一点(如已回答)。
      • 这就是我写“将你的运行放入单独的子目录”的原因。还是我误解了这个问题?如果你已经得到了你的问题的答案,为什么你还没有接受任何答案?
      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 2021-12-16
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多