Python 为什么模型在标准化后表现不佳?

Python 为什么模型在标准化后表现不佳?,python,tensorflow,machine-learning,neural-network,Python,Tensorflow,Machine Learning,Neural Network,我使用的是完全连接的神经网络,我使用的是标准化数据,这样每个样本值都在0到1之间。我在第一层使用了100个神经元,在第二层使用了10个神经元,在训练期间使用了近50个缺失样本。我想把我的数据分为两类。但我的网络性能太低,几乎49%的数据来自于训练和测试数据。我试图通过更改超参数的值来提高性能。但它不起作用。有人能告诉我,我应该怎么做才能获得更高的性能吗 x = tf.placeholder(tf.float32, [None, nPixels]) W1 = tf.Variable(tf.rand

我使用的是完全连接的神经网络,我使用的是标准化数据,这样每个样本值都在0到1之间。我在第一层使用了100个神经元,在第二层使用了10个神经元,在训练期间使用了近50个缺失样本。我想把我的数据分为两类。但我的网络性能太低,几乎49%的数据来自于训练和测试数据。我试图通过更改超参数的值来提高性能。但它不起作用。有人能告诉我,我应该怎么做才能获得更高的性能吗

x = tf.placeholder(tf.float32, [None, nPixels])
W1 = tf.Variable(tf.random_normal([nPixels, nNodes1], stddev=0.01))
b1 = tf.Variable(tf.zeros([nNodes1]))
y1 = tf.nn.relu(tf.matmul(x, W1) + b1)

W2 = tf.Variable(tf.random_normal([nNodes1, nNodes2], stddev=0.01))
b2 = tf.Variable(tf.zeros([nNodes2]))
y2 = tf.nn.relu(tf.matmul(y1, W2) + b2)

W3 = tf.Variable(tf.random_normal([nNodes2, nLabels], stddev=0.01))
b3 = tf.Variable(tf.zeros([nLabels]))
y = tf.nn.softmax(tf.matmul(y2, W3) + b3)

y_ = tf.placeholder(dtype=tf.float32, shape=[None, 2])

cross_entropy = -1*tf.reduce_sum(y_* tf.log(y), axis=1)    
loss = tf.reduce_mean(cross_entropy)

optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
correct_prediction = tf.equal(tf.argmax(y_,axis=1), tf.argmax(y, axis=1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

你的计算模型对“图像”一无所知,它只看到数字。所以,如果你用0-255的像素值来训练它,它已经学会了“光”的含义,“暗”的含义,以及如何将这些结合起来,为你提供你尝试的任何目标值

通过标准化,你可以强制所有像素为0-1。就模特儿而言,他们都黑得像黑夜一样。毫无疑问,它无法提取任何有意义的内容

您需要在培训和测试期间应用相同的输入规范化。


说到NN模型的标准化,最好将其标准化为零均值。

您问题的标题表明,它在您进行“标准化”之前就已经起作用了。你能具体说明发生了什么变化吗?是的,我的模型在没有标准化的情况下给出了98%的准确率。我已经对具有形状(样本、特征)的输入数据执行了规范化。我规范化了每个样本的特征,使得每个样本的特征范围从0到1。这是我对输入数据所做的唯一更改。在此之后,精确度突然下降。我想在规范化后提高性能数据的差异是什么?我没有检查差异。我应该检查每个样品吗?如果我将每个样本从0标准化为1,为什么我们会减少方差?如果性能是98%,为什么你会改变任何东西?我已经将这种标准化应用于训练集和测试集。假设我在一个样本中的输入值是-4到+4,那么通过标准化,我将它们以不同的比例从0到1移动。为什么我认为机器不能提取任何信息。我甚至试图通过添加不同的层和提供更多的数据来使模型复杂化,但精度仍然没有提高。我一定要实现最小-最大标准化。但是你用标准化值训练过模型吗?通过阅读你在问题下的评论,我认为你没有。是的,我用标准化值训练了模型。上面我提到的代码包含两个隐藏层。我改变了神经元的数量,也添加了大量的数据。但性能仍然太低。我想知道如何改进它们,这改变了一切,你应该这么说;-)但实际上,试着将它们标准化为零均值,例如to(并检查分布,可能有异常值严重影响最小-最大标准化)。而且,对于这样一个小的网络,
tanh
可以比
relu
工作得更好。最后,学习率调整通常会给您带来最大的好处。试着以几何方式降低它。一个接一个地改变。如果我规范化b/w-1,那么1类似于0:1意味着改变刻度。为什么我应该期望在这种情况下,网络会表现得更好?