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为何还能使用整数,但是不能使用整数?
答案 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)
# ...