提问者:小点点

Tensorflow Keras在30类以上的图像分类中精度较差


我有使用Keras图像分类的问题。我总是得到差的精度只有0.02。我试图遵循猫和狗的分类,它的准确度为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

那么我该如何改进我的模型呢?有什么不对劲吗?


共2个答案

匿名用户

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

Dense(n_classes),
Activation('softmax')

此外,由于您的任务不是二进制分类,因此损失函数应为:

loss=tf.keras.losses.CategoricalCrossentropy()

from_logits=True只有在您的最终致密层(您有)上没有激活功能时才应设置为True。如果要保留from_logits=True,请删除softmax激活。

对于此丢失函数,请确保在您的flow\u from\u目录调用中,class\u mode='classifical'

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

匿名用户

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

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

进入:

Dense(number_of_classes,'softmax'),

在模型中。fit()

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

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

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