Как сохранить / восстановить при чтении подмножества данных во время обучения?

#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. Я не знаю, спасибо. Просто хотел предложить идею, как вы могли бы исследовать свой собственный вопрос.