Tensorflow - 您必须使用 dtype float 为占位符张量“X”提供一个值

Posted

技术标签:

【中文标题】Tensorflow - 您必须使用 dtype float 为占位符张量“X”提供一个值【英文标题】:Tensorflow - You must feed a value for placeholder tensor 'X' with dtype float 【发布时间】:2017-11-02 10:43:48 【问题描述】:

请参考下面的tensorflow代码:

#!/usr/bin/env python3
import tensorflow as tf
import numpy as np
from sklearn.datasets import fetch_california_housing
import numpy.random as rnd

housing = fetch_california_housing()
m, n = (50000, 3)

n_epochs = 50000
learning_rate = 0.1

X = tf.placeholder(tf.float32, shape=(None, n + 1), name="X")
y = tf.placeholder(tf.float32, shape=(None, 1), name="y")
theta = tf.Variable(tf.random_uniform([n + 1, 1], -1.0, 1.0, seed=42), name="theta")
y_pred = tf.matmul(X, theta, name="predictions")
error = y_pred - y
mse = tf.reduce_mean(tf.square(error), name="mse")
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(mse)

init = tf.global_variables_initializer()

ans_theta = np.array([[4],[3],[2],[1]]).astype(np.float32)
X_train = rnd.rand(m, n + 1)
y_train = X_train.dot(ans_theta).reshape(m, 1)
print("ans_theta=%s" % (ans_theta.transpose()))
print("X_train=%s" % (X_train[0]))
print("Expect y=%s"  % (np.sum(X_train[0] * ans_theta.transpose())))
print("y_train=%s" % (y_train[0]))
def fetch_batch(epoch, batch_index, batch_size):
    rnd.seed(epoch * n_batches + batch_index)
    indices = rnd.randint(m, size=batch_size)
    X_batch = X_train[indices]
    y_batch = y_train[indices]
    return X_batch, y_batch

n_epochs = 500
batch_size = 2000
n_batches = int(np.ceil(m / batch_size))

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

    for epoch in range(n_epochs):
    #    for batch_index in range(n_batches):
    #        X_batch, y_batch = fetch_batch(epoch, batch_index, batch_size)
            #print("X_batch(%s):\n%s\n" % (X_batch.shape, X_batch[:1]))
            #print("y_batch(%s):\n%s\n" % (y_batch.shape, y_batch[:1]))
    #        sess.run(training_op, feed_dict=X: X_batch, y: y_batch)
        sess.run(training_op, feed_dict=X:X_train, y:y_train)
    best_theta = theta.eval()
    print("MSE=%s" % (mse.eval()))
print("Best theta:")
print(best_theta)

会导致如下异常:

由操作“X”引起,定义在:文件“./ch9_t00.py”,第 19 行,在 X = tf.placeholder(tf.float32, shape=(None, n + 1), name="X") 文件 "/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/array_ops.py", 第 1507 行,在占位符中 名称=名称)文件“/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/gen_array_ops.py”, 第 1997 行,在 _placeholder 名称=名称)文件“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py”, 第 768 行,在 apply_op 中 op_def=op_def) 文件 "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", 第 2336 行,在 create_op 中 original_op=self._default_original_op, op_def=op_def) 文件 "/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", 第 1228 行,在 init 中 self._traceback = _extract_stack()

InvalidArgumentError(参见上面的回溯):您必须提供一个值 对于具有 dtype 浮点数的占位符张量“X” [[节点:X = Placeholderdtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]]

我也不知道为什么。如果我删除 "print("MSE=%s" % (mse.eval()))" 行,那么一切都会好起来的。 有什么建议吗?

提前致谢!

【问题讨论】:

【参考方案1】:

您无法在没有任何数据的情况下评估您的 MSE,您必须输入占位符 xy 的值,以评估网络对输入 x 的预测与地面实况之间的均方误差y 中给出的标签。

你可以使用

print("MSE=%s" % sess.run(mse, feed_dict=X:X_train, y:y_train))

或者在你训练的时候做:

_, mse_value = sess.run([training_op, mse], feed_dict=X:X_train, y:y_train)
print("MSE=%s" % mse_value)

【讨论】:

太棒了。你的回答让我更了解 tensorflow。非常感谢!

以上是关于Tensorflow - 您必须使用 dtype float 为占位符张量“X”提供一个值的主要内容,如果未能解决你的问题,请参考以下文章

Grad-CAM 可视化:无效参数错误:您必须使用 dtype 浮点数和形状 [x] 为占位符张量“X”提供一个值

Tensorflow:ValueError:预期的非整数,得到<dtype:'int32'>

您必须为 MNIST 数据集的 dtype float 和 shape [?,784] 提供占位符张量“Placeholder”的值

TypeError:无法将值 dtype('<M8[ns]') 转换为 TensorFlow DType

如何更改 tensorflow 的 numpy 数组的 dtypes

尝试使用 tensorflow.io.gfile.GFile 和 tensorflow.dataset.map,得到“预期的二进制或 unicode 字符串,得到 Tensor dtype=strin