Python Tensorflow神经网络总是预测同样的事情

Python Tensorflow神经网络总是预测同样的事情,python,tensorflow,neural-network,Python,Tensorflow,Neural Network,大家好 我一直在尝试制作一个神经网络,根据某些特征对工资进行分类。然而,当我运行这个神经网络的tensorflow代码时,无论我输入什么特性,它都会预测相同的事情。我读过神经网络概念之类的书,我的代码与我的概念知识相符,所以我对自己做错了什么感到困惑。请详细解释你的发现,因为我在这方面还很无知。 这是我的代码: import tensorflow as tf import numpy as np n_inputs = 4 n_hidden1 = 2 n_hidden2 = 2 n_outpu

大家好

我一直在尝试制作一个神经网络,根据某些特征对工资进行分类。然而,当我运行这个神经网络的tensorflow代码时,无论我输入什么特性,它都会预测相同的事情。我读过神经网络概念之类的书,我的代码与我的概念知识相符,所以我对自己做错了什么感到困惑。请详细解释你的发现,因为我在这方面还很无知。

这是我的代码:

import tensorflow as tf
import numpy as np

n_inputs = 4
n_hidden1 = 2
n_hidden2 = 2
n_outputs = 1000000

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

with tf.name_scope("dnn"):


    hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1",
                              activation=tf.nn.relu)  

    hidden2 = tf.layers.dense(hidden1, n_hidden2, name="hidden2",
                              activation=tf.nn.relu)

    logits = tf.layers.dense(hidden2, n_outputs, name="outputs")

with tf.name_scope("loss"):
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
    loss = tf.reduce_mean(xentropy, name="loss")  

learning_rate = 0.1  

with tf.name_scope("train"):
    optimizer = tf.train.GradientDescentOptimizer(learning_rate)
    training_op = optimizer.minimize(loss)  



init = tf.global_variables_initializer()  

saver = tf.train.Saver()

# Training data. In every 1-D array, the first 4 elements are features and the last element is a label/output.
train_x = [[11, 3, 2, 4, 150000], [9, 2, 1, 2, 90000], [10, 4, 3, 1, 140000], [11, 3, 4, 4, 170000],
           [8, 2, 1, 3, 105000], [7, 2, 1, 2, 95000], [11, 4, 2, 4, 145000], [10, 4, 1, 4, 110000],
           [9, 3, 4, 4, 160000], [8, 2, 3, 4, 145000], [7, 4, 2, 4, 130000], [8, 2, 1, 2, 101000],
           [10, 2, 2, 3, 130000], [10, 3, 3, 3, 140000], [8, 3, 1, 2, 105000], [7, 4, 1, 3, 95000],
           [10, 3, 4, 3, 165000], [10, 3, 4, 4, 167000], [10, 4, 4, 1, 166000], [8, 4, 2, 4, 137000],
           [9, 2, 2, 4, 140000], [8, 2, 2, 2, 142000], [9, 2, 2, 3, 143000], [9, 2, 2, 4, 144000], [8, 4, 2, 2, 140000],
           [6, 4, 1, 4, 110000], [7, 3, 1, 2, 100000], [8, 3, 1, 3, 101000], [7, 2, 1, 3, 100000], [7, 2, 1, 3, 950000],
           [7, 4, 1, 4, 980000], [8, 4, 1, 4, 100000], [8, 3, 1, 4, 100000], [9, 3, 1, 2, 101000], [8, 3, 1, 2, 107000],
           [8, 3, 2, 2, 110000], [8, 2, 2, 3, 115000], [7, 4, 2, 2, 112000], [8, 2, 2, 4, 120000], [8, 4, 2, 4, 122000],
           [8, 2, 2, 3, 120000], [8, 3, 2, 4, 123000], [8, 3, 2, 4, 121000], [8, 2, 2, 4, 121000], [8, 4, 2, 2, 120000]]

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

#Training
    for i in range(0, 45):  

        X_batch = [train_x[i][:4]]
        y_batch = train_x[i][4:]

        sess.run(training_op, feed_dict={X: X_batch, y: y_batch})

# Testing
    for i in range(0, 45):
        pred_data = logits.eval(feed_dict={X: [train_x[i][:4]]})
        pred = np.argmax(pred_data, axis=1)
        print("Predicted Value : ", pred, " Expected Value  :", train_x[i][4:])
预测结果是这样的:

Predicted Value :  [140000]  Expected Value  : [150000]
Predicted Value :  [140000]  Expected Value  : [90000]
Predicted Value :  [140000]  Expected Value  : [140000]
Predicted Value :  [140000]  Expected Value  : [170000]
Predicted Value :  [140000]  Expected Value  : [105000]
Predicted Value :  [140000]  Expected Value  : [95000]
Predicted Value :  [140000]  Expected Value  : [145000]
Predicted Value :  [140000]  Expected Value  : [110000]
Predicted Value :  [140000]  Expected Value  : [160000]
Predicted Value :  [140000]  Expected Value  : [145000]
Predicted Value :  [140000]  Expected Value  : [130000]
Predicted Value :  [140000]  Expected Value  : [101000]
...
我从其他帖子和问题中尝试过基本的标准化、改变学习率等,但都没有成功


谢谢你的帮助

我认为问题在于你把这个回归问题当作一个分类问题来处理。与直接预测工资中的美元数不同,您似乎在生成一个1000000长度的向量,然后选择具有最大值的索引

这种方法有四个问题。首先,您尝试使用45个示例来训练4x2+2x2+2x1000000=2000012个边权重。这还远远不够

其次,假设您确实希望将其视为一个分类问题,那么输入的y是一个整数,而输出是一个1000000长度的向量。我不知道在哪里,甚至不知道是否将这个整数转换为长度为1000000的一个热向量,这样输入和输出就可以进行比较

第三,对于标签相互排斥的多类别分类问题,即某人的工资不能同时为15000美元和18000美元,标准程序是给输出一个值。净效果是,在训练过程中,网络学习到只有1个输出节点,其他所有节点的值接近1和0


第四,通过将薪资预测视为一个分类问题,网络将预测的薪资与预期值相差1美元视为与预测的薪资相差1万美元一样糟糕。这显然不是事实。与其训练1000000节点输出,不如尝试使用relu激活来训练单个节点,以避免出现负值。然后将输出节点的值作为预测薪资,而不是argmax。

我认为问题在于您将此回归问题视为分类问题。与直接预测工资中的美元数不同,您似乎在生成一个1000000长度的向量,然后选择具有最大值的索引

这种方法有四个问题。首先,您尝试使用45个示例来训练4x2+2x2+2x1000000=2000012个边权重。这还远远不够

其次,假设您确实希望将其视为一个分类问题,那么输入的y是一个整数,而输出是一个1000000长度的向量。我不知道在哪里,甚至不知道是否将这个整数转换为长度为1000000的一个热向量,这样输入和输出就可以进行比较

第三,对于标签相互排斥的多类别分类问题,即某人的工资不能同时为15000美元和18000美元,标准程序是给输出一个值。净效果是,在训练过程中,网络学习到只有1个输出节点,其他所有节点的值接近1和0


第四,通过将薪资预测视为一个分类问题,网络将预测的薪资与预期值相差1美元视为与预测的薪资相差1万美元一样糟糕。这显然不是事实。与其训练1000000节点输出,不如尝试使用relu激活来训练单个节点,以避免出现负值。然后将输出节点的值作为预测薪资,而不是argmax。

您可能需要更多数据。至少在几百个样本中,我希望是这样,但我已经通过多次复制和修改我的数据来验证了这一点,但都无济于事。谢谢你的意见!您可能需要更多数据。至少在几百个样本中,我希望是这样,但我已经通过多次复制和修改我的数据来验证了这一点,但都无济于事。谢谢你的意见!