TensorFlow: тонкая настройка только полностью подключенного слоя для разных скоростей обучения с одним файлом Python - PullRequest
0 голосов
/ 20 сентября 2019

Я провожу некоторые эксперименты с трансферным обучением:
У меня есть файл сценария, в котором в первой части я обучаю модель подмножеству набора данных mnist и затем успешно сохраняю его.Архитектура модели состоит из 2 уровней CNN и 1 полностью подключенного уровня.

for epoch in range(1, params['epochs'] + 1):
                 shuffle = np.random.permutation(len(y_train))
                 x_train, y_train = x_train[shuffle], y_train[shuffle]


                 for i in range(0, len(y_train), params['batch_size']):
                     x_train_mb, y_train_mb = x_train[i:i + params['batch_size']], y_train[i:i + params['batch_size']]

                     sess.run(model.optimize, feed_dict={model.input: x_train_mb, model.target: y_train_mb, model.is_task1: True,
 model.is_train: True, model.learning_rate:
 temp_learning_rate_source_training})




                 valid_acc = classification_batch_evaluation(sess, model, model.metrics, params['batch_size'], True, x_valid, y=y_valid,
 stream=True)

                 print('valid [{} / {}] valid accuracy: {} learning Rate :{}'.format(epoch, params['epochs'] + 1,
 valid_acc,temp_learning_rate_source_training))
                 if valid_acc > initial_best_epoch['valid_acc']:
                     initial_best_epoch['epoch'] = epoch
                     initial_best_epoch['valid_acc'] = valid_acc
                     model.save_model(sess, epoch) 

                 if epoch - initial_best_epoch['epoch'] >= params['patience']:
                     print('Early Stopping Epoch: {}\n'.format(epoch))
                     logging.info('Early Stopping Epoch: {}\n'.format(epoch))
                     break


         print('Initial training done \n',file=f)
         logging.info('Initial training done \n')
         sess.close()      

     model.restore_model(sess) ##Restores the model after creating it .

Теперь я хочу перенести обучение, сохранив архитектуру и передав параметры для слоев CNN и повторно инициализировав полностью подключенныйслой.А затем снова обучаем 3 уровня ограниченному новому набору данных, используя разные скорости обучения и «decay_after_epoch» для анализа результата.Теперь из-за большого количества комбинаций я написал 2 цикла for - для автоматизации процесса следующим образом:

for temp_learning_rate_target_training in (0.001,0.005,0.01):

        for decay_after_epoch in (3,5,10): 
            learning_rate = temp_learning_rate_target_training
            model.restore_model(sess) ##Restores the model after creating it .
            with open("/home/abhishek/Desktop/{}_{}_{}.txt".format(params["dataset"],params["k"],params["n"])) as f1:
                with open("/home/abhishek/Desktop/{}_{}_{}_{}_{}.txt".format(params["dataset"],params["k"],params["n"],temp_learning_rate_target_training,decay_after_epoch), "w") as f:
                    for x in f1.readlines():
                        f.write(x)
                    print("Target Training Begins",file=f)
                    for epoch in range(1, params['epochs'] + 1):
                        shuffle = np.random.permutation(len(y_train2))
                        x_train2, y_train2 = x_train2[shuffle], y_train2[shuffle]


                        if epoch%decay_after_epoch==0 and epoch <=decay_after_epoch:
                            learning_rate = learning_rate *0.1
                        elif (epoch-decay_after_epoch)%30==0:
                            learning_rate = learning_rate *0.1



                        for i in range(0, len(y_train2), params['batch_size']):
                            x_train_mb, y_train_mb = x_train2[i:i + params['batch_size']], y_train2[i:i + params['batch_size']]
                            sess.run(model.optimize, feed_dict={model.input: x_train_mb, model.target: y_train_mb, model.is_task1: False, model.is_train: True, model.learning_rate: params['learning_rate']})

                        train_acc = classification_batch_evaluation(sess, model, model.metrics, params['batch_size'], False, x_train2, y=y_train2, stream=True)
                        sess.close()

                        print('train [{} / {}] train accuracy: {} learning Rate:{} '.format(epoch, params['epochs'] + 1, train_acc,learning_rate),file=f)
                        print('train [{} / {}] train accuracy: {} learning Rate :{}'.format(epoch, params['epochs'] + 1, train_acc,learning_rate))
                        logging.info('train [{} / {}] train accuracy: {}'.format(epoch, params['epochs'] + 1, train_acc))

                        if train_acc > transfer_best_epoch['train_acc']:
                            transfer_best_epoch['epoch'] = epoch
                            transfer_best_epoch['train_acc'] = train_acc
                            test_acc = classification_batch_evaluation(sess, model, model.metrics, params['batch_size'], False, x_test2, y=y_test2, stream=True)
                            transfer_best_epoch['test_acc'] = test_acc

                        if epoch % params['patience'] == 0:
                            acc_diff = transfer_best_epoch['train_acc'] - es_acc
                            if acc_diff < params['percentage_es'] * es_acc:
                                print('Early Stopping Epoch: {}\n'.format(epoch))
                                logging.info('Early Stopping Epoch: {}\n'.format(epoch))
                                break
                            es_acc = transfer_best_epoch['train_acc']

                    print('Transfer training done \n',file=f)
                    print('TARGET test accuracy: {}'.format(transfer_best_epoch['test_acc']),file=f)

Теперь, после запуска первого цикла с temp_learning_rate_target_training = 0.0001 и decay_after_epoch = 3, модель обучается,и у меня есть точность теста, и пусть веса и смещения для различных (3) слоев задаются набором S2.Теперь, когда цикл запускается снова, параметр model.is_task1: False обеспечивает повторную инициализацию полностью подключенного слоя, но параметры слоев CNN копируются из набора S2.(Почему я говорю это потому, что я получаю журналы с одинаковой точностью для всех комбинаций курсов обучения и decay_after_epoch).Тем не менее, я хочу обучить разные циклы с одинаковыми начальными параметрами для слоев CNN, которые заданы S1
. Я пытался закрыть сеанс с sess.close() после каждого цикла, а затем восстановить сохраненную модель (которая была обучена в части 1).кода) с model.restore_model(sess), но все равно не дает ожидаемого результата.Как мне поступить?

1 Ответ

0 голосов
/ 20 сентября 2019

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

Все слои должны иметь свои переменные в своей области видимости переменных.Вы можете получить переменные:

tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='my_scope')

Для переменных, которые вы хотите повторно инициализировать, вы можете сделать следующее:

sess.run([v.initializer for v in variables_to_reset])

Когда вы инициализируете метод свернуть (он скрыт в вашем model объекте, это то, что дает вам опцию model.optimize, которую вы вызываете в цикле обучения), вы можете указать var_list, который является списком переменных, которые вы хотите обучить, остальные останутсянеповрежденный.

...