#python #tensorflow
#python #тензорный поток
Вопрос:
Мне нужен эффективный способ сохранить процесс обучения с учетом прочитанного подмножества данных, затем загрузить новое подмножество данных и продолжить обучение с того же места, которое было сохранено. Как правильно сохранить / загрузить модель для этого?
Я уже перепробовал много разных способов сохранения / восстановления найденной модели, но я запутался, и все потому, что изменения зависят от версии.
def train(self,sess,iter):
start_time = time.clock()
n_early_stop_epochs = 10 # Define it
n_epochs = 30 # Define it
# restore variables from previous train session
if(iter>0): restore_variables(sess)
# create saver object
saver = tf.train.Saver(var_list = tf.trainable_variables(), max_to_keep = 4)
early_stop_counter = 0
# initialize train variables
init_op = tf.group(tf.global_variables_initializer())
sess.run(init_op)
# assign a large value to min
min_valid_loss = sys.float_info.max
epoch=0
# loop for a given number of epochs
while (epoch < n_epochs): # max num epoch iteration
epoch = 1
epoch_start_time = time.clock()
train_loss = self.train_epoch(sess)
valid_loss = self.valid_epoch(sess)
# print("valid ends")
epoch_end_time=time.clock()
if (epoch % 10 == 0):
info_str ='Epoch=' str(epoch) ', Train: ' str(train_loss) ', Valid: '
info_str = str(valid_loss) ', Time=' str(epoch_end_time - epoch_start_time)
print(info_str)
if valid_loss < min_valid_loss:
print('Best epoch=' str(epoch))
save_variables(sess, saver, epoch, self.model_id)
min_valid_loss = valid_loss
early_stop_counter = 0
else:
early_stop_counter = 1
# stop training when overfiiting conditon is true
if early_stop_counter > n_early_stop_epochs:
# too many consecutive epochs without surpassing the best model
print('stopping early')
# self.kill = True
break
end_time=time.clock()
print('Total time = ' str(end_time - start_time))
У меня есть цикл for для чтения данных с диска в память (чтение подмножества), тренируйтесь на этом подмножестве данных,
Я сохраняю переменную
iter = 0 # counter, a number for current loop
знать, что в любом другом цикле, кроме первого, мы сначала загружаем модель.
Кажется, все работает, но я не уверен, что обучающие переменные продолжают обновляться с последней контрольной точки или снова начинаются с нуля. Поскольку мои потери при обучении почти равны нулю за несколько эпох, в то время как потери при проверке не сходятся от одного подмножества к другому, после того, как все данные были прочитаны, потери при проверке могут принимать значения от 0,3 до 7 на подмножество данных.
Например, первый цикл — первое подмножество данных training_loss = 0.0004. validation_loss = 0,34 для ряда эпох, на следующей итерации данных training_loss = 0,0000, validation_loss = 5,2 и так далее. Validation_loss имеет пики и спады, не сходится.
Комментарии:
1. Если вы не уверены, что ваш процесс ведет себя так, как вы хотите, я рекомендую вам создать игрушечный набор данных для его тестирования. Возьмите набор данных, который будет продолжать улучшаться, отметьте его в середине, а затем выясните, продолжается ли он или начинается заново.
2. У меня есть архитектура CNN, с одним, «с tf.variable_scope («model_architecture», повторное использование = повторное использование):» и ниже приведен код сети. Если вы хотите увидеть код сохранения / восстановления, дайте мне знать
3. Я не знаю, спасибо. Просто хотел предложить идею, как вы могли бы исследовать свой собственный вопрос.