2016-04-22 60 views
9

我的TensorBoard圖表將我的TensorFlow代碼的連續運行看作是它們都是同一運行的一部分。例如,如果我先用FLAGS.epochs == 10我的代碼運行(如下圖),然後用FLAGS.epochs == 40重新運行它,我得到如何分離TensorBoard中的TensorFlow代碼?

enter image description here

其中「環回」第一次運行結束開始第二。

有沒有辦法將我的代碼的多次運行視爲不同的日誌,例如,可以比較或單獨查看?


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) 
+3

把它們放在不同的子目錄中,然後它們將s如何分開運行 – etarion

+0

@etarion:是的,除了那顯而易見的方式。因此:無論代碼是否在不同時間運行,或者是否(自動)生成不同的文件,相同的目錄意味着定義相同的運行?或者換一種說法(這真的是個問題):無法區分目錄中的單獨日誌文件嗎? – orome

+1

當你保存/恢復運行時,你不想區分單獨的日誌文件......可能有一個選項,但如果有的話,我不知道一個。 – etarion

回答

5
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) 

你可以使用這樣的事情讓你的奔跑列舉。

0

可以使用(低電平)「時間」模塊,以獲取每當運行開頭的字符串,並將其命名相應的目錄..

下面是一個使用keras與TensorFlow後端爲例

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並不介意。您會看到一系列的運行列表,顏色代碼和日期時間標記是基於何時啓動的。

5

你可以把你的運行到單獨的子目錄,如:

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

比你調用的根目錄,您tensorboard功能:

tensorboard --logdir=logdir 

比你有單獨的日誌文件,如:

enter image description here

+1

雖然這不是問題。問題是*如何做到這一點(如已回答)。 – orome

+0

這就是爲什麼我寫了「把你的跑步放入不同的子目錄」。還是我誤解了這個問題?爲什麼你還沒有接受任何答案,如果你已經回答了你的問題? – bendaf