tensorflow 恢復指定層與不同層指定不同學習率

#tensorflow 中從ckpt文件中恢復指定的層或將指定的層不進行恢復:
#tensorflow 中不同的layer指定不同的學習率

with tf.Graph().as_default():
		#存放的是需要恢復的層參數
	    variables_to_restore = []
	    #存放的是需要訓練的層參數名,這裏是沒恢復的需要進行重新訓練,實際上恢復了的參數也可以訓練
        variables_to_train = []
        for var in slim.get_model_variables():
            excluded = False
            for exclusion in fine_tune_layers:
            #比如fine tune layer中包含logits,bottleneck
                if var.op.name.startswith(exclusion):
                    excluded = True
                    break
            if not excluded:
                variables_to_restore.append(var)
                #print('var to restore :',var)
            else:
                variables_to_train.append(var)
                #print('var to train: ',var)


        #這裏省略掉一些步驟,進入訓練步驟:
        #將variables_to_train,需要訓練的參數給optimizer 的compute_gradients函數
        grads = opt.compute_gradients(total_loss, variables_to_train)
        #這個函數將只計算variables_to_train中的梯度
        #然後將梯度進行應用:
        apply_gradient_op = opt.apply_gradients(grads, global_step=global_step)
        #也可以直接調用opt.minimize(total_loss,variables_to_train)
        #minimize只是將compute_gradients與apply_gradients封裝成了一個函數,實際上還是調用的這兩個函數
        #如果在梯度裏面不同的參數需要不同的學習率,那麼可以:

        capped_grads_and_vars = []#[(MyCapper(gv[0]), gv[1]) for gv in grads_and_vars]
        #update_gradient_vars是需要更新的參數,使用的是全局學習率
        #對於不是update_gradient_vars的參數,將其梯度更新乘以0.0001,使用基本上不動
    	for grad in grads:
    		for update_vars  in update_gradient_vars:
    			if grad[1]==update_vars:
    				capped_grads_and_vars.append((grad[0],grad[1]))
    			else:
    				capped_grads_and_vars.append((0.0001*grad[0],grad[1]))

    	apply_gradient_op = opt.apply_gradients(capped_grads_and_vars, global_step=global_step)

    	#在恢復模型時:

        with sess.as_default():

            if pretrained_model:
                print('Restoring pretrained model: %s' % pretrained_model)
                init_fn = slim.assign_from_checkpoint_fn(
                pretrained_model,
                variables_to_restore)
                init_fn(sess)
            #這樣就將指定的層參數沒有恢復

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章