如何提高模型的准确性? (猫狗大战图像识别)
How to increase my models' accuracy? (Cats vs Dogs image recognition)
我的模型已达到 71% 的准确率,但它几乎总是只将图片标记为 "dog"(约 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 个时期(约 7 小时的培训)。我正在使用学习率 = 0.001 的 Adam 优化器(增加 lr 会导致过度拟合)。
我应该缩小我的测试集吗?我有太多的辍学吗?我的参数可以吗?
您的参数没问题,但您正在输入 NN 200x200 图像,这可能会导致一些欠拟合(即:NN 一次输入过多数据,因此性能不佳)。
要解决此问题,请尝试使图像的大小更接近 50x50,这应该会显着加快训练速度。您可以使用一个简单的 python 脚本使用 glob 和 PIL 库来执行此操作,默认情况下应该安装这些库。如果 PIL 没有安装,运行 pip install Pillow
,应该安装它。
您也可以尝试使用 numpy 将它们转换为黑白。
如果您查看数据科学页面,可以找到一些很好的神经网络架构示例,您可以使用它们来改进您的模型。例如,您可以使用带有残差训练的类似 ResNet 的结构,或者您可以使用类似具有不同 Conv2D 内核大小的网络合并在一起的 Inception。这允许使用不同的内核提取 "different size" 特征并将信息合并在一起。此外,我建议您将激活从 "relu" 更改为 "selu" 以避免神经元死亡并添加一些非线性。并查看 SeparableConv2D 层。如果以正确的方式使用,它们有助于加快训练速度并提高性能。
还建议保留模型的 dropout 层 "at the end",这样您就可以让第一层学习特征并使用最后一层来解决泛化问题并避免过度拟合。
我的模型已达到 71% 的准确率,但它几乎总是只将图片标记为 "dog"(约 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 个时期(约 7 小时的培训)。我正在使用学习率 = 0.001 的 Adam 优化器(增加 lr 会导致过度拟合)。 我应该缩小我的测试集吗?我有太多的辍学吗?我的参数可以吗?
您的参数没问题,但您正在输入 NN 200x200 图像,这可能会导致一些欠拟合(即:NN 一次输入过多数据,因此性能不佳)。
要解决此问题,请尝试使图像的大小更接近 50x50,这应该会显着加快训练速度。您可以使用一个简单的 python 脚本使用 glob 和 PIL 库来执行此操作,默认情况下应该安装这些库。如果 PIL 没有安装,运行 pip install Pillow
,应该安装它。
您也可以尝试使用 numpy 将它们转换为黑白。
如果您查看数据科学页面,可以找到一些很好的神经网络架构示例,您可以使用它们来改进您的模型。例如,您可以使用带有残差训练的类似 ResNet 的结构,或者您可以使用类似具有不同 Conv2D 内核大小的网络合并在一起的 Inception。这允许使用不同的内核提取 "different size" 特征并将信息合并在一起。此外,我建议您将激活从 "relu" 更改为 "selu" 以避免神经元死亡并添加一些非线性。并查看 SeparableConv2D 层。如果以正确的方式使用,它们有助于加快训练速度并提高性能。
还建议保留模型的 dropout 层 "at the end",这样您就可以让第一层学习特征并使用最后一层来解决泛化问题并避免过度拟合。