二进制分类,xentropy不匹配,无效参数(收到的标签值1超出有效范围[0,1))

时间:2019-07-17 14:13:28

标签: python tensorflow neural-network deep-learning cross-entropy

我正在使用深度神经网络进行文本分类,但是我的 xentropy 遇到了问题。 我正在学习多类分类的课程,并且尝试使其适应我的二进制分类问题。

该课程将softmax用于多类:

   xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, 
                                                  logits=logits)

但是这样做,我遇到了错误

 InvalidArgumentError (see above for traceback): Received a label value of 1 which is outside the valid range of [0, 1).  Label values: 0 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 1 1 1 1 0 0 0 0 1 0 0 0 1
     [[node loss/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (defined at <ipython-input-84-5748b847be41>:2) ]]

我不明白,因为很明显我的标签应该包含0和1的值包括

这是指向类似问题的链接Received a label value of 1 which is outside the valid range of [0, 1) - Python, Keras,我试图在其他地方找到解决方案,但没有找到一个好的解决方案。

我试图用二进制分类熵替换它,如链接中的建议所示:

  xentropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)

但是后来我的X或/和Y的dtype出现问题。 我尝试按照说明进行操作,分别在X和Y之间在int32和float32之间切换,但是并没有解决问题,仍然是dtype的问题,只是将其移动了。

我想Y必须是int32,因为

 correct = tf.nn.in_top_k(logits, y, 1)

给我以下错误(同时切换X和Y的dtype):      传递给参数“ targets”的值的数据类型float32不在允许的值列表中:int32,int64

这是我的完整代码:

import tensorflow as tf
n_inputs = 28 
n_hidden1 = 15
n_hidden2 = 5
n_outputs = 1
reset_graph()

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

def neuron_layer(X, n_neurons, name, activation=None):
    with tf.name_scope(name):
        n_inputs = int(X.shape[1])
        stddev = 2 / np.sqrt(n_inputs)
        print(n_inputs,stddev) 
        init = tf.truncated_normal((n_inputs, n_neurons), stddev=stddev)     
        W = tf.Variable(init,name="kernel")  #weights random
        b = tf.Variable(tf.zeros([n_neurons]), name="bias")
        Z = tf.matmul(X, W) + b
        if activation is not None:
            return activation(Z)
        else:
            return Z

hidden1 = neuron_layer(X, n_hidden1, name="hidden1",
                           activation=tf.nn.relu)
hidden2 = neuron_layer(hidden1, n_hidden2, name="hidden2",
                           activation=tf.nn.relu)
logits = neuron_layer(hidden2, n_outputs, name="outputs")
learning_rate = 0.01

xentropy = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits)
loss = tf.reduce_mean(xentropy, name="loss")
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
training_op = optimizer.minimize(loss)
correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

解决此问题后,我将对其进行培训。

我知道它有点长,但是我已经好几个小时被封锁了... 有什么建议吗?

0 个答案:

没有答案