首页 > 解决方案 > 标签值超出有效范围

问题描述

X = tf.placeholder(shape=(1, 5, 7), name='inputs', dtype=tf.float32)
X_flat = tf.layers.flatten(X)
y = tf.placeholder(shape=(1), name='outputs', dtype=tf.int32)
hidden1 = tf.layers.dense(X_flat, 150, kernel_initializer=he_init)
hidden2 = tf.layers.dense(hidden1, 50, kernel_initializer=he_init)
logits = tf.layers.dense(hidden2, 1, kernel_initializer=he_init)
with tf.name_scope("loss"):
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y)
    loss = tf.reduce_mean(xentropy, name="loss")

所以我收到以下错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Received a label value of 1 which is outside the valid range of [0, 1).  Label values: 1

我的标签的整数范围从 0 到 4。我很好奇为什么这不起作用。当我在示例代码中使用 MNIST 时,我认为 y 训练集不在 0 到 1 的范围内,但显然这就是这里发生的情况。

如何使交叉熵函数起作用?是否有任何形式的规范化可以使代码正常工作?

另外,为什么 MNIST 可以使用整数,但这个不能用于标签?

标签: pythontensorflowmachine-learning

解决方案


编辑

可以肯定的是,这就是我变成的。

X = tf.placeholder(shape=(1, 5, 7), name='inputs', dtype=tf.float32)
X_flat = tf.layers.flatten(X)
y = tf.placeholder(shape=(1), name='outputs', dtype=tf.int32)
hidden1 = tf.layers.dense(X_flat, 150, kernel_initializer=he_init)
hidden2 = tf.layers.dense(hidden1, 50, kernel_initializer=he_init)
logits = tf.layers.dense(hidden2, 5, kernel_initializer=he_init)
with tf.name_scope("loss"):
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y)
    loss = tf.reduce_mean(xentropy, name="loss")

这对我来说没有问题。

原来的

好的。因此,如果您的y变量具有 range (0,4),那么您的 logit 需要具有形状(batch_size, 5)(在您的情况下为(1,5)),因为每个值都是您的模型对特定标签的置信度。

这个:

logits = tf.layers.dense(hidden2, 1, kernel_initializer=he_init)

需要是这样的:

logits = tf.layers.dense(hidden2, 5, kernel_initializer=he_init)

为了做得更好,您可能应该定义这些变量。

num_classes = 5
# ...
logits = tf.layers.dense(hidden2, num_classes, kernel_initializer=he_init)
# ...

推荐阅读