#python #tensorflow #machine-learning #keras #image-classification
Вопрос:
Это алгоритм, который я использовал для классификации класса рисунка — кроссовки, карандаш и книга. Однако, запустив алгоритм на 3000 перетасованных изображениях (это все, что у меня есть), я замечаю:
- val_accuracy для каждой из эпох одинакова и составляет 0,3400
- Когда я печатаю результат из прогноза 6 изображений, которые я сделал сам, массив результатов выглядит следующим образом, когда предполагается, что он возвращает числовое значение:
[[1.][1.][1.][1.][1.][1.]]
- Поскольку он всегда равен 1, он всегда будет предсказывать один и тот же класс для каждого моего изображения, в моем случае, книги.
- Я провел тест, как и предлагал другой пост, для тренировки с 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'])