gpt4 book ai didi

python - 如果我的输出变量是二进制,我是否需要使用 one_hot 编码?

转载 作者:行者123 更新时间:2023-11-30 08:28:55 24 4
gpt4 key购买 nike

我正在基于他们的 MNIST 初学者模板开发一个 Tensorflow 网络。基本上,我试图实现一个简单的逻辑回归,其中 10 个连续变量预测二元结果,因此我的输入是 0 到 1 之间的 10 个值,而我的目标变量(代码中的 Y_train 和 Y_test)是 1 或 0。

我的主要问题是,无论我运行多少个训练集,准确率都没有变化——无论我运行 100 步还是 31240 步,准确率都是 0.276667。此外,当我从 softmax 切换到简单的 matmul 来生成 Y 值时,我得到 0.0 精度,这表明我的 x*W + b 计算可能有问题。输入的读数很好。

我想知道的是a)我是否因为代码中的错误而没有正确计算Y值,b)如果不是这种情况,我是否可能需要实现one_hot向量 - 甚至虽然我的输出已经采用 0 或 1 的形式。如果是后者,我应该在生成目标值向量时在哪里包含 one_hot=TRUE 函数?谢谢!

import numpy as np
import tensorflow as tf
train_data = np.genfromtxt("TRAINDATA2.txt", delimiter=" ")
train_input = train_data[:, :10]
train_input = train_input.reshape(31240, 10)
X_train = tf.placeholder(tf.float32, [31240, 10])

train_target = train_data[:, 10]
train_target = train_target.reshape(31240, 1)
Y_train = tf.placeholder(tf.float32, [31240, 1])

test_data = np.genfromtxt("TESTDATA2.txt", delimiter = " ")
test_input = test_data[:, :10]
test_input = test_input.reshape(7800, 10)
X_test = tf.placeholder(tf.float32, [7800, 10])

test_target = test_data[:, 10]
test_target = test_target.reshape(7800, 1)
Y_test = tf.placeholder(tf.float32, [7800, 1])

W = tf.Variable(tf.zeros([10, 1]))
b = tf.Variable(tf.zeros([1]))

Y_obt = tf.nn.softmax(tf.matmul(X_train, W) + b)
Y_obt_test = tf.nn.softmax(tf.matmul(X_test, W) + b)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=Y_obt,
labels=Y_train)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

for _ in range(31240):
sess.run(train_step, feed_dict={X_train: train_input,
Y_train:train_target})

correct_prediction = tf.equal(tf.round(Y_obt_test), Y_test)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={X_test : test_input, Y_test:
test_target}))

最佳答案

由于您将值映射到具有一个元素的目标,因此您不应该使用 softmax 交叉熵,因为 softmax 运算将输入转换为概率分布,所有概率的总和等于 1。因为您的目标只有对于一个元素,它每次都会简单地输出 1,因为这是将输入转换为概率分布的唯一可能的方法。您应该使用tf.nn.sigmoid_cross_entropy_with_logits()(用于二元分类),并从Y_obt中删除softmax并将其转换为tf.sigmoid () 用于 Y_obt_test

另一种方法是对目标进行单热编码并使用具有二元素输出的网络。在这种情况下,您应该使用 tf.nn.softmax_cross_entropy_with_logits(),但从 Y_obt 中删除 tf.nn.softmax(),因为softmax 交叉熵需要未缩放的 logits ( https://www.tensorflow.org/api_docs/python/tf/nn/softmax_cross_entropy_with_logits )。对于 Y_obt_test,在这种情况下您当然不应该删除它。

另一件事:使用 cross_entropy = tf.reduce_mean(tf.sigmoid_cross_entropy_...) 获取交叉熵的平均值也可能有所帮助。

关于python - 如果我的输出变量是二进制,我是否需要使用 one_hot 编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com