Tensorflow: потери и точность остаются неизменными - обучение CNN классификации изображений - PullRequest
0 голосов
/ 03 августа 2020

Я скопировал / вставил это руководство по Tensorflow в блокнот Jupyter. (На момент написания этой статьи они изменили руководство на набор данных о цветах, а не о собаках, но вопрос все еще актуален). https://www.tensorflow.org/tutorials/images/classification

Первая часть (без дополнений) работает нормально, и я получаю аналогичные результаты.

Но с увеличением данных мои потери и точность остаются неизменными на протяжении всей эпохи . Я уже проверял эти сообщения на SO: Точность Keras не меняется Как исправить плоскую точность и потерю NaN в классификации изображений тензорного потока Тензорный поток: потери уменьшаются, но точность стабильна

Ничего из этого не применялось, поскольку набор данных является стандартным, у меня нет проблемы с поврежденными данными, к тому же я распечатал несколько расширенных изображений, и он работает нормально (см. Ниже).

Я попытался добавить больше полностью связанных слоев, чтобы увеличить емкость модели, выпадение, чтобы ограничить подгонку, ... ничего не изменилось, вот кривая:

Есть идеи, почему? Я что-то пропустил в коде? Я знаю, что обучение модели DL - это много проб и ошибок, но я уверен, что должно быть какое-то логическое c или интуиция, помимо случайного поворота ручки, пока что-то не произойдет.

Спасибо!

enter image description here

Source Data : _URL = 'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'

path_to_zip = tf.keras.utils.get_file('cats_and_dogs.zip', origin=_URL, extract=True)

PATH = os.path.join(os.path.dirname(path_to_zip), 'cats_and_dogs_filtered')

Params :

batch_size = 128
epochs = 15
IMG_HEIGHT = 150
IMG_WIDTH = 150

Preprocessing stage :

image_gen = ImageDataGenerator(rescale=1./255,
    rotation_range=20,
    width_shift_range=0.15,
    height_shift_range=0.15,
    horizontal_flip=True,
    zoom_range=0.2)

train_data_gen = image_gen.flow_from_directory(batch_size=batch_size,
                                               directory=train_dir,
                                               shuffle=True,
                                               target_size=(IMG_HEIGHT, IMG_WIDTH))

augmented_images = [train_data_gen[0][0][i] for i in range(5)]
plotImages(augmented_images)

image_gen_val = ImageDataGenerator(rescale=1./255)

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

введите описание изображения здесь

Модель:

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

model_new.compile(optimizer='adam',
                  loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
                  metrics=['accuracy'])

model_new.summary()

history = model_new.fit(
    train_data_gen,
    steps_per_epoch= total_train // batch_size,
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps= total_val // batch_size
)

1 Ответ

0 голосов
/ 04 августа 2020

Как было предложено @today, class_method = 'binary' отсутствовал в генераторе обучающих данных. Теперь модель может правильно обучаться.

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