我想根据几个批次的损失值之和来训练模型的权重。但是,似乎一旦为每个批次运行图形,返回的对象只是一个常规的numpy数组。因此,当您尝试使用像GradientDescentOptimizer这样的优化器时,它不再具有用于计算损失总和的变量的信息,因此无法找到有助于最小化损失的权重的梯度。这是一个示例tensorflow脚本来说明我在说什么:
weights = tf.Variable(tf.ones([num_feature_values], tf.float32))
feature_values = tf.placeholder(tf.int32, shape=[num_feature_values])
labels = tf.placeholder(tf.int32, shape=[1])
loss_op = some_loss_function(weights, feature_values, labels)
with tf.Session() as sess:
for batch in batches:
feed_dict = fill_feature_values_and_labels(batch)
#Calculates loss for one batch
loss = sess.run(loss_op, feed_dict=feed_dict)
#Adds it to total loss
total_loss += loss
# Want to train weights to minimize total_loss, however this
# doesn't work because the graph has already been run.
optimizer = tf.train.GradientDescentOptimizer(1.0).minimize(total_loss)
with tf.Session() as sess:
for step in xrange(num_steps):
sess.run(optimizer)
total_loss
是一个numpy数组,因此无法在优化器中使用。有没有人知道解决问题的方法,我希望在多个批次中使用信息,但仍然需要图表完整,以保留total_loss
是权重函数的事实?
答案 0 :(得分:0)
你在任何培训师中优化的东西必须是图表的一部分,这里你训练的是实际的实现结果,所以它不起作用。
我认为您应该这样做的方法是将输入构建为一批批次,例如
intput = tf.placeholder("float", (number_of_batches, batch_size, input_size)
然后你的目标也是一个可以训练的3d张量。