如何实施 tf.nn.sigmoid_cross_entropy_with_logits

How to implement tf.nn.sigmoid_cross_entropy_with_logits

我目前正在学习 tensorflow,我 运行 遇到了一个问题 tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits)。函数描述说labels和logits必须是同一类型。我有下面用来对 MNIST 图像进行分类的函数。以下是我的代码的关键部分

X=tf.placeholder(tf.float32,shape=(None,n_inputs),name="X")
y=tf.placeholder(tf.int32,shape=(None),name="y")

def neuron_layer(X,W,b,n_neurons,name,activation=None):
    with tf.name_scope(name):
        n_inputs=int(X.get_shape()[1])
        stddev=2/np.sqrt(n_inputs)
        z=tf.matmul(X,W)+b
        if activation=="sigmoid":
            return tf.math.sigmoid(z)
        else:
            return z
with tf.name_scope("dnn"):
    hidden1=neuron_layer(X,W1,b1,n_hidden1,"hidden",activation="sigmoid")
       logits=neuron_layer(hidden1,W2,b2,n_outputs,"outputs",activation="sigmoid")
with tf.name_scope("loss"):
    xentropy=tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=logits)
loss=tf.reduce_mean(xentropy,name="loss")

我收到错误:'Mul' Op 的输入 'y' 的 int32 类型与参数 'x

的 float32 类型不匹配

如果我改变 y=tf.placeholder(tf.float32,shape=(None),name="y")。我得到错误 传递给参数 'targets' 的值的数据类型 float32 不在允许值列表中:int32、int64。然而 logits 只能是 float32 或 float64。请帮我解决这个问题。谢谢

如评论中所述,tf.nn.sigmoid_cross_entropy_with_logits 是错误的函数。在您的情况下,您应该改用 tf.nn.softmax_cross_entropy_with_logits (实际上,那个会产生弃用警告,因此 tf.nn.softmax_cross_entropy_with_logits_v2 是正确的)。另请注意,正如评论中所述,这两个函数的要点在于它们内置了一个 sigmoid(或分别为 softmax),因此您的模型在最后一层不应该有任何激活函数。

关于问题:我刚刚用tensorflow 1.14.0版本试过了。如果 y 的类型为 int32,问题仍然会出现。但是,如果 ylabels 的类型都为 float32.

,则它可以顺利运行

有点不一致的是 tf.nn.sigmoid_cross_entropy_with_logits 本身不执行此转换,而 tf.nn.softmax_cross_entropy_with_logitsyint32 没有问题。