2017-03-24 2 views
0

에 대한 새 출력 추가 미리 훈련 된 체크 포인트를 복원하고 크기가 m * C + 1이고 행렬을 만들 때까지 지금까지 수행 한 작업을 미리 훈련 된 모델에 추가하는 것은 혼란 스럽습니다. 길이가 C + 1 인 벡터를 만든 다음 기존 가중치에서 첫 번째 C 행/요소를 초기화하고 Optimizer.minimize()에서 FC 레이어 만 트레이닝하여 이전 레이어를 고정합니다. 내가 코드를 실행할 때, 나는이 오류가있어 :사전 학습 된 모델

Traceback (most recent call last): 
File "/home/tensorflow/tensorflow/models/image/mnist/new_dataset/Nets.py", line 482, in <module> 
new_op_w = optimizer_new.minimize(loss, var_list = resize_var_w) 
File "/home/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/optimizer.py", line 279, in minimize 
grad_loss=grad_loss) 
File "/home/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/optimizer.py", line 337, in compute_gradients 
processors = [_get_processor(v) for v in var_list] 
File "/home/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 502, in __iter__ 
raise TypeError("'Tensor' object is not iterable.") 
TypeError: 'Tensor' object is not iterable. 

를하고 코드입니다 : GradientDescentOptimizer의 minimize method에 TensorFlow의 문서에 따르면

with tf.Session(graph=graph) as sess: 
    if os.path.isfile(ckpt): 
     aver.restore(sess, 'path_to_checkpoint.ckpt') 
     w_b_new = { 

     'weight_4': tf.Variable(tf.random_normal([num_hidden, 1], stddev=0.1), name = 'weight_4'), 
     'bias_4' : tf.Variable(tf.constant(1.0, shape=[1]), name = 'bias_4'),} 
     change_1 = tf.unstack(w_b_not['weight_4']) 
     change_2 = tf.unstack(w_b_not['bias_4']) 
     change_3 = tf.unstack(w_b_new['weight_4']) 
     change_4 = tf.unstack(w_b_new['bias_4']) 
     changestep1 = [] 
     for i in range(len(change_1)): 
     changestep1.append(tf.unstack(change_1[i]))   
     changestep3 = [] 
     for i in range(len(change_3)): 
     changestep3.append(tf.unstack(change_3[i])) 
     for j in range(len(changestep3[i])): 
      changestep1[i].append(changestep3[i][j]) 

     changestep1[i] = tf.stack(changestep1[i]) 
     final1 = tf.stack(changestep1) 
     resize_var_w = tf.assign(w_b_not['weight_4'], final1, validate_shape=False) 
     final2 = tf.concat([w_b_not['bias_4'] , w_b_new['bias_4']], axis=0) 
     resize_var = tf.assign(w_b_not['bias_4'], final2, validate_shape=False) 

     optimizer_new = tf.train.GradientDescentOptimizer(0.01) 
     new_op_w = optimizer_new.minimize(loss, var_list = resize_var_w) 
     new_op_b = optimizer_new.minimize(loss, var_list = resize_var)  
     for step in range(num_steps,num_steps + num_train_steps): 
      offset = (step * batch_size) % (train_labels.shape[0] - batch_size)  
      batch_data = train_dataset[offset:(offset + batch_size), :, :, :]  
      batch_labels = train_labels[offset:(offset + batch_size), :] 
      feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels , keep_prob:0.5}   
      _,_, l, predictions = sess.run([new_op_w,new_op_b, loss, train_prediction ], feed_dict=feed_dict) 
      if (step % 50 == 0): 
      print('%d\t%f\t%.1f%%\t%.1f%%' % (step, l, accuracy(predictions, batch_labels), accuracy(valid_prediction.eval(), valid_labels)))  
     print('Test accuracy: %.1f%%' % accuracy(test_prediction.eval() , test_labels)) 

     save_path_w_b = saver.save(sess, "path_checkpoint.ckpt") 
     print("Model saved in file: %s" % save_path_w_b) 

답변

0

, "var_list는"변수 객체의 목록이어야합니다 . 코드에 따르면 resize_var_w은 단일 텐서입니다.

편집 더 구체적으로 :

당신이 최적화 var_list을주는 경우에, 이름에서 알 수 있듯이,이 변수의 목록이어야합니다. Backprop 중에 옵티마이 저는 var_list을 루프하고 그래프의 모든 학습 가능 변수가 아닌 목록의 변수 만 업데이트합니다. 단일 변수는 반복 할 수 없습니다. 내가 테스트하지 않았다

resize_var_w = [tf.assign(w_b_not['weight_4'], final1, validate_shape=False)] 

,하지만 작동합니다 :

당신은 단지 하나의 텐서를 업데이트하려면

, 당신은 간단하게 시도 할 수 있습니다.

+0

네,하지만 resize_var_w에 새 변수를 할당했습니다. –

+0

스크립트를 디버그하고'type (resize_var_w)'을 인쇄하십시오. TensorFlow 텐서 변수 또는 파이썬리스트를 출력합니까? – vega

+0

그 출력은 [assign doc] (https://www.tensorflow.org/api_docs/python/tf/assign)에 따라 resize_var_w

관련 문제