Tensorflow не вычисляет сводку - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь понять, как собирать сводки для тензорной доски, и написал простой код для увеличения x от 1 до 5.
По какой-то неизвестной причине я вижу переменную My_x как 0 на всех этапах.

import tensorflow as tf

tf.reset_default_graph() # To clear the defined variables/operations

# create the scalar variable
x = tf.Variable(0, name='x')

# ____step 1:____ create the scalar summary
x_summ = tf.summary.scalar(name='My_x', tensor=x)

# accumulate all summaries
merged_summary = tf.summary.merge_all()

# create the op for initializing all variables
model = tf.global_variables_initializer()

# launch the graph in a session
with tf.Session() as session:
    # ____step 2:____ creating the writer inside the session
    summary_writer = tf.summary.FileWriter('output', session.graph)

    for i in range(5):
        #initialize variables
        session.run(model)

        x = x + 1

        # ____step 3:____ evaluate the scalar summary
        merged_summary_ans, x_summ_ans, x_ans = session.run([merged_summary, x_summ, x])
        print(x_ans)
        print(x_summ_ans)
        print(merged_summary_ans)

        # ____step 4:____ add the summary to the writer (i.e. to the event file)
        summary_writer.add_summary(summary=x_summ_ans, global_step=i)

    summary_writer.flush()
    summary_writer.close()
    print('Done with writing the scalar summary')

1 Ответ

0 голосов
/ 24 декабря 2018

Есть две проблемы, которые я вижу в вашем коде:

1) Во-первых, в каждом цикле вы заново инициализируете глобальные переменные.Это возвращает x к его первоначальному значению (0).

2) Во-вторых, когда вы обновляете x, вы перезаписываете ссылку на переменную с помощью операции добавления TensorFlow.Ваш код для увеличения x заменяет 'x' операцией tf.add, а затем ваше итоговое значение больше не отслеживает переменную tf.Variable, а является операцией сложения.Если вы добавите «print (x)» после того, как определите его и будете запускать его один раз в каждом цикле, вы увидите, что изначально он начинается как <tf.Variable 'x:0' shape=() dtype=int32_ref>, но затем, увидев, что «x = x + 1», затем напечатайте (x) становится Tensor("add:0", shape=(), dtype=int32).Здесь вы можете видеть, что tf.summary.scalar совместим только с исходным значением, и вы можете понять, почему его нельзя обновить.

Вот код, который я изменил, чтобы заставить его работать, чтобы вы могли видетьлинейное значение x в Tensorboard.

import tensorflow as tf
tf.reset_default_graph()

x = tf.Variable(0, name='x')
x_summary = tf.summary.scalar('x_', x)
init = tf.global_variables_initializer()

with tf.Session() as session:
    session.run(init)
    merged_summary_op = tf.summary.merge_all()
    summary_writer = tf.summary.FileWriter('output', session.graph)

    for i in range(5):
        print(x.eval())
        summary = session.run(merged_summary_op)
        summary_writer.add_summary(summary, i)
        session.run(tf.assign(x, x+1))

    summary_writer.flush()
    summary_writer.close()
...