Классификация Tensorflow изображений бинарная потеря кроссентропии отрицательна - PullRequest
0 голосов
/ 07 ноября 2019

Я новичок в Tensorflow. Я следовал некоторым учебникам с предоставленным набором данных и хотел попробовать что-то самостоятельно. Я решил попробовать классифицировать наборы Magic the Gathering. Каждая карта имеет символ разных цветов: Черный , Золото и т. Д.

Цвета не имеют значения, просторазные символы. Поэтому я создал набор данных из 3 разных наборов (то есть 3 разных символов) и получил около 15 000 изображений, таких как this . Некоторые немного повернуты, некоторые имеют смещение по X и Y, просто чтобы получить несколько разных изображений.

Затем я адаптировал учебник на веб-сайте тензор потока для классификации изображений. Вместо двух классов я хотел попробовать три:

batch_size = 250
epochs = 3
IMG_HEIGHT = 55
IMG_WIDTH = 55

train_image_generator = ImageDataGenerator(rescale=1./255)
validation_image_generator = ImageDataGenerator(rescale=1./255)

train_data_gen = train_image_generator.flow_from_directory(batch_size=batch_size,
                                                           directory=train_dir,
                                                           shuffle=True,
                                                           target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                           class_mode='binary')

val_data_gen = validation_image_generator.flow_from_directory(batch_size=batch_size,
                                                              directory=validation_dir,
                                                              target_size=(IMG_HEIGHT, IMG_WIDTH),
                                                              class_mode='binary')

model = Sequential([
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
    MaxPooling2D(),
    Conv2D(32, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Conv2D(64, 3, padding='same', activation='relu'),
    MaxPooling2D(),
    Flatten(),
    Dense(512, activation='relu'),
    Dense(1, activation='sigmoid')
])

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

history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=total_train // batch_size,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=total_val // batch_size,
    callbacks=[cp_callback]
)

Но моя потеря отрицательна, и я не получаю хорошую точность после тренировки. Что я испортил? Модель, используемая в учебнике, не подходит для моего сценария использования? Или есть ошибка в коде, потому что я использовал три вместо двух классов?

1 Ответ

0 голосов
/ 07 ноября 2019

Модель из учебника использовалась для бинарной классификации (только два класса, кошка или собака). С другой стороны, вы хотите классифицировать 3 класса, а не 2. Поэтому вам нужно немного адаптировать архитектуру. Ваш последний слой должен быть:

Dense(3, activation='softmax')

Три нейрона, потому что у вас есть три класса и активация softmax, потому что вы хотите, чтобы ваши выходные данные были действительными вероятностями. Чтобы скомпилировать модель, используйте categorical_crossentropy вместо binary_crossentropy и убедитесь, что ваши метки закодированы в горячем виде. Также для вашего ImageDataGenerator вы должны передать class_mode=categorical в функцию .flow_from_directory().

...