是否有必要将标签编码为tersorflow中的单热?

时间:2016-10-16 04:56:04

标签: machine-learning tensorflow deep-learning prediction conv-neural-network

我有二进制输出 - ' 1'或' 0'。

我没有把它编码为一个热点(因为我最初认为没有目的),当我运行我的转换网模型时,我得到了奇怪的结果 - 所有输出都是' 1&# 39;准确度约为57%。

我觉得有些不对劲。

所以我的问题是:我们是否总是需要将标签编码为热门?如果是这样,为什么(在二进制的情况下)

我的代码:

线{'class': tf.argmax(prediction, 1)表明应该有多个输出(如矢量),然后我们将一个元素放在一个具有最大概率的向量中 - 这个解释是否正确?所以它让我觉得我应该为二进制输出输出2个标签......

另外,我试图输出行中的实际概率

return {'class': prediction, 'prob': prediction}, loss, train_op

但它似乎没有用,我最终得到的只是[1 1 1 ... 1]

我的转型:

def my_conv_model(x, y):

# 1. form a 4d tensor of shape N x 1 x N_FEATURES x 1
x = tf.reshape(x, [-1, 1, N_FEATURES, 1])

##########################################################################
##### Conv layer 1 #####
conv1 = tf.contrib.layers.convolution2d(inputs=x,
                                        num_outputs=N_FILTERS,
                                        kernel_size=[1, 7],
                                        stride=[1, 1],
                                        padding='VALID')

# 3. Add a RELU for non linearity.
conv1 = tf.nn.relu(conv1)

# 4. Max pooling across output of Convolution+Relu.
pool1 = tf.nn.max_pool(conv1,
                       ksize=[1, 1, 3, 1],
                       strides=[1, 1, 3, 1],
                       padding='SAME')

##########################################################################
##### Conv layer 2 #####
conv2 = tf.contrib.layers.convolution2d(inputs=pool1,
                                        num_outputs=N_FILTERS,
                                        kernel_size=[1, 7],
                                        padding='VALID')

pool2 = tf.nn.max_pool(conv2,
                       ksize=[1, 1, 2, 1],
                       strides=[1, 1, 2, 1],
                       padding='SAME')

last_pool_layer = pool2
last_pool_layer_shape = last_pool_layer.get_shape()
n_cols = (last_pool_layer_shape[2] * last_pool_layer_shape[3]).value
last_pool_layer = tf.reshape(last_pool_layer, [-1, n_cols])
fc_layer = tf.contrib.layers.fully_connected(inputs=pool2,
                                  num_outputs=10,
                                  activation_fn=tf.nn.relu)

last_layer = fc_layer
    try:
        last_layer_shape = last_layer.get_shape()
        print("last_layer_shape", last_layer_shape)
        last_layer = tf.reshape(last_layer, [-1, (last_layer_shape[2] * last_layer_shape[3]).value])
        print("last_layer_shape", last_layer.get_shape())

        exc_info = sys.exc_info()

        y = tf.expand_dims(y, 1)

        prediction, loss = learn.models.logistic_regression(last_layer, y)
        print("prediction", prediction)
        prediction = tf.Print(prediction, [prediction], message="This is a: ")
        #print(prediction.eval())

        train_op = tf.contrib.layers.optimize_loss(
                    loss=loss,
                    global_step=tf.contrib.framework.get_global_step(),
                    optimizer='SGD',
                    learning_rate=0.001)

        #return {'class': tf.argmax(prediction, 1), 'prob': prediction}, loss, train_op
        return {'class': prediction, 'prob': prediction}, loss, train_op

1 个答案:

答案 0 :(得分:0)

你可能有一个错误,你的fc输入是input = pool2,我认为它们应该是last_pool_layer。

要回答你的是张量流,需要一个热门编码。您可以通过查找logistic_regression的实现并在此之后自行确认。

如果你这样做,你最终会here,你会发现它希望标签符合这种形式。

labels: Tensor, [batch_size, n_classes], labels of the output classes.

这意味着一个热门。如果它不是一个热点,它也会搞砸你试图做的数学运算,通过加权一些类比其他类更多。可能有一些函数可以隐式地将类标签转换为one-hot,但我不知道。