【问题标题】:Tensorflow Keras poor accuracy on image classification with more than 30 classesTensorflow Keras 对超过 30 个类别的图像分类准确率低
【发布时间】:2020-10-11 09:09:45
【问题描述】:

我在使用 Keras 进行图像分类时遇到问题。我的准确率总是很差,只有 0.02。我尝试关注cat and dog classification,它的准确度为 0.8,但在我的情况下,它无法使用 30 个类。

假设我有大约 100K 图像的数据集,并分为 30 个类。我将其分成 80% 用于训练和 20% 验证。

结构文件夹是这样的。

|-train
|---category1
|---category2
|---category3
|---category4
|---.....
|---category30
|
|-validation
|---category1
|---category2
|---category3
|---category4
|---.....
|---category30

train 文件夹中的每个类别包含大约 2000 到 4000 张图像。

我的模型

model = tf.keras.Sequential([    
    Conv2D(kernel_size=3, filters=16, padding='same', activation='relu', input_shape=[150,150, 3]),
    Conv2D(kernel_size=3, filters=30, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),
    Conv2D(kernel_size=3, filters=60, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),
    Conv2D(kernel_size=3, filters=90, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),
    Conv2D(kernel_size=3, filters=110, padding='same', activation='relu'),
    MaxPooling2D(pool_size=2),
    Conv2D(kernel_size=3, filters=130, padding='same', activation='relu'),
    Conv2D(kernel_size=1, filters=40, padding='same', activation='relu'),
    GlobalAveragePooling2D(),
    Dense(1,'sigmoid'),
    Activation('softmax')
])

model.compile(optimizer=keras.optimizers.Adam(lr=.00001),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])

训练数据集

history = model.fit_generator(
      train_generator,
      steps_per_epoch=100,  
      epochs=10,
      validation_data=validation_generator,
      validation_steps=50, 
      verbose=2)

而且我的准确率总是很低,比如 0.02 或 0.03

Epoch 6/10
100/100 - 172s - loss: -1.8906e+01 - accuracy: 0.0265 - val_loss: -1.8923e+01 - val_accuracy: 0.0270
Epoch 7/10
100/100 - 171s - loss: -1.8773e+01 - accuracy: 0.0230 - val_loss: -1.8396e+01 - val_accuracy: 0.0330
Epoch 8/10
100/100 - 170s - loss: -1.8780e+01 - accuracy: 0.0295 - val_loss: -1.9882e+01 - val_accuracy: 0.0180
Epoch 9/10
100/100 - 170s - loss: -1.8895e+01 - accuracy: 0.0240 - val_loss: -1.8572e+01 - val_accuracy: 0.0210
Epoch 10/10
100/100 - 170s - loss: -1.9091e+01 - accuracy: 0.0265 - val_loss: -1.8685e+01 - val_accuracy: 0.0300

那么我该如何改进我的模型呢?有什么问题吗?

【问题讨论】:

    标签: python tensorflow keras classification


    【解决方案1】:

    首先,您应该更改以下几行:

      Dense(1,'sigmoid'),
      Activation('softmax') 
    

    进入:

    Dense(number_of_classes,'softmax'),
    

    在model.fit()中向下

    loss=tf.keras.losses.CategoricalCrossentropy(from_logits=False)
    

    其中 number_of_classes 是您案例中的类别数 (30)。

    其次,由于每个类的数量都非常少,因此您应该使用预训练的网络。一个好的起点是 ResNet50。

    【讨论】:

      【解决方案2】:

      你的最后一层应该有和你的类一样多的神经元。所以你最终的密集层应该是:

      Dense(n_classes),
      Activation('softmax')
      

      另外,由于你的任务不是二分类,你的损失函数应该是:

      loss=tf.keras.losses.CategoricalCrossentropy()
      

      from_logits=True 只有在你的最终密集层(你有)上没有激活函数时才应该设置为 true。如果您想保留from_logits=True,请删除softmax 激活。

      对于此损失函数,请确保在您的 flow_from _directory 调用中,class_mode='categorical'

      还有一点,你的学习率似乎很小。默认学习率 0.001 应该没问题。

      【讨论】:

      • 如果我保留from_logits=Truesoftmax 层,我的模型会怎样?我认为它就像双softmax层,除了“它是不必要的”之外,真正的危害是什么?
      猜你喜欢
      • 2016-12-03
      • 2020-04-23
      • 2019-02-14
      • 2018-05-29
      • 1970-01-01
      • 2017-11-20
      • 2020-10-17
      • 2020-06-29
      • 2021-04-16
      相关资源
      最近更新 更多