如下所示:
#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) #這樣就將指定的層參數沒有恢復
以上這篇tensorflow 恢復指定層與不同層指定不同學習率的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林站長站。
新聞熱點
疑難解答