Последовательное обучение нескольких моделей TensorFlow: как мне обеспечить четкость сеанса?

#python #tensorflow #keras #computer-vision

#python #tensorflow #keras #компьютерное зрение

Вопрос:

Я зацикливаю программу, которая создает модель, обучает модель, оценивает модель с использованием набора тестов, а затем удаляет себя (это работает в направлении K-кратной оценки). Мне нужно быть уверенным, что в конце каждого цикла нет предварительной памяти о старой модели / обучении. Приведенный ниже пример кода показывает, что я сделал, чтобы попытаться достичь этого (включен некоторый псевдокод для облегчения понимания и сохранения 100 строк программы):

 for heldout_dataset in os.listdir():
  # Create model
  base_model = tf.keras.applications.Xception(input_shape=IMG_SHAPE, include_top=False,weights='imagenet')
  # (Etc, adding layers)
  model = tf.keras.Model(inputs, outputs)

  # (Etc, loading some data that is not held out (ie, not the 'Fold'))
  train_data = tf.keras.preprocessing.image_dataset_from_directory(....)
  val_data = tf.keras.preprocessing.image_dataset_from_directory(....)
  model.fit(train_data,val_data)

  # (Etc, making predictions)

  # Clear Everything
  del train_data
  del model
  del base_model
  del val_data
  tf.keras.backend.clear_session()
  

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

Мой вопрос заключается в следующем: Как я могу гарантировать, что в каждом цикле создается совершенно новая модель без какого-либо предыдущего обучения? Более или менее ищете что-то, чтобы «уничтожить» все сохраненные переменные / веса / любую другую информацию. Если это имеет значение, это выполняется в CoLab.

Спасибо!

Комментарии:

1. В какой версии tensorflow вы работаете?

2. Привет, в настоящее время используется tf.__версия __ 2.3.0

Ответ №1:

Когда вы инициализируете свои модели, вы предоставляете weights аргумент, чтобы сообщить TF, как инициализировать веса каждого нового экземпляра:

 tf.keras.applications.Xception(input_shape=IMG_SHAPE, include_top=False, weights='imagenet')
  

В этом случае вы говорите ему использовать веса из модели, которая уже была обучена для imagenet набора данных. Если вам нужна модель «без какого-либо предварительного обучения вообще», вы можете вместо этого установить аргумент weights None (см. Документы здесь).

РЕДАКТИРОВАТЬ: основываясь на ваших комментариях, это не то, что вам было нужно. tf.keras.backend.clear_session() выполняет то, что вы просите, но его следует вызывать в начале каждой итерации.

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

Комментарии:

1. Привет, и спасибо за ответ! Я не думаю, что это именно то, что я ищу, поэтому я постараюсь быть более понятным. Я понимаю, что модель изначально загружает веса, так и задумано. Однако мне нужно убедиться, что для каждой итерации в показанном цикле for в памяти графического процессора или ОЗУ в CoLab не осталось ничего, что могло бы повлиять на новую модель, поскольку каждая итерация цикла for будет проверяться на данных, которые модель была обучена 1 итерации назад. Надеюсь, это более понятно, у меня возникли проблемы с объяснением

2. Итак, по сути, вопрос в следующем: del model clear_session() гарантирует ли and, что TensorFlow полностью все забудет?