Keras Image Classification Loss - PullRequest
       24

Keras Image Classification Loss

1 голос
/ 11 октября 2019

Я пытаюсь создать простую модель CNN, которая может распознавать покемонов. Для первой попытки я создал очень маленький набор данных, состоящий из 100 изображений 10 разных покемонов. Используя этот код в Python, кажется, что он работает хорошо.

import tensorflow as tf
import numpy as np

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3,3), input_shape=(200,200,3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2,2)))
model.add(tf.keras.layers.Conv2D(32, (3,3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2,2)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(units=400, activation='relu'))
model.add(tf.keras.layers.Dense(units=10, activation='sigmoid'))

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

train = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)

training_set= train.flow_from_directory('datasets/starter/train', target_size=(200,200), class_mode='categorical')
val_set= test.flow_from_directory('datasets/starter/test', target_size=(200,200), class_mode='categorical')

history=model.fit_generator(training_set, steps_per_epoch=32, epochs=3, validation_data=val_set, validation_steps=32)

test_image = tf.keras.preprocessing.image.load_img('datasets/starter/val/attempt.png', target_size=(200, 200))
test_image = tf.keras.preprocessing.image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
result = model.predict(test_image)
print(training_set.class_indices)
print(result)

test_image2 = tf.keras.preprocessing.image.load_img('datasets/starter/val/attempt2.png', target_size=(200, 200))
test_image2 = tf.keras.preprocessing.image.img_to_array(test_image2)
test_image2 = np.expand_dims(test_image2, axis=0)
result2 = model.predict(test_image2)
print(training_set.class_indices)
print(result2)

Точность обучения в последнюю эпоху установлена ​​на 1. Когда я пытаюсь предсказать примеры изображений: try.png - это изображение Charmander, его метка равна 1, поэтому я получаю этот вектор:[[0. 1. 0. 0. ... 0.]] try2.png - изображение Torchic, его метка 7, поэтому я получаю: [[0. 0. ... 1. 0. 0.]]

Но я заметил, что потеря в файле "model.compile" должна быть "category_crossentropy", а не "binary_crossentropy". Используя категорическую, моя программа больше не будет работать. Может ли кто-нибудь помочь мне понять?

1 Ответ

1 голос
/ 11 октября 2019

Вы должны попытаться использовать Softmax в качестве последней активации с категориальной кроссентропией в качестве функции потерь

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