【问题标题】:one class classification with keraskeras 的一类分类
【发布时间】:2019-01-23 06:59:10
【问题描述】:

我正在尝试建立一个模型来检测输入图像是否是某物(例如,狗与否)。我正在用 keras 编码,但准确性很差。你有什么想法来正确调整这个吗?或者我应该使用 keras 以外的其他工具来解决一类分类问题?非常感谢您。

这是我到目前为止编写的代码和输出。

train_dir = './path/to/train_dir'
vali_dir = './path/to/validation_dir'

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=False)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir, 
        target_size=(150, 150), 
        batch_size=20,
        class_mode='binary')

vali_datagen = ImageDataGenerator(rescale=1./255)

vali_generator = vali_datagen.flow_from_directory(
        vali_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

model = Sequential()
model.add(Conv2D(16, 3, activation='relu', input_shape=(150, 150, 3)))
model.add(MaxPool2D(pool_size=2))
model.add(Conv2D(32, 3, activation='relu'))
model.add(MaxPool2D(pool_size=2))
model.add(Conv2D(64, 3, activation='relu'))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))

model.compile(
        loss='binary_crossentropy',
        optimizer=RMSprop(lr=0.003),
        metrics=['acc']
)

history = model.fit_generator(
        train_generator,
        steps_per_epoch=100,
        epochs=8,
        verbose=2,
        validation_data=vali_generator,
        validation_steps=20
)

输出:

Found 3379 images belonging to 2 classes.
Found 607 images belonging to 2 classes.
Epoch 1/8
 - 136s - loss: 7.6617 - acc: 0.5158 - val_loss: 10.5220 - val_acc: 0.3400
Epoch 2/8
 - 124s - loss: 7.7837 - acc: 0.5118 - val_loss: 10.5220 - val_acc: 0.3400
.......and this is just terrible.

【问题讨论】:

  • 您似乎只训练了两个时期,所以我不希望它在那里有更高的准确性。其他需要考虑的事情是:您是否尝试过使用超参数?另外,您是否分析过您的数据(狗/非狗图片的不平衡分布)?
  • @DocDriven 感谢您的评论。抱歉,实际上我已经训练了 8 个 epoch,但其余的和前两个一样糟糕,所以我省略了它。似乎没有不平衡。我会尝试超参数。
  • 这不是分类问题,而是对象检测问题。有大量关于如何在线实现这一点的文档。希望对您有所帮助。

标签: python tensorflow image-processing keras classification


【解决方案1】:

我尝试更改和调整参数和训练数据,但没有得到理想的结果。我遇到了使用Isolation forest 的一类分类。这被称为新颖性检测,在我使用它之后,它的表现非常出色。感谢那些在 cmets 中给我建议的人,我很抱歉自己回答。

【讨论】:

  • 嗨,我遇到了同样的问题。你能提供更多信息吗?
  • 嗨@Franva,你知道了吗?
  • @AnshumanKumar 我最终使用了 2 个类,一个类用于您感兴趣的事物,例如就我而言,它是狗,其他一切都是一类。我知道应该有其他解决方案,例如异常检测,但我没有尝试过。如果你设法让它工作,请告诉我:)
【解决方案2】:

如果输入特征之间没有依赖关系,隔离森林是一种很好的异常检测算法。但是,如果您的输入是时间序列信号或图像,则最好使用 RNN 或 CNN 等方法。

我最近遇到了一个异常检测模型,名为一类 CNN。如果您的输入是图像或时间序列信号,则效果很好。这是他们的github链接:

https://github.com/raghavchalapathy/oc-nn

【讨论】:

    【解决方案3】:

    类标签似乎有问题 - 它们与数据的关系是否正确?您可以检查它或发布 ImageDataGenerator 代码

    【讨论】:

    • 图像根据目录名称进行标记。就我而言,我有“正确”文件和“错误”文件。我用ImageDataGenerator.class_indices检查了标签,这里似乎没问题。
    • 我遇到了类似的错误。如果准确性在几个时期内没有改变(我的意思是,验证显示 same 数字)分类器在验证期间预测单个类并在我的情况下忽略其他类。 IE。如果您的数据集中有 30% 的“正”样本,并且您的分类器始终预测为“正”,则分类器的验证准确度等于 0.3。就我而言,数据标签存在错误,下一次只是糟糕的数据。所以分类器无法对其进行学习。
    【解决方案4】:

    即使从第一个 epoch 开始,训练准确度和验证准确度之间也存在很大差异。 对我来说,这看起来像是一个过度训练的问题。所以你应该给你的网络更多的正则化。喜欢更多的 Dropoutlayers 或 kernel_regularizer 在你的卷积层中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多