0

TensorFlow에서 깊은 네트워크를 학습 중이며 학습 속도 저하를 사용하려고합니다. 내가 아는 한 train.exponential_decay 함수를 사용하여 다양한 매개 변수를 사용하여 현재 학습 단계의 적절한 학습 속도 값을 계산합니다. 지금 당장 실행되는 단계 만 제공하면됩니다. 네트워크에 무언가를 제공 할 필요가있을 때 평소와 같이 tf.placeholder (tf.int32)를 사용해야한다고 생각했지만 잘못된 것 같습니다. 이렇게하면 아래 오류가 발생합니다.TensorFlow 학습 속도 감소 - 부식을위한 단계 번호를 올바르게 제공하는 방법?

TypeError: Input 'ref' of 'AssignAdd' Op requires l-value input 

내가 뭘 잘못하고 있니? 불행히도, 나는 부패한 네트워크 훈련의 좋은 예를 발견하지 못했습니다. 내 전체 코드는 아래 있습니다. 네트워크에는 2 개의 숨겨진 ReLU 레이어가 있고 L2 가중치가 있으며 숨겨진 레이어 모두에 드롭 아웃이 있습니다.

#We try the following - 2 ReLU layers 
#Dropout on both of them 
#Also L2 regularization on them 
#and learning rate decay also 


#batch size for SGD 
batch_size = 128 
#beta parameter for L2 loss 
beta = 0.001 

#that's how many hidden neurons we want 
num_hidden_neurons = 1024 

#learning rate decay 
#starting value, number of steps decay is performed, 
#size of the decay 
start_learning_rate = 0.05 
decay_steps = 1000 
decay_size = 0.95 

#building tensorflow graph 
graph = tf.Graph() 
with graph.as_default(): 
    # Input data. For the training data, we use a placeholder that will be fed 
    # at run time with a training minibatch. 
    tf_train_dataset = tf.placeholder(tf.float32, 
            shape=(batch_size, image_size * image_size)) 
    tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
    tf_valid_dataset = tf.constant(valid_dataset) 
    tf_test_dataset = tf.constant(test_dataset) 

    #now let's build our first hidden layer 
    #its weights 
    hidden_weights_1 = tf.Variable(
    tf.truncated_normal([image_size * image_size, num_hidden_neurons])) 
    hidden_biases_1 = tf.Variable(tf.zeros([num_hidden_neurons])) 

    #now the layer 1 itself. It multiplies data by weights, adds biases 
    #and takes ReLU over result 
    hidden_layer_1 = tf.nn.relu(tf.matmul(tf_train_dataset, hidden_weights_1) + hidden_biases_1) 

    #add dropout on hidden layer 1 
    #we pick up the probabylity of switching off the activation 
    #and perform the switch off of the activations 
    keep_prob = tf.placeholder("float") 
    hidden_layer_drop_1 = tf.nn.dropout(hidden_layer_1, keep_prob) 

    #now let's build our second hidden layer 
    #its weights 
    hidden_weights_2 = tf.Variable(
    tf.truncated_normal([num_hidden_neurons, num_hidden_neurons])) 
    hidden_biases_2 = tf.Variable(tf.zeros([num_hidden_neurons])) 

    #now the layer 2 itself. It multiplies data by weights, adds biases 
    #and takes ReLU over result 
    hidden_layer_2 = tf.nn.relu(tf.matmul(hidden_layer_drop_1, hidden_weights_2) + hidden_biases_2) 

    #add dropout on hidden layer 2 
    #we pick up the probabylity of switching off the activation 
    #and perform the switch off of the activations 
    hidden_layer_drop_2 = tf.nn.dropout(hidden_layer_2, keep_prob) 

    #time to go for output linear layer 
    #out weights connect hidden neurons to output labels 
    #biases are added to output labels 
    out_weights = tf.Variable(
    tf.truncated_normal([num_hidden_neurons, num_labels])) 

    out_biases = tf.Variable(tf.zeros([num_labels])) 

    #compute output 
    #notice that upon training we use the switched off activations 
    #i.e. the variaction of hidden_layer with the dropout active 
    out_layer = tf.matmul(hidden_layer_drop_2,out_weights) + out_biases 
    #our real output is a softmax of prior result 
    #and we also compute its cross-entropy to get our loss 
    #Notice - we introduce our L2 here 
    loss = (tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
    out_layer, tf_train_labels) + 
    beta*tf.nn.l2_loss(hidden_weights_1) + 
    beta*tf.nn.l2_loss(hidden_biases_1) + 
    beta*tf.nn.l2_loss(hidden_weights_2) + 
    beta*tf.nn.l2_loss(hidden_biases_2) + 
    beta*tf.nn.l2_loss(out_weights) + 
    beta*tf.nn.l2_loss(out_biases))) 

    #variable to count number of steps taken 
    global_step = tf.placeholder(tf.int32) 

    #compute current learning rate 
    learning_rate = tf.train.exponential_decay(start_learning_rate, global_step, decay_steps, decay_size) 
    #use it in optimizer 
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step) 

    #nice, now let's calculate the predictions on each dataset for evaluating the 
    #performance so far 
    # Predictions for the training, validation, and test data. 
    train_prediction = tf.nn.softmax(out_layer) 
    valid_relu_1 = tf.nn.relu( tf.matmul(tf_valid_dataset, hidden_weights_1) + hidden_biases_1) 
    valid_relu_2 = tf.nn.relu( tf.matmul(valid_relu_1, hidden_weights_2) + hidden_biases_2) 
    valid_prediction = tf.nn.softmax(tf.matmul(valid_relu_2, out_weights) + out_biases) 

    test_relu_1 = tf.nn.relu(tf.matmul(tf_test_dataset, hidden_weights_1) + hidden_biases_1) 
    test_relu_2 = tf.nn.relu(tf.matmul(test_relu_1, hidden_weights_2) + hidden_biases_2) 
    test_prediction = tf.nn.softmax(tf.matmul(test_relu_2, out_weights) + out_biases) 



#now is the actual training on the ANN we built 
#we will run it for some number of steps and evaluate the progress after 
#every 500 steps 

#number of steps we will train our ANN 
num_steps = 3001 

#actual training 
with tf.Session(graph=graph) as session: 
    tf.initialize_all_variables().run() 
    print("Initialized") 
    for step in range(num_steps): 
    # Pick an offset within the training data, which has been randomized. 
    # Note: we could use better randomization across epochs. 
    offset = (step * batch_size) % (train_labels.shape[0] - batch_size) 
    # Generate a minibatch. 
    batch_data = train_dataset[offset:(offset + batch_size), :] 
    batch_labels = train_labels[offset:(offset + batch_size), :] 
    # Prepare a dictionary telling the session where to feed the minibatch. 
    # The key of the dictionary is the placeholder node of the graph to be fed, 
    # and the value is the numpy array to feed to it. 
    feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels, keep_prob : 0.5, global_step: step} 
    _, l, predictions = session.run(
     [optimizer, loss, train_prediction], feed_dict=feed_dict) 
    if (step % 500 == 0): 
     print("Minibatch loss at step %d: %f" % (step, l)) 
     print("Minibatch accuracy: %.1f%%" % accuracy(predictions, batch_labels)) 
     print("Validation accuracy: %.1f%%" % accuracy(
     valid_prediction.eval(), valid_labels)) 
     print("Test accuracy: %.1f%%" % accuracy(test_prediction.eval(), test_labels)) 

답변

1

대신 global_step의 자리를 사용하는 Variable를 사용해보십시오.

global_step = tf.Variable(0) 

당신은 feed_dict에서 global_step을 제거해야합니다. global_step을 수동으로 증가시킬 필요는 없으므로 tensorflow가 자동으로 수행합니다.

+0

Errrr ...이 방법은 정상적으로 작동하지만 그 이유는 무엇입니까? 왜 작동하는지에 대한 정보가 있습니까? 나는 매뉴얼에서 수동으로 증가시켜야한다는 인상을 받았지만 그렇지 않습니까? –

+2

@MaximHaytovich 수동으로 할 수도 있고 TF가 자동으로 할 수도 있습니다. 'minimize'에 대한 호출에서 global_step = global_step을 전달하면 TF가이를 자동으로 업데이트하도록 지시하므로 이것이 실패한 것입니다. 변수 접근법을 사용하는 경우 feed_dict에 전달할 필요가 없습니다. 그렇지 않으면 최소화하기 위해 전달하면 안됩니다. 변수에 넣으면 검사 점에서 다시 시작하기에 더 좋기 때문에 그렇게 할 것을 권합니다. – etarion

+0

@etarion 감사합니다. 이제 알겠습니다. –

관련 문제