我正在使用tensorflow的Estimator API,并想创建自定义批次进行训练。
我有一些看起来如下的例子
example1 = {
"num_sentences": 3,
"sentences": [[1, 2], [3, 4], [5, 6]]
}
example2 = {
"num_sentences": 2,
"sentences": [[1, 2], [3, 4]]
}
因此,一个示例可以具有任意数量的固定大小的句子。现在,我想构建批处理,其大小取决于批处理中句子的数量。否则,我必须使用批处理大小1,因为某些示例可能包含“批处理大小”语句,并且大批处理大小不适合GPU内存。
例如:我的批处理大小为6,示例的句子数为[5、3、3、2、2、1]。然后,我将示例分为批次[5],[3、3]和[2、2、1]。请注意,最后一批中的示例“ 1”将被填充。
我编写了一种算法,将示例分组到这样的批处理中。现在,我无法将批次输入tf.data.Dataset。
我尝试使用tf.data.Dataset.from_generator
,但是该方法似乎期望使用单独的示例,并且如果生成器产生的批处理类似于[example1,example2],则会出错。
如何为数据集提供自定义批次?有没有更优雅的方式来解决我的问题?
更新:我假设我无法正确提供输出形状参数。以下代码可以正常工作。
import tensorflow as tf
def gen():
for b in range(3):
#yield [{"num_sentences": 3, "sentences": [[1, 2], [3, 4], [5, 6]]}]
yield {"num_sentences": 3, "sentences": [[1, 2], [3, 4], [5, 6]]}
dataset = tf.data.Dataset.from_generator(generator=gen,
output_types={'num_sentences': tf.int32, 'sentences': tf.int32},
#output_shapes=tf.TensorShape([None, {'num_sentences': tf.TensorShape(None), 'sentences': tf.TensorShape(None)}])
output_shapes={'num_sentences': tf.TensorShape(None), 'sentences': tf.TensorShape(None)}
)
def print_dataset(dataset):
it = dataset.make_one_shot_iterator()
with tf.Session() as sess:
print(dataset.output_shapes)
print(dataset.output_types)
while True:
try:
data = it.get_next()
print("data" + str(sess.run(data)))
except tf.errors.OutOfRangeError:
break
print_dataset(dataset)
如果我改为生成一个数组并取消注释output_shapes,则会收到错误消息“ int()参数必须是字符串,类似字节的对象或数字,而不是'dict' “
答案 0 :(得分:0)
我想我已经找到解决上述问题的方法。我认为我必须将这些示例合并到“一个”字典中。
# a batch with two examples each with sentence size 3
yield {"num_sentences": [3, 3], "sentences": [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]}