Tensorflow Keras низкая точность классификации изображений с более чем 30 классами - PullRequest
0 голосов
/ 21 июня 2020

У меня проблема с классификацией изображений с помощью Keras. У меня всегда была низкая точность - всего 0,02. Я пытался следовать классификации кошек и собак , которая имеет точность 0,8, но она не могла работать в моем случае с 30 классами.

Допустим, у меня есть наборы данных с примерно 100 КБ изображений и категоризированы внутри 30 классов. Я разделил его на 80% для обучения и 20% для проверки.

Папка структуры выглядит так.

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

Каждая категория в папке поезда содержит от 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 ]

1 голос
/ 21 июня 2020

У вас должно быть столько нейронов на последнем слое, сколько у вас классов. Итак, ваш последний плотный слой должен быть:

Dense(n_classes),
Activation('softmax')

Кроме того, поскольку ваша задача не является двоичной классификацией, ваша функция потерь должна быть:

loss=tf.keras.losses.CategoricalCrossentropy()

from_logits=True должна быть установлена ​​только на истина, если у вас нет функции активации на вашем последнем плотном слое (который у вас есть). Если вы хотите сохранить from_logits=True, удалите активацию softmax.

Для этой функции потери убедитесь, что в вашем вызове flow_from _directory это class_mode='categorical'.

Еще один вещь, ваша скорость обучения кажется очень маленькой. Скорость обучения по умолчанию 0,001 вполне подойдет.

0 голосов
/ 21 июня 2020

Прежде всего, вы должны изменить следующие строки:

  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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...