微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TensorFlow中的二进制分类,损失和准确性出乎意料的大值

如何解决TensorFlow中的二进制分类,损失和准确性出乎意料的大值

由此:

二进制标签值–1和+1

。。。我假设在你的价值观train_ytest_y实际上是-1.0到+1.0

这不能与您选择的损失函数很好地配合sigmoid_cross_entropy_with_logits-假定为0.0和+1.0。负值y会引起混乱!但是,损失函数的选择对于二进制分类是有利的。我建议将您的y值更改为0和1。

另外,从技术上讲,网络的输出不是最终的预测。损耗函数sigmoid_cross_entropy_with_logits被设计为与在输出层中具有S型传递函数的网络一起使用,尽管您已经正确地知道在执行 此操作 之前 已经应用了损耗函数。所以您的训练代码看起来正确

我不确定tf.transpose该如何做-我会亲自查看将其删除会如何?

output = tf.add(tf.matmul(l3, output_layer['weights']), output_layer['biases'])

无论哪种方式,这都是“ logit”输出,而不是您的预测。output对于非常自信的预测,的值可能会很高,这可能会在以后由于缺少S形函数而说明您的很高的值。因此,添加一个预测张量(这表示该示例处于肯定类别中的概率/置信度):

prediction = tf.sigmoid(output)

您可以使用它来计算准确性。您的准确性计算不应基于L2误差,而应基于正确值的总和- 更接近于您注释掉的代码(这似乎来自多类分类)。要对二进制分类与真/假进行比较,您需要对预测进行阈值处理,并与真标签进行比较。像这样:

 predicted_class = tf.greater(prediction,0.5)
 correct = tf.equal(predicted_class, tf.equal(y,1.0))
 accuracy = tf.reduce_mean( tf.cast(correct, 'float') )

精度值应在0.0到1.0之间。如果要以百分比表示,请当然乘以100。

解决方法

我正在尝试使用深度神经网络体系结构对二进制标签值–1和+1进行分类。这是我的代码tensorflow

import tensorflow as tf
import numpy as np
from preprocess import create_feature_sets_and_labels

train_x,train_y,test_x,test_y = create_feature_sets_and_labels()

x = tf.placeholder('float',[None,5])
y = tf.placeholder('float')

n_nodes_hl1 = 500
n_nodes_hl2 = 500
n_nodes_hl3 = 500

n_classes = 1
batch_size = 100

def neural_network_model(data):

    hidden_1_layer = {'weights':tf.Variable(tf.random_normal([5,n_nodes_hl1])),'biases':tf.Variable(tf.random_normal([n_nodes_hl1]))}

    hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1,n_nodes_hl2])),'biases':tf.Variable(tf.random_normal([n_nodes_hl2]))}

    hidden_3_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2,n_nodes_hl3])),'biases':tf.Variable(tf.random_normal([n_nodes_hl3]))}

    output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl3,n_classes])),'biases':tf.Variable(tf.random_normal([n_classes]))}


    l1 = tf.add(tf.matmul(data,hidden_1_layer['weights']),hidden_1_layer['biases'])
    l1 = tf.nn.relu(l1)

    l2 = tf.add(tf.matmul(l1,hidden_2_layer['weights']),hidden_2_layer['biases'])
    l2 = tf.nn.relu(l2)

    l3 = tf.add(tf.matmul(l2,hidden_3_layer['weights']),hidden_3_layer['biases'])
    l3 = tf.nn.relu(l3)

    output = tf.transpose(tf.add(tf.matmul(l3,output_layer['weights']),output_layer['biases']))
    return output



def train_neural_network(x):
    prediction = neural_network_model(x)
    cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(prediction,y))
    optimizer = tf.train.AdamOptimizer().minimize(cost)

    hm_epochs = 10

    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())

        for epoch in range(hm_epochs):
            epoch_loss = 0
            i = 0
            while i < len(train_x):
                start = i
                end = i + batch_size
                batch_x = np.array(train_x[start:end])
                batch_y = np.array(train_y[start:end])

                _,c = sess.run([optimizer,cost],feed_dict={x: batch_x,y: batch_y})
                epoch_loss += c
                i+=batch_size

            print('Epoch',epoch,'completed out of',hm_epochs,'loss:',epoch_loss)

        # correct = tf.equal(tf.argmax(prediction,1),tf.argmax(y,1))
        # accuracy = tf.reduce_mean(tf.cast(correct,'float'))

        print (test_x.shape)
        accuracy = tf.nn.l2_loss(prediction-y,name="squared_error_test_cost")/test_x.shape[0]
        print('Accuracy:',accuracy.eval({x: test_x,y: test_y}))

train_neural_network(x)

这是我运行此命令时得到的输出:

('Epoch',10,-8400.2424869537354)
('Epoch',1,-78980.956665039062)
('Epoch',2,-152401.86713409424)
('Epoch',3,-184913.46441650391)
('Epoch',4,-165563.44775390625)
('Epoch',5,-360394.44857788086)
('Epoch',6,-475697.51550292969)
('Epoch',7,-588638.92993164062)
('Epoch',8,-745006.15966796875)
('Epoch',9,-900172.41955566406)
(805,5)
('Accuracy:',5.8077128e+09)

我不明白我得到的值是否正确,因为确实缺乏非MNIST二进制分类示例。准确性与我所期望的不同。我期望的是百分比,而不是那么大的价值。

我也不确定机器学习背后的理论,这就是为什么我无法使用张量流来说明我的方法的正确性。

有人可以告诉我我对二进制分类的方法是否正确吗?我的代码的准确性部分也正确吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。