【问题标题】:How to increase my models' accuracy? (Cats vs Dogs image recognition)如何提高我的模型的准确性? (猫对狗图像识别)
【发布时间】:2020-10-03 20:38:27
【问题描述】:

我的模型已达到 71% 的准确率,但它几乎总是将图片标记为“狗”(约 67% 的图片是狗)。我的训练数据集包含 3680 张图片,测试数据集包含 3670 张图片。

model = Sequential()
model.add(Conv2D(filters=64, kernel_size=(3, 3),activation='relu', padding="same", input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(filters=128, kernel_size=(3, 3),activation='relu', padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(filters=256, kernel_size=(3, 3),activation='relu', padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Dropout(0.3))
model.add(Conv2D(filters=512, kernel_size=(3, 3),activation='relu', padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Dropout(0.35))
model.add(Conv2D(filters=512, kernel_size=(3, 3),activation='relu', padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2,2)))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

我正在将图片大小调整为 200x200 方格,并在训练前对数据进行洗牌。 我已将其设置为 64 个批量大小和 60 个 epoch(约 7 小时的训练)。我正在使用学习率 = 0.001 的 Adam 优化器(增加 lr 会导致过度拟合)。 我应该缩小我的测试集吗?我有太多的辍学?我的参数还好吗?

【问题讨论】:

    标签: python keras model classification image-recognition


    【解决方案1】:

    您的参数很好,但您输入的是 NN 200x200 图像,这可能会导致一些拟合不足(即:NN 一次输入的数据过多,因此性能不佳)。

    要解决此问题,请尝试将图像尺寸设置为更像 50x50,这样可以显着加快训练速度。您可以使用 glob 和 PIL 库通过一个简单的 python 脚本来执行此操作,默认情况下应该安装这些库。如果没有安装PIL,运行pip install Pillow,它应该会安装它。

    您也可以尝试使用numpy 将它们转换为黑白。

    【讨论】:

    • 我将它们调整为 50x50,确实提高了速度,但是我的准确率下降到了 69%。
    • 也许您应该将它们全部设为黑白(即:保留 alpha 并将所有其他值设置为 255),您可以让它训练更长时间。
    • “保留 alpha”是指通道应该设置为 2 而不是 3? img = img.convert('LA') 喜欢这样吗?
    • 是的,应该这样做。
    • 是的,改变大小和颜色有很大帮助,现在我的准确率达到了 82%。谢谢!
    【解决方案2】:

    如果您查看数据科学页面,这里有一些很好的神经网络架构示例,您可以使用它们来改进您的模型。例如,您可以使用带有残差训练的 ResNet 类结构,或者您可以使用具有不同 Conv2D 内核大小的 Inception 类网络合并在一起。这允许使用不同的内核提取“不同大小”的特征并将信息合并在一起。另外我建议您将激活从“relu”更改为“selu”,以避免神经元死亡并添加一些非线性。还可以看看 SeparableConv2D 层。它们有助于加快训练速度,如果使用得当,可以提高性能。

    还建议将 dropout 层留在模型的“末尾”,以便让第一层学习特征并使用最后一层来解释泛化并避免过度拟合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 2020-03-21
      相关资源
      最近更新 更多