Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当training具有高精度,但model.evaluate()的精度较低时,如何改进模型?_Python_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python 当training具有高精度,但model.evaluate()的精度较低时,如何改进模型?

Python 当training具有高精度,但model.evaluate()的精度较低时,如何改进模型?,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,我正在从事一个处理传感器数据的项目。我从3个地方收集了传感器数据,并将数据存储为csv文件。大约有4000个样本。数据有X,Y,Z,我用它们作为特征,类是我的目标变量。目标是在数据集上建立一个分类模型。目标变量/标签为[1,2,3]。因为它是一个时间序列数据,所以我选择使用双向LSTM 数据分发: 在我训练我的模特之后 history3 = model.fit( X_train, y_train, epochs=35, batch_size=100, valid

我正在从事一个处理传感器数据的项目。我从3个地方收集了传感器数据,并将数据存储为csv文件。大约有4000个样本。数据有X,Y,Z,我用它们作为特征,类是我的目标变量。目标是在数据集上建立一个分类模型。目标变量/标签为[1,2,3]。因为它是一个时间序列数据,所以我选择使用双向LSTM

数据分发:

在我训练我的模特之后

history3 = model.fit(
    X_train, y_train,
    epochs=35,
    batch_size=100,
    validation_split = 0.1,
    shuffle=False
)
以下是我上一个历元给出的准确度和验证准确度:

Epoch 35/35
4002/4002 [==============================] - 3s 858us/step - loss: 0.0216 - acc: 0.9948 - val_loss: 0.3026 - val_acc: 0.9056
当我使用
model.evaluate(X_测试,y_测试)
时,它返回两个值的列表:
[5.144028138408701,0.43551796674728394]

所以问题是这两个值是什么? 我猜第一个值是MSE,第二个值是精度。如果我是对的,那么为什么我使用
.evaluate
时准确度这么低?我应该如何改进模型

附言。 更多信息

print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)

(4447, 24, 3) (4447, 3) (473, 24, 3) (473, 3)
数据是有序数据,因此我在分割期间使用
shuffle=True

df_train, df_test = train_test_split(df, test_size = 0.1, shuffle = True)

你对什么模型的猜测是正确的,第一个是损失,第二个是准确性。看起来你的模型太过合适了,尽管val_精度显示出了其他一些东西。 我建议检查数据集中两个类别的标签数量。我的意思是,也许你有一门课的90%,而另一门课只有10%。 如果是这种情况,那么可以使用sklearn做一件简单的事情(我猜您使用了sklearn.model\u selection中的train\u test\u split)。也就是说,您应该将参数stratify=y添加到train\u test\u split函数中。这有助于处理不平衡的数据集。
另外,您是否尝试过使用其他优化算法?您是否降低了学习率?

您对什么模型的猜测。评估回报是正确的,第一个是损失,第二个是准确性。看起来你的模型太过合适了,尽管val_精度显示出了其他一些东西。 我建议检查数据集中两个类别的标签数量。我的意思是,也许你有一门课的90%,而另一门课只有10%。 如果是这种情况,那么可以使用sklearn做一件简单的事情(我猜您使用了sklearn.model\u selection中的train\u test\u split)。也就是说,您应该将参数stratify=y添加到train\u test\u split函数中。这有助于处理不平衡的数据集。
另外,您是否尝试过使用其他优化算法?您是否降低了学习率?

我怀疑您的数据集高度不平衡。例如,如果类0的数据集为10000个样本,类1的数据集为1000个样本。假设您将其分为一个训练集和一个验证集。这两套系统仍将存在这种不平衡。现在,如果你训练你的网络,它会倾向于选择0类,验证数据结果会很好。如果网络总是预测0级,那么它的准确率将达到90%。现在如果你有一个平衡的测试集,比如说0类500个样本,1类500个样本 在测试集上运行model evaluate时,错误率很高。 我没有使用它,但我知道model.fit有一个名为class_weight的参数。这是一个字典,允许您根据类调整对损失函数的影响。在上面的示例中,您希望1类样本的权重是0类样本的10倍。然后创建一个类\权重字典,如下所示:

class_weight={0:.55, 1:5.5}

然后在model.fit中使用此选项。您可以做的其他事情是使用可调整的学习率,以最低的验证损失保存模型,并将其用于评估。使用Keras回调很容易做到这一点。可以设置回调模型检查点来监视验证丢失,并以最低的丢失保存模型。文件表明,如果损失在N个连续时期后未能减少,则可以设置ReducelRon平台回调来监控验证损失,并将学习减少一个因素。文档是

我怀疑您的数据集高度不平衡。例如,如果类0的数据集为10000个样本,类1的数据集为1000个样本。假设您将其分为一个训练集和一个验证集。这两套系统仍将存在这种不平衡。现在,如果你训练你的网络,它会倾向于选择0类,验证数据结果会很好。如果网络总是预测0级,那么它的准确率将达到90%。现在如果你有一个平衡的测试集,比如说0类500个样本,1类500个样本 在测试集上运行model evaluate时,错误率很高。 我没有使用它,但我知道model.fit有一个名为class_weight的参数。这是一个字典,允许您根据类调整对损失函数的影响。在上面的示例中,您希望1类样本的权重是0类样本的10倍。然后创建一个类\权重字典,如下所示:

class_weight={0:.55, 1:5.5}

然后在model.fit中使用此选项。您可以做的其他事情是使用可调整的学习率,以最低的验证损失保存模型,并将其用于评估。使用Keras回调很容易做到这一点。可以设置回调模型检查点来监视验证丢失,并以最低的丢失保存模型。文件表明,如果损失在N个连续时期后未能减少,则可以设置ReducelRon平台回调来监控验证损失,并将学习减少一个因素。文档是

数据看起来相当平衡,所以问题一定是其他原因。测试数据的分布是否相似?如何增加学习率??model.fit()中似乎没有选项。学习率在model.compile中的参数“optimizer”下设置。如果您想使用Adam,您需要像这样编写它。编译(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001)数据