Последовательное предсказание Кераса, всегда возвращающее один и тот же результат

#python #tensorflow #machine-learning #keras #image-classification

Вопрос:

Это алгоритм, который я использовал для классификации класса рисунка — кроссовки, карандаш и книга. Однако, запустив алгоритм на 3000 перетасованных изображениях (это все, что у меня есть), я замечаю:

  1. val_accuracy для каждой из эпох одинакова и составляет 0,3400
  2. Когда я печатаю результат из прогноза 6 изображений, которые я сделал сам, массив результатов выглядит следующим образом, когда предполагается, что он возвращает числовое значение:

    [[1.][1.][1.][1.][1.][1.]]

  3. Поскольку он всегда равен 1, он всегда будет предсказывать один и тот же класс для каждого моего изображения, в моем случае, книги.
  4. Я провел тест, как и предлагал другой пост, для тренировки с 1000 образцами кроссовок и карандашей и 1 образцом книги. В результате все равно книга, всегда.

Алгоритм:

 model = Sequential()
model.add(Conv2D(64,(3,3), input_shape = X_train.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(Flatten())
model.add(Dense(64))

model.add(Dense(1))
model.add(Activation('softmax'))

model.compile(loss="binary_crossentropy",
             optimizer="adam",
             metrics=['accuracy'])

model.fit(X_train, y_train, batch_size=24, epochs=3, validation_split=0.1)

predictions = model.predict(X_test)
 

Выходные данные (2692 примера, поскольку некоторые из них являются ошибками)

 Train on 2692 samples, validate on 300 samples
Epoch 1/3
2692/2692 [==============================] - 17s 6ms/sample - loss: -0.0171 - accuracy: 0.3354 - val_loss: -0.5111 - val_accuracy: 0.3400
Epoch 2/3
2692/2692 [==============================] - 20s 8ms/sample - loss: -0.0171 - accuracy: 0.3354 - val_loss: -0.5111 - val_accuracy: 0.3400
Epoch 3/3
2692/2692 [==============================] - 21s 8ms/sample - loss: -0.0171 - accuracy: 0.3354 - val_loss: -0.5111 - val_accuracy: 0.3400
 

Когда я запускаю печать(прогнозы), результатом является:
[[1.][1.][1.][1.][1.][1.]]

Спасибо!

Комментарии:

1. Выходы Softmax суммируются до 1, и вы используете его с одним нейроном, так что результат совсем не удивителен.

2. Я новичок в keras, как мне исправить код, чтобы он мог описывать возможности для 3 разных классов?

3. Измените последний слой на model.add(Dense(3))

4. Это выдает мне сообщение об ошибке ValueError: целевой массив с формой (2992, 1) был передан для вывода формы (Нет, 3) при использовании в качестве потери binary_crossentropy . Эта потеря предполагает, что цели будут иметь ту же форму, что и результат.

5. Ах, также потеря должна быть categorical_crossentropy , если ваши ярлыки в противном случае закодированы как горячие sparse_categorial_crossentropy .

Ответ №1:

поскольку вы пытаетесь классифицировать данные на 3 класса, верхний слой вашей модели должен быть

 model.add(Dense(3))
model.add(Activation('softmax'))
 

Вы не показываете код для того, как вы создали X-train и y_train. Если y_train-это один горячий код, то вы кодируете модель.компиляция должна быть

 model.compile(loss="categorical_crossentropy", optimizer="adam",
                   metrics=['accuracy'])
 

если y_train-это целые числа, то model.compile должна быть

 model.compile(loss="sparse_categorial_crossentropy", optimizer="adam",
                   metrics=['accuracy'])