【问题标题】:Why do my models shift between 100% accuracy and 60% accuracy?为什么我的模型会在 100% 准确率和 60% 准确率之间转换?
【发布时间】:2019-08-12 19:28:22
【问题描述】:

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

当我根据我的数据训练和评估模型时,我有时会获得 100% 的准确率,有时会获得 60% 的准确率(有些参数组合会导致 ~99%)。从训练 v 验证损失曲线来看,这些模型看起来并没有过度拟合,但我觉得奇怪的是,我有时会得到 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 多个数据窗口上进行训练

这是否意味着我的模型错误/无法正常工作?如果是这样,有什么解决办法吗?

【问题讨论】:

    标签: python keras classification conv-neural-network


    【解决方案1】:

    随机精度的几个问题

    1. 您的错误梯度未达到初始层! (您可以通过在 tensorboard 中绘制权重直方图来检查这一点) -> 解决方案: 尝试 batchNormalization 层
    2. 您的损失函数几乎是离散的,(发生在分类问题中,例如您的) -> 解决方案:
      • 如果有更多数据,请尝试更多数据 + 更多训练 epochs
      • 如果没有其他数据,尝试调整 adam 优化器的 bata1 beta1 (moment1) 参数(调整它将在几乎离散的损失中获得最佳收敛,通常 beta1=0.5 会在 CNN 中提供良好的结果)并调整学习率, (较低的学习率有较高的每次运行稳定准确率的机会,但在损失函数中摆脱局部最小值的机会较低(达到最佳点的机会较低),最好的方法是较高的学习率和一些衰减( Adam 优化器不需要衰减,这适用于 RMSProp 和一些类似的优化器。
    3. batch size:通常小batch size会使优化器收敛到局部最小值,解决方案用大batch size(128或更多)训练几个epoch,然后用较小batch size训练(但是不能低于 8,否则会导致结果不可靠)

    【讨论】:

    • 感谢您的回复,几个后续问题: 1. 您建议在哪里添加 batchNormalization 层以及为什么要添加该位置? 2. 目前我没有更多数据,但我通常在大约 10,000 多个样本上进行训练。 3. 我将如何在这个亚当优化器上实现衰减?
    • @Eric 1. 在卷积层之后,密集层通常不需要它,顺便说一下,我建议失去 100 个神经元密集层,它没用(你可以试试看准确性) 2 . 尝试更高的批量大小然后 3. 当我更新时,Adam 更新了它自己的学习率,这使得它不太适合这些情况,尝试衰减和学习率 的 RMSProp
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2019-08-31
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多