如何实施 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
,问题仍然会出现。但是,如果 y
和 labels
的类型都为 float32
.
,则它可以顺利运行
有点不一致的是 tf.nn.sigmoid_cross_entropy_with_logits
本身不执行此转换,而 tf.nn.softmax_cross_entropy_with_logits
对 y
是 int32
没有问题。
我目前正在学习 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
,问题仍然会出现。但是,如果 y
和 labels
的类型都为 float32
.
有点不一致的是 tf.nn.sigmoid_cross_entropy_with_logits
本身不执行此转换,而 tf.nn.softmax_cross_entropy_with_logits
对 y
是 int32
没有问题。