我在TensorFlow中训练我的深度网络,并尝试使用学习率衰减。我认为应该使用train.exponential_decay函数来实现这一点 – 它将使用各种参数计算当前训练步的适当学习率值。我只需要提供当前执行的步数。我原本以为应该像往常一样使用tf.placeholder(tf.int32)来提供网络所需的输入,但看来我错了。当我这样做时,我得到了下面的错误:
TypeError: Input 'ref' of 'AssignAdd' Op requires l-value input
我做错了什么?不幸的是,我还没有找到关于带衰减的网络训练的好例子。我的完整代码如下。网络有2个隐藏的ReLU层,对权重有L2惩罚,并且在两个隐藏层上都有dropout。
#我们尝试以下内容 - 2个ReLU层#在两个层上使用Dropout#对它们也进行L2正则化#以及学习率衰减#SGD的批量大小batch_size = 128#L2损失的beta参数beta = 0.001#我们想要的隐藏神经元数量num_hidden_neurons = 1024#学习率衰减#起始值,衰减执行的步数,#衰减大小start_learning_rate = 0.05decay_steps = 1000decay_size = 0.95#构建TensorFlow图graph = tf.Graph()with graph.as_default(): # 输入数据。对于训练数据,我们使用一个在运行时会填充训练小批量的占位符。 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) #现在让我们构建第一个隐藏层 #它的权重 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])) #现在是第一层本身。它将数据乘以权重,加上偏置 #并对结果进行ReLU处理 hidden_layer_1 = tf.nn.relu(tf.matmul(tf_train_dataset, hidden_weights_1) + hidden_biases_1) #在隐藏层1上添加dropout #我们选择关闭激活的概率 #并执行激活的关闭 keep_prob = tf.placeholder("float") hidden_layer_drop_1 = tf.nn.dropout(hidden_layer_1, keep_prob) #现在让我们构建第二个隐藏层 #它的权重 hidden_weights_2 = tf.Variable( tf.truncated_normal([num_hidden_neurons, num_hidden_neurons])) hidden_biases_2 = tf.Variable(tf.zeros([num_hidden_neurons])) #现在是第二层本身。它将数据乘以权重,加上偏置 #并对结果进行ReLU处理 hidden_layer_2 = tf.nn.relu(tf.matmul(hidden_layer_drop_1, hidden_weights_2) + hidden_biases_2) #在隐藏层2上添加dropout #我们选择关闭激活的概率 #并执行激活的关闭 hidden_layer_drop_2 = tf.nn.dropout(hidden_layer_2, keep_prob) #是时候构建输出线性层了 #输出权重连接隐藏神经元到输出标签 #偏置被添加到输出标签 out_weights = tf.Variable( tf.truncated_normal([num_hidden_neurons, num_labels])) out_biases = tf.Variable(tf.zeros([num_labels])) #计算输出 #注意,在训练时我们使用关闭的激活 #即使用dropout激活的hidden_layer的变体 out_layer = tf.matmul(hidden_layer_drop_2,out_weights) + out_biases #我们的真实输出是之前结果的softmax #我们也计算其交叉熵来获取我们的损失 #注意 - 我们在这里引入了L2 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))) #用于计数执行步数的变量 global_step = tf.placeholder(tf.int32) #计算当前学习率 learning_rate = tf.train.exponential_decay(start_learning_rate, global_step, decay_steps, decay_size) #在优化器中使用它 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step) #很好,现在让我们计算每个数据集的预测,以评估迄今为止的性能 #训练、验证和测试数据的预测。 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)#现在是我们构建的ANN的实际训练#我们将运行一定数量的步数,并在#每500步后评估进度#我们将训练ANN的步数num_steps = 3001#实际训练with tf.Session(graph=graph) as session: tf.initialize_all_variables().run() print("Initialized") for step in range(num_steps): # 在训练数据中选择一个偏移量,该数据已被随机化。 # 注意:我们可以跨epoch使用更好的随机化。 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), :] # 准备一个字典,告诉会话在哪里填充小批量。 # 字典的键是图中要填充的占位符节点, # 值是要填充给它的numpy数组。 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("第%d步的小批量损失: %f" % (step, l)) print("小批量准确率: %.1f%%" % accuracy(predictions, batch_labels)) print("验证准确率: %.1f%%" % accuracy( valid_prediction.eval(), valid_labels)) print("测试准确率: %.1f%%" % accuracy(test_prediction.eval(), test_labels))
回答:
不要使用global_step
的占位符,尝试使用Variable
。
global_step = tf.Variable(0)
你需要从feed_dict
中移除global_step
。请注意,你不需要手动增加global_step
,TensorFlow会自动为你完成这一操作。