【问题标题】:CNN model for binary classification用于二进制分类的 CNN 模型
【发布时间】:2020-12-15 08:39:48
【问题描述】:

我们是数据科学(和编程)的新手,我们正在尝试构建一个用于二进制分类(男性 - 女性)的 cnn 模型。我们的准确度很好,为 0.97,但验证准确度为 0.56(我们认为存在过度拟合)。我们有 4706 张图像 - 70% 用于训练,30% 用于测试/验证。

model = Sequential()
model.add(Conv2D(128, (3, 3), input_shape=x_data_np.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

我们如何提高验证的准确性?我们是否正确设置了模型参数?非常感谢。

【问题讨论】:

    标签: python tensorflow keras conv-neural-network


    【解决方案1】:

    您的模型似乎存在过拟合问题。考虑为您的模型添加正则化。尝试在 Dense(64) 层之后添加 Dropout 层,或者在 Dense 层中添加 l2 正则化。如果这对您没有帮助,请尝试数据增强。

    此时,您可能应该通过调整超参数(最后一层中的神经元数量、层数、内核大小、内核数量等)来迭代改进您的模型

    【讨论】:

      【解决方案2】:

      我将首先在每个但最后一个 Activation 层之后添加 BatchNormalization 层。这将增强正则化,并有望提高验证准确性。

      【讨论】:

        【解决方案3】:

        您似乎过度拟合了很多。您的数据集非常小,而且您使用的层太多,没有丢失也没有批量标准化。

        我提出了四种解决方法:

        1.使用 Dropout

        Dropout 以一定的概率随机关闭神经元(通常值在 0.1-0.4 范围内)。这是减少过拟合的好方法。

        # The dropout probability should be tuned.
        keras.layers.Dropout(0.3)
        

        Dropout 层通常被添加到网络中的顶部(即后面)层。 dropout 概率本身就是一个可以调整的超参数。

        2。执行数据增强

        数据增强是一种人为地增加数据量的技术。它执行诸如平移、剪切、旋转和镜像等变换。 Keras 提供了ImageDataGenerator 类来轻松处理这个问题。

        将您的数据组织到训练、验证和测试目录中。每个目录都必须包含两个类的子目录 - 男性和女性。

        目录树将如下所示(假设您正在对男性和女性进行二元分类):

        . ├── 测试 │ ├── 男 │ └── 女 ├── 火车 │ ├── 男 │ └── 女 └── 验证 ├── 男 └── 女

        然后初始化用于训练和测试的数据生成器,如果需要,将图像从 0-255 重新缩放到 0-1 范围。

        # Performing data augmentation only on the training set.
        train_datagen = keras.preprocessing.image.ImageDataGenerator(
            rescale=1./255
            # Performing data augmentation
            rotation_range=20,
            width_shift_range=0.1,
            height_shift_range=0.1,
            shear_range=10,
            horizontal_flip=True, # Horizontally flipped version is still an image of a person.
        )
        # Data generator for validation and testing.
        test_datagen = keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
        

        然后从flow_from_directory 方法中批量读取训练、验证和测试图像。

        train = train_datagen.flow_from_directory('data/train', target_size=(128, 128), batch_size=32)
        validation = test_datagen.flow_from_directory('data/validation', target_size=(128, 128), batch_size=32)
        test = test_datagen.flow_from_directory('data/test', target_size=(128, 128), batch_size=32)
        

        一旦您执行了上述代码,请确保它告诉您它找到了正确数量的图像和正确的类数。

        然后,您可以将 trainvalidationtest 批次直接传递给 keras 模型中的 fit 方法。 确保在训练时指定 steps_per_epoch validation_steps 的数量。这是因为生成器永远运行,不断生成图像,所以fit 需要知道何时停止。出于同样的原因,请确保您也将 steps 参数提供给 predict 方法。

        参考: Keras docs

        3.使用提前停止

        当验证准确性开始增加时,进行回调以停止。还可以制作学习曲线(训练和验证损失与 epoch 的关系图),以检查您的模型从哪里开始过度拟合。

        callback = keras.callbacks.EarlyStopping()
        

        您可以将参数传递给回调。检查文档。

        参考:Keras docs

        将此回调传递给您模型的fit 方法,并与您的其他回调一起列出。

        4.使用批量标准化

        添加批量归一化层也有助于减少过度拟合。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-02
          • 2018-10-01
          • 2021-01-19
          • 2023-03-04
          • 1970-01-01
          • 2020-02-18
          • 2016-05-18
          相关资源
          最近更新 更多