【问题标题】:Accuracy of TensorFlow model changes a lot each time i run model.fit每次运行 model.fit 时,TensorFlow 模型的准确性都会发生很大变化
【发布时间】:2020-09-16 22:34:40
【问题描述】:

我的项目是尝试找出我是否可以根据陀螺仪和加速度计的数据预测在电话附近说话的人的性别。我有 315 个示例(每个示例 60 秒),每个示例有 2997 条线,其中每条线代表来自陀螺仪/加速度计 xyz 轴的矢量幅度。

我用相同的种子对输入和输出进行了混洗,并对输入数据进行了标准化。我在 60|20|20 上拆分数据。在这个测试中,我尝试从加速度计看是否有男性说话,所以输出是二进制的。

当我使用当前模型训练数据时,有时我得到的准确率高达 0.68 和低至 0.36,而损失几乎总是在 0.69 左右。我在 for 循环中运行了 10 次,平均准确率为 0.5,损失为 0.69。

第一个问题是我尝试了多种类型的模型、学习率、优化算法等,但平均而言我不太成功。我应该尝试循环神经网络吗?在哪里可以学习?

第二个问题是,如果我以 68% 的准确率训练模型,即使我知道平均值为 50%,是否可以说该模型的准确率为 68%?

model = tf.keras.Sequential()    
model.add(layers.Dense(512, activation='relu',input_shape = (2997,), kernel_regularizer=regularizers.l2(0.001)))
model.add(layers.Dropout(0.5))
for j in range(10) :
    model.add(layers.Dense(1024, activation='relu', kernel_regularizer=regularizers.l2(0.001)))
    model.add(layers.Dropout(0.5))

model.add(layers.Dense(1, activation='sigmoid'))

lr_schedule = tf.keras.optimizers.schedules.InverseTimeDecay(
  0.001,
  decay_steps=200,
  decay_rate=1,
  staircase=True)    

callbacks = [
             tf.keras.callbacks.EarlyStopping(
                 monitor='val_loss', patience = 20
             )
]

model.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate = lr_schedule), 
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), 
              metrics = ['accuracy'])

history = model.fit(
    train_vector_examples,
    train_vector_labels,
    validation_split = 0.25,
    epochs =80,
    callbacks=callbacks,
    verbose=0,
    shuffle=False
    )    

loss1, accuracy = model.evaluate(test_vector_examples, test_vector_labels)

【问题讨论】:

  • “第二个问题是,如果我以 68% 的准确率训练模型,即使我知道平均值为 50%,是否可以说模型的准确率为 68%?”当你知道平均工资是 3k 时,可以说你的工资是 4k 吗?这样做没有意义,不是吗?
  • 但这不是很好的类比。如果输出模型显示它具有 68% 的准确度,则意味着它应该具有基于 val 和测试集的准确度。在下一次迭代中,它可以以不同的方式随机化权重并获得不同的准确度。在我拟合模型之后,它不像“薪水”类比那样独立。

标签: python tensorflow machine-learning keras


【解决方案1】:

这是我自己处理不同类型数据的经验;要为您的问题找到好的解决方案,您可能应该在提出任何模型/算法之前仔细研究数据的特征。

  • 第一个问题:一般来说,RNN 适用于具有时间依赖性的数据,或者换句话说,适用于输入顺序很重要的情况(例如时间序列、文本)。因此,我认为 RNN 可能不是您的数据类型的最佳选择,因为我认为在您的数据集中排序并不重要。
  • 第二个问题:这实际上取决于您要解决的问题的难度;但在我看来 68% 相当低,因为 50% 基本上与随机选择相同。您可能希望进一步提高准确性。

另外,从你的解释中,我可以看到每个陀螺仪/加速度计输入的形状都是 3 级 (xyz),所以也许你可以尝试一些 CNN 架构,看看效果如何。

【讨论】:

  • 感谢您的回复!我是个新手,因为到目前为止我只从理论上研究深度学习。你能解释几件事。我如何研究数据的特征以及从中可以发现什么?至于 RNN,我的数据具有时间依赖性。它的 60 年代记录了 50Hz 的陀螺仪数据(因此 2997 行,每秒 50 行)。 RNN 不应该更好地进行预成型,因为它可以检测模式(连续几个数字)?至于第二个问题,我知道我应该提高准确性,但我想知道我是否应该拟合我的模型(比如说 10 次)并对其进行平均并使用该值或我得到的最佳 model.fit() 值?
  • 关于RNN,我误解了你的数据集;因为您的数据具有时间依赖性 RNN(例如 LSTM)可能工作得很好,因为众所周知它非常擅长处理长期依赖性。我认为您当前基于收敛损失的 model.fit() 策略是正确的,只要您将数据集干净地拆分为不同的训练/验证/测试集。
  • 通过数据分析我的意思是检查你的类平衡(每个类/标签是否有相似数量的数据),可能会根据数据的获取方式进行一些平滑/降噪,甚至可能必要时进行一些异常检测和删除。但也要小心,对数据集的某些更改可能会产生过度拟合问题,因此这取决于您对数据的经验和实验。有时,即使以不同的方式绘制数据,也可以让您深入了解数据集。
  • 至于拆分数据,正如我上面所说,我有 60% 的训练集、20% 的验证集和 20% 的测试集。对于 RNN,我尝试了几个模型,但没有运气。我对 RNN 的了解不多,因为我只为这种情况学习了它。我尝试寻找类似的案例,但大多数案例都是为了预测下一个值。
  • 关于数据分析我尽量让每个班级平等分享数据。我没有尝试平滑/降噪,因为我不确定这将如何在我的数据集上工作。过度拟合通常不是问题,因为我认为它的欠拟合问题而且我想要的东西对于经典的深度神经网络来说太复杂而无法学习,同时没有足够的关于 RNN 的知识来定制我的问题。
猜你喜欢
  • 2021-02-11
  • 2016-05-24
  • 1970-01-01
  • 2020-11-06
  • 2012-05-18
  • 2020-10-31
  • 2018-07-12
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多