TensorFlow:神经网络在训练集和测试集上的准确率始终为 100%

     2023-03-13     43

关键词:

【中文标题】TensorFlow:神经网络在训练集和测试集上的准确率始终为 100%【英文标题】:TensorFlow: Neural Network accuracy always 100% on train and test sets 【发布时间】:2018-02-21 14:09:53 【问题描述】:

我创建了一个 TensorFlow 神经网络,它有 2 个隐藏层,每个隐藏层有 10 个单元,每个单元使用 ReLU 激活和 Xavier 初始化作为权重。输出层有 1 个单元输出二进制分类(0 或 1),使用 sigmoid 激活函数根据输入特征分类它是否相信泰坦尼克号上的乘客幸存下来。

(唯一省略的代码是 load_data 函数,它填充了程序后面使用的变量 X_train、Y_train、X_test、Y_test)

参数

# Hyperparams 
learning_rate = 0.001
lay_dims = [10,10, 1]

# Other params
m = X_train.shape[1] 
n_x = X_train.shape[0]
n_y = Y_train.shape[0]

输入

X = tf.placeholder(tf.float32, shape=[X_train.shape[0], None], name="X")
norm = tf.nn.l2_normalize(X, 0) # normalize inputs

Y = tf.placeholder(tf.float32, shape=[Y_train.shape[0], None], name="Y")

初始化权重和偏差

W1 = tf.get_variable("W1", [lay_dims[0],n_x], initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.get_variable("b1", [lay_dims[0],1], initializer=tf.zeros_initializer())

W2 = tf.get_variable("W2", [lay_dims[1],lay_dims[0]], initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.get_variable("b2", [lay_dims[1],1], initializer=tf.zeros_initializer())

W3 = tf.get_variable("W3", [lay_dims[2],lay_dims[1]], initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.get_variable("b3", [lay_dims[2],1], initializer=tf.zeros_initializer())

转发道具

Z1 = tf.add(tf.matmul(W1,X), b1)
A1 = tf.nn.relu(Z1)

Z2 = tf.add(tf.matmul(W2,A1), b2)
A2 = tf.nn.relu(Z2)

Y_hat = tf.add(tf.matmul(W3,A2), b3)

BackProp

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=tf.transpose(Y_hat), labels=tf.transpose(Y)))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

会话

# Initialize
init = tf.global_variables_initializer()

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

    # Normalize Inputs
    sess.run(norm, feed_dict=X:X_train, Y:Y_train)

    # Forward/Backprob and update weights
    for i in range(10000):
        c, _ = sess.run([cost, optimizer], feed_dict=X:X_train, Y:Y_train)
        if i % 100 == 0:
            print(c)

    correct_prediction = tf.equal(tf.argmax(Y_hat), tf.argmax(Y))

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    print("Training Set:", sess.run(accuracy, feed_dict=X: X_train, Y: Y_train))
    print("Testing Set:", sess.run(accuracy, feed_dict=X: X_test, Y: Y_test))

在运行 10,000 次训练后,成本每次下降,因此表明 learning_rate 还可以,并且成本函数看起来正常。然而,在训练之后,我所有的 Y_hat 值(对训练集的预测)都是 1(预测乘客幸存)。所以基本上预测只是为每个训练示例输出 y=1。

另外,当我在 Y_hat 上运行 tf.argmax 时,结果是一个全 0 的矩阵。当 tf.argmax 应用于 Y(ground truth 标签)时也会发生同样的事情,这很奇怪,因为 Y 包含训练示例的所有正确标签。

非常感谢任何帮助。谢谢。

【问题讨论】:

我不明白“看起来我来自 Y_hat 的所有数据都是 1 或接近 1,我训练模型的时间越长,我在 Y_hat 和 Y 上的所有 argmax 值(其中有0 或 1) 的基本事实标签显示为 0。”这句话非常令人困惑。你能改写一下吗? 刚刚进行了编辑。这样更好吗? 【参考方案1】:

我假设您的 Y_hat 是一个 (1,m) 矩阵,其中 m 是训练示例的数量。然后tf.argmax(Y_hat) 将全部为 0。根据 tensorflow 文档,argmax

返回张量轴上具有最大值的索引

如果不传入axis,则将axis设置为0。由于axis 0只有一个值,因此返回的索引始终为0。

【讨论】:

帮助很大。我认为我对 argmax 的使用是我在网上找到的每个准确度示例的产物,这些示例用于使用各种“one_hot”标签评估网络。示例通常使用 tf.argmax(foo, 1) 来给出在 one_hot 向量中选择了哪个标签【参考方案2】:

我知道我迟到了,但我还要指出,由于您的标签矩阵的形状为 (n,1),即只有 1 个类可以预测,因此,交叉熵没有意义.在这种情况下,您应该使用不同的东西来计算成本(可能是均方误差或类似的东西)。 我最近在做大学项目时遇到了类似的问题,我找到了一个解决方法,我把这个二进制输出变成了 2 个类,比如存在和缺席,所以如果它存在,它就是 [1,0]。我知道这不是最好的方法,但当您需要立即工作时,它会很有帮助。

【讨论】:

您当时可能一直在使用分类交叉熵损失。二元交叉熵适用于二元分类问题 是的,有道理

交叉验证

...具体来说就是将整个数据集划分为若干部分,一部分用以训练模型、一部分用以测试最终模型的优劣、一部分验证模型结构和超参数。  交叉验证的目标是确定一个原数据集的子集,去限制ML模型在训练阶段的一些问题... 查看详情

验证集与测试集有啥区别?为啥要分训练集、验证集和测试集?

...一般用于进一步确定模型中的超参数(例如正则项系数、神经网络中隐层的节点个数,k值等),而测试集只是用于评估模型的精确度(即泛化能力)。    举个例子:假设建立一个BP神经网络,对于隐含层的节点数... 查看详情

我可以在整个数据集上使用 StandardScaler(),还是应该分别在训练集和测试集上计算?

...可以在整个数据集上使用StandardScaler(),还是应该分别在训练集和测试集上计算?【英文标题】:CanIuseStandardScaler()onwholedataset,orshouldIcalculateontrainandtestsetsseparately?【发布时间】:2021-06-0323:33:49【问题描述】:我正在为大约100个连... 查看详情

模型评估:模型状态评估

 模型状态过拟合和欠拟合 过拟合:在训练集上的准确率较高,而在测试集上的准确率较低欠拟合:在训练集和测试集上的准确率均较低学习曲线(LearningCurves)1)概念概述学习曲线就是通过画出不同训练集大小时训练集和... 查看详情

r语言plotly可视化:使用plotly可视化简单线性回归模型的回归线使用不同颜色区分训练集和测试集可视化分析模型在测试集上的泛化性能(linearregressionplots)

R语言plotly可视化:使用plotly可视化简单线性回归模型的回归线、使用不同颜色区分训练集和测试集、可视化分析模型在测试集上的泛化性能(linearregressionplots)目录 查看详情

用tensorflow搭建简单神经网络测试iris数据集和mnist数据集(代码片段)

1.步骤第一步:import相关模块,如importtensorflowastf第二步:指定输入网络的训练集和测试集,如指定训练集的输入x_train和标签y_train,测试集的输入x_test和标签y_test。 第三步:逐层搭建网络结构,model=tf.keras.models.Sequential()。&n... 查看详情

为什么神经网络模型在测试集上的准确率高于训练集上的准确率?

类似下图:或者下图:来自:吴恩达机器学习Regularization部分。如上图所示,有时候我们做训练的时候,会得到测试集的准确率或者验证集的准确率高于训练集的准确率,这是什么原因造成的呢?经过... 查看详情

如何评估不同模型在一个数据集上的性能?

...est、CNN等,我只有一个数据集。因此,我将数据集拆分为训练集和测试集,并在该数据集上使用训练数据训练不同的模型,并使用测试数据集进行测试。我的问题:我能否仅 查看详情

r语言构建随机森林模型randomforest分类模型并评估模型在测试集和训练集上的效果(accurayf1偏差deviance):随机森林在bagging算法的基础上加入了列采样(分枝特征随机)

R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray、F1、偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)目录 查看详情

r语言基于bagging算法(融合多个决策树)构建集成学习bagging分类模型并评估模型在测试集和训练集上的分类效果(accurayf1偏差deviance):bagging算法与随机森林对比

R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比目录 查看详情

tensorflow训练mnist数据集——卷积神经网络(代码片段)

   前面两篇随笔实现的单层神经网络 和多层神经网络, 在MNIST测试集上的正确率分别约为90%和96%。在换用多层神经网络后,正确率已有很大的提升。这次将采用卷积神经网络继续进行测试。 1、模型基本结构 ... 查看详情

svm模型进行分类预测时的参数调整技巧

...围是否合理正常来说,当我们参数在合理范围时,模型在训练集和测试集的准确率都比较高;当模型在训练集上准确率比较高,而测试集上的准确率比较低时,模型处于过拟合状态;当模型训练集和测试集上准确率都比较低,模... 查看详情

深度学习正则化---提前终止

提前终止??在对模型进行训练时,我们可以将我们的数据集分为三个部分,训练集、验证集、测试集。我们在训练的过程中,可以每隔一定量的step,使用验证集对训练的模型进行预测,一般来说,模型在训练集和验证集的损失变... 查看详情

ai-mlcc06-训练集和测试集(trainingandtestsets)

...se/training-and-test-sets1-拆分数据可将单个数据集拆分为一个训练集和一个测试集。训练集-用于训练模型的子集。测试集-用于测试训练后模型的子集。训练集的规模越大,模型的学习效果越好。测试集规模越大,对于评估指标的信... 查看详情

tensorboard:可视化学习

当使用Tensorflow训练大量深层的神经网络时,我们希望去跟踪神经网络的整个训练过程中的信息,比如迭代的过程中每一层参数是如何变化与分布的,比如每次循环参数更新后模型在测试集与训练集上的准确率是如何的,比如损... 查看详情

当我在 Lasso Regression 中拆分训练集和测试集时,R^2 为负数

】当我在LassoRegression中拆分训练集和测试集时,R^2为负数【英文标题】:R^2isnegativewhenIsplittrainandtestsetinLassoRegression【发布时间】:2020-12-0619:19:43【问题描述】:我尝试用原油价格运行Lasso回归,当我拆分为训练集和测试集时,我... 查看详情

Tensorflow MNIST 教程 - 测试精度非常低

】TensorflowMNIST教程-测试精度非常低【英文标题】:TensorflowMNISTtutorial-TestAccuracyverylow【发布时间】:2017-09-2015:49:36【问题描述】:我从tensorflow开始,一直遵循这个标准MNISTtutorial。但是,与预期的92%准确度相比,在训练集和测试... 查看详情

模型训练技巧

模型训练技巧神经网络模型设计训练流程图1-1神经模型设计流程 当我们设计并训练好一个神经网络之后,需要在训练集上进行验证模型效果是否良好。这一步的目的在于判断模型是否存在欠拟合;在确定已经在训练集上拟合... 查看详情