TensorFlow学习率衰减 – 如何正确提供衰减的步数?

我在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会自动为你完成这一操作。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注