Я провожу некоторые эксперименты с трансферным обучением:
У меня есть файл сценария, в котором в первой части я обучаю модель подмножеству набора данных 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)
, но все равно не дает ожидаемого результата.Как мне поступить?