Я скопировал / вставил это руководство по Tensorflow в блокнот Jupyter. (На момент написания этой статьи они изменили руководство на набор данных о цветах, а не о собаках, но вопрос все еще актуален). https://www.tensorflow.org/tutorials/images/classification
Первая часть (без дополнений) работает нормально, и я получаю аналогичные результаты.
Но с увеличением данных мои потери и точность остаются неизменными на протяжении всей эпохи . Я уже проверял эти сообщения на SO: Точность Keras не меняется Как исправить плоскую точность и потерю NaN в классификации изображений тензорного потока Тензорный поток: потери уменьшаются, но точность стабильна
Ничего из этого не применялось, поскольку набор данных является стандартным, у меня нет проблемы с поврежденными данными, к тому же я распечатал несколько расширенных изображений, и он работает нормально (см. Ниже).
Я попытался добавить больше полностью связанных слоев, чтобы увеличить емкость модели, выпадение, чтобы ограничить подгонку, ... ничего не изменилось, вот кривая:
Есть идеи, почему? Я что-то пропустил в коде? Я знаю, что обучение модели DL - это много проб и ошибок, но я уверен, что должно быть какое-то логическое c или интуиция, помимо случайного поворота ручки, пока что-то не произойдет.
Спасибо!
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
)