标签值超出有效范围

时间:2019-06-27 18:47:46

标签: python tensorflow machine-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, 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为何还能使用整数,但是不能使用整数?

1 个答案:

答案 0 :(得分:0)

编辑

请确定,这就是我的意思。

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变量的范围为(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)
# ...