【发布时间】:2018-09-28 10:06:05
【问题描述】:
我在我的代码中使用了一个可初始化的迭代器。迭代器从具有 20.000 个条目的 csv 数据集中返回大小为 100 的批次。然而,在训练过程中,我遇到了一个问题。考虑这段代码:
def get_dataset_iterator(batch_size):
# parametrized with batch_size
dataset = ...
return dataset.make_initializable_iterator()
## build a model and train it (x is the input of my model)
iterator = get_dataset_iterator(100)
x = iterator.get_next()
y = model(x)
## L1 norm as loss, this works because the model is an autoencoder
loss = tf.abs(x - y)
## training operator
train_op = tf.train.AdamOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
for epoch in range(100):
sess.run(iterator.initializer)
# iterate through the whole dataset once during the epoch and
# do 200 mini batch updates
for _ in range(number_of_samples // batch_size):
sess.run(train_op)
print(f'Epoch {epoch} training done!')
# TODO: print loss after epoch here
我对完成 epoch 后的训练损失感兴趣。对我来说最有意义的是我计算整个训练集的平均损失(例如,通过网络输入所有 20.000 个样本并平均它们的损失)。我可以在这里重用数据集迭代器,批量大小为 20.000,但我已将 x 声明为输入。
所以问题是:
1.) 对所有 20.000 个示例进行损失计算是否有意义?我见过有些人只用一个小批量(时代的最后一批)进行计算。
2.) 如何使用输入管道计算整个训练集的损失?我必须以某种方式注入所有的训练数据,这样我就可以运行sess.run(loss),而不需要仅计算 100 个样本(因为 x 被声明为输入)。
编辑澄清:
如果我按以下方式编写训练循环,会有一些事情困扰我:
with tf.Session() as sess:
for epoch in range(100):
sess.run(iterator.initializer)
# iterate through the whole dataset once during the epoch and
# do 200 mini batch updates
for _ in range(number_of_samples // batch_size):
_, current_loss = sess.run([train_op, loss])
print(f'Epoch {epoch} training done!')
print(current_loss)
首先,在进行最后一次权重更新之前,仍会评估损失。这意味着出现的任何东西都不是最新的值。其次,退出 for 循环后我将无法访问current_loss,因此无法打印。
【问题讨论】:
标签: python python-3.x tensorflow