У меня есть сеть, которую я тренирую, загружая пакеты данных, и я использую model.train_on_batch()
для этого. Если я запускаю только эту тренировочную часть, я вижу, что моя сеть прекрасно обучается при использовании ОЗУ 3% для 40+ эпох (пока что), и каждая эпоха имеет около 2000 итераций. Когда я пытаюсь выполнить проверку после каждой эпохи (что также происходит партиями), возникает очень серьезная утечка памяти, приводящая к использованию ОЗУ на 90%, и мой код убивается. Итак, я пробовал пару вещей за последние несколько дней, похоже, что model.predict()
в al oop вызывает утечку памяти открытая проблема в Tensorflow GitHub . Я пробовал predict_on_batch()
, такое же поведение. model(inputs, training=False)
похоже замедлило утечку памяти, вместо резкого скачка с 3% - 7% - 13% - 40% - 80% - 90% (интервалы 60 сек c), оно увеличивалось как 1% в минуту. Но в какой-то момент он тоже достиг 90%. Единственное, что мне осталось попробовать из этого потока github, - это использовать K.clear_session()
.
Я пробовал читать документацию для K.clear_session()
и некоторых сообщений SO, все предлагают использовать его при создании нескольких моделей, чего я не делаю. Итак, мой вопрос: если у меня есть одна модель, обучающаяся и оцениваемая в циклах, где я должен использовать K.clear_session()
после каждой эпохи и перезагружать сохраненную модель перед каждой эпохой? Будет ли это правильно?
Помимо этого, я также получаю топологическую ошибку сортировки другая открытая проблема , поэтому мне интересно, потому ли это потому, что я тренируюсь в циклах, потому что мой код иначе не имеет циклы, и это тоже как-то вызывает утечку памяти, и K.clear_session()
может как-то помочь?
Минимальный пример моей структуры кода:
from tensorflow.keras.models import Model
K = tf.keras.backend
def myModel():
**some architecture**
ip = Input(shape=(h, w, 3))
op = myModel(ip)
model = Model(ip, op)
model.compile(optimizer=Adam(lr=1e-6), loss=custom_mean_squared_error)
for e in range(numEpochs):
for batch in range(0, num_train_batches):
x = readImages()
y = readLabels()
loss = model.train_on_batch(x, y)
for batch in range(0, num_val_batches):
x = readImages()
y = model.predict(x)
val_loss = K.get_value(custom_mean_squared_error(x,y))
# save predictions
# plot training vs validation loss
Tensorflow-gpu-1.14, python3 .6. Буду признателен за предложения, если я тоже что-то делаю не так.