繁体   English   中英

Tensorflow。 如何张量板

[英]Tensorflow. How to tensorboard

所以我有这样的代码,直到我希望它为我绘制张量板为止:

import numpy as np
import tensorflow as tf
import tqdm
from sklearn.model_selection import train_test_split
from tensorflow.python.framework import ops

ops.reset_default_graph()

x = np.linspace(0, 10, 1000, dtype='float32')
y = np.sin(x) + np.random.normal(size=len(x))

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=.3)

x_ = tf.placeholder(name="input", shape=None, dtype=np.float32)
y_ = tf.placeholder(name="output", shape=None, dtype=np.float32)
w = tf.Variable(tf.random_normal([]), name='w')
b = tf.Variable(tf.random_normal([]), name='bias')

model_output = tf.add(tf.multiply(x_, w), b)

loss = tf.reduce_mean(tf.pow(y_ - model_output, 2), name='loss')
train_step = tf.train.GradientDescentOptimizer(0.0025).minimize(loss)

summary_writer = tf.summary.FileWriter('linreg')
for value in [x_, model_output, w, loss]:
    tf.summary.scalar(value.op.name, value)
summaries = tf.summary.merge_all()

n_epochs = 100
train_errors = []
test_errors = []

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in tqdm.tqdm(range(n_epochs)):  # 100
        _, train_err = sess.run([train_step, loss],
                                feed_dict={x_: X_train, y_: y_train})
        train_errors.append(train_err)
        test_errors.append(
            sess.run(loss, feed_dict={x_: X_test, y_: y_test}))

        summary_writer.add_summary(sess.run(summaries), i)

有了这个我得到:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'input' with dtype float
     [[Node: input = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

因此,如果我理解正确,它要求我输入feed_dict,好的,让我们修改最后一行:

summary_writer.add_summary(sess.run(summaries, feed_dict={x_: X_train, y_: y_train}), i)

现在我们有:

InvalidArgumentError (see above for traceback): tags and values not the same shape: [] != [700] (tag 'input_1')
     [[Node: input_1 = ScalarSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](input_1/tags, _recv_input_0)]]

因此,权重要与x相同,我可以这样做:

w = tf.Variable(tf.random_normal([700]), name='w')

但是X_test呢? 它只有300行:

InvalidArgumentError (see above for traceback): Incompatible shapes: [300] vs. [700]
     [[Node: Mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](_recv_input_0, w/read)]]

所以我应该动态改变w的形状吗? 还是得到w1和w2进行训练和测试? 如何张量板?

================================================== ======================

塑造时间。 在变量和占位符的形状指定后:

x_ = tf.placeholder(name="input", shape=[None, 1], dtype=np.float32)
y_ = tf.placeholder(name="output", shape=[None, 1], dtype=np.float32)
w = tf.Variable(tf.random_normal([1, 1]), name='w')
b = tf.Variable(tf.random_normal([1]), name='bias')

我们可以看到,数据也应处于良好状态:

ValueError: Cannot feed value of shape (700,) for Tensor 'input:0', which has shape '(?, 1)'

所以最后一段代码看起来像这样(对数据进行了重塑):

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in tqdm.tqdm(range(n_epochs)):

        _, train_err, summ = sess.run([train_step, loss, summaries],
                                feed_dict={x_: X_train.reshape(len(X_train), 1), y_: y_train.reshape(len(y_train), 1)})
        summary_writer.add_summary(summ, i)

        train_errors.append(train_err)
        test_errors.append(
            sess.run(loss, feed_dict={x_: X_test.reshape(len(X_test), 1), y_: y_test.reshape(len(y_test), 1)}))

和当前错误:

InvalidArgumentError (see above for traceback): tags and values not the same shape: [] != [1,1] (tag 'w_1')
         [[Node: w_1 = ScalarSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](w_1/tags, w/read)]]

现在,我什至没有得到具有[]形状的张量。

================================================== ============

结论时间。

tf.summary.scalar([value.op.name], value)

不会这样做,因为tf.summary.scalar的coz first / name参数需要字符串或字节,否则给出错误。

因此,无论如何,名称都将是[]的形状,让我们接受它并更改一下代码:

w = tf.Variable(tf.random_normal([]), name='w')
b = tf.Variable(tf.random_normal([]), name='bias')
...
for value in [w, b, loss]:
    tf.summary.scalar(value.op.name, value)

终于可以了

x_是一个占位符,它将包含您的输入值。 它在图形中没有任何固定值,唯一的值就是您输入的值。 因此,您只需要使用:

    summary_writer.add_summary(sess.run(summaries, feed_dict={x_: X_train, y_: y_train}), i)

但是那样做会使您两次计算所有内容。 您应该使用的是:

_, train_err, summ = sess.run([train_step, loss, summaries],
                            feed_dict={x_: X_train, y_: y_train})
summary_writer.add_summary(summ, i)

这样,您的训练步骤和摘要计算就可以一次完成。

编辑

看来您只是有成形问题,而这些问题只能通过张量板显示出来。

  • 您的占位符x_应该声明为[None, n_features]的形状(此处n_features = 1 ,因此您也可以使它仅与[None] 。我真的不知道None不会做什么,也许您的问题来自于此)不...)

  • y的形状应为[None, n_outputs] ,因此此处为[None, 1] 可能None[None]也有效。

  • 在您的情况下[n_features, n_outputs] w的形状应为[n_features, n_outputs] [1, 1] 您不能在批处理大小之后调整它的形状,这在机器学习方面是胡说八道(至少如果您尝试仅从x而不是从其余的批处理中学习sin(x) ,那将不会很有道理)

  • b的形状应为[n_outputs] ,因此此处为[1]

如果指定所有这些形状是否可行?

编辑2

这是一个成型问题。 答案在这里 ,看来您只需要更换

tf.summary.scalar(value.op.name, value)

tf.summary.scalar([value.op.name], value)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM