#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 полностью все забудет?