簡體   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