为什么我的模型在 100% 准确度和 60% 准确度之间切换?



我正在尝试使用一维卷积神经网络将数据分类为步行或跑步(以及最终的其他活动),这些数据来自大腿和小腿上的 x、y 和 z 加速度计和陀螺仪数据(6 个特征),并扫描不同的参数。

当我根据数据训练和评估模型时,我有时会获得 100% 的准确性,有时获得 60% 的准确率(有一些参数组合导致 ~99%)。这些模型看起来不像是从训练与验证损失曲线过度拟合的,但我觉得很奇怪,我有时会得到 100.000%,然后其他模型又这么低。

为了看看是否总是如此,我训练和评估每个模型 15 次,并取平均值和标准差。大多数参数组合都表现出此行为,有些则不然。

例如(末尾的值是针对看不见的数据的精度):

>Standardize=False Filter=16 Kernel=3 Batch=32: #1: 59.701
>Standardize=False Filter=16 Kernel=3 Batch=32: #2: 100.000
>Standardize=False Filter=16 Kernel=3 Batch=32: #3: 100.000
>Standardize=False Filter=16 Kernel=3 Batch=32: #4: 99.975
>Standardize=False Filter=16 Kernel=3 Batch=32: #5: 100.000
>Standardize=False Filter=16 Kernel=3 Batch=32: #6: 40.299
>Standardize=False Filter=16 Kernel=3 Batch=32: #7: 100.000
>Standardize=False Filter=16 Kernel=3 Batch=32: #8: 59.701
>Standardize=False Filter=16 Kernel=3 Batch=32: #9: 59.701
>Standardize=False Filter=16 Kernel=3 Batch=32: #10: 100.000
>Standardize=False Filter=16 Kernel=3 Batch=32: #11: 59.701
>Standardize=False Filter=16 Kernel=3 Batch=32: #12: 100.000
>Standardize=False Filter=16 Kernel=3 Batch=32: #13: 59.701
>Standardize=False Filter=16 Kernel=3 Batch=32: #14: 59.701
>Standardize=False Filter=16 Kernel=3 Batch=32: #15: 99.975

这是我正在使用的模型:

model = models.Sequential()
model.add(Conv1D(filters=filt, kernel_size=kernel, activation='relu',
input_shape=(n_timesteps, n_features)))
model.add(Conv1D(filters=filt, kernel_size=kernel, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(layers.Flatten())
model.add(layers.Dense(100, activation='relu'))
model.add(layers.Dense(n_activities, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit network
history = model.fit(X_train, y_train, validation_data=(X_val, y_val),
epochs=epochs, batch_size=batch_size, verbose=verbose)
# evaluate model
_, accuracy = model.evaluate(X_val, y_val, batch_size=batch_size, verbose=0)

我扫描过滤器大小 (16, 32)、内核大小 (3, 5) 和批量大小 (16,32),我还检查标准化和非标准化数据。

我还在训练大约 10,000+ 个数据窗口

这是否意味着我的模型错误/无法正常工作?如果是这样,是否有任何解决方法?

随机精度的几个问题

  1. 您的误差梯度没有达到初始层!(您可以通过在张量板中绘制权重的直方图来检查这一点)->解决方案:尝试批处理归一化层
  2. 你的损失函数几乎是离散的,(发生在分类问题中,就像你一样) ->解决方案:
    • 如果有更多数据,请尝试更多数据 + 更多训练时期
    • 如果没有其他数据,请尝试调整 Adam 优化器的 Bata1 beta1 (moment1) 参数(调整它将在几乎离散的损失中给出最佳收敛,通常 beta1=0.5 将在 CNN 中提供良好的结果)并玩学习率,(较低的学习率每次运行稳定精度的机会较高,但在损失函数中摆脱局部最小值的机会较低(达到最佳点的机会较低), 最好的方法是提高学习率和一些衰减(Adam 优化器不需要衰减,这是针对 RMSProp 和一些类似的优化器)。
  3. 批量大小
  4. :通常小批量大小使优化器收敛到局部最小值,解决方案:用大批量(128 或更多)训练几个 epoch,然后用较小的批量大小(但不低于 8,这将使结果不可靠)

最新更新