创建`从iterator

问题描述:

大多数教程重点放在整个训练数据集装入内存的情况下input_fn`。但是,我有一个迭代器,它可以作为(特征,标签)的无限流--tuples(在运行中便宜地创建它们)。创建`从iterator

在实现input_fn为tensorflows estimator,我可以从迭代器返回实例作为

def input_fn(): 
    (feature_batch, label_batch) = next(it) 
    return tf.constant(feature_batch), tf.constant(label_batch) 

或不input_fn必须返回相同的(功能,标签)元组在每次调用?

而且是这个函数在训练中多次调用,因为我希望它像以下伪:

for i in range(max_iter): 
    learn_op(input_fn()) 

input_fn的参数在整个训练使用,但功能本身被调用一次。因此,创建一个复杂的input_fn不仅仅如tutorial中所解释的那样返回一个常量数组并不那么简单。

Tensorflow提出numpypanda阵列,非平凡input_fn的两个例子,但他们从内存中的数组开始,所以这并不能帮助你解决问题。

你也可以通过上面的链接看看他们的代码,看看他们如何实现一个有效的非平凡的input_fn,但你可能会发现它需要更多的代码,你想要的。

如果你愿意用Tensorflow的高层次少接口,事情恕我直言,更简单,更灵活。有一个覆盖大多数需求的tutorial,所提出的解决方案很容易实现。

特别是,如果你已经有了,你在你的问题中所述,(在以前的链接部分“喂养”)使用占位符,返回数据的迭代器应该是简单的。

+1

我会想到供给从一个迭代的网络/迭代是标准的用例,没有例外。 –

我发现,其中转换的generatorinput_fn pull请求: https://github.com/tensorflow/tensorflow/pull/7045/files

相关部分是

def _generator_input_fn(): 
    """generator input function.""" 
    queue = feeding_functions.enqueue_data(
     x, 
     queue_capacity, 
     shuffle=shuffle, 
     num_threads=num_threads, 
     enqueue_size=batch_size, 
     num_epochs=num_epochs) 

    features = (queue.dequeue_many(batch_size) if num_epochs is None 
       else queue.dequeue_up_to(batch_size)) 
    if not isinstance(features, list): 
     features = [features] 
    features = dict(zip(input_keys, features)) 
    if target_key is not None: 
     if len(target_key) > 1: 
     target = {key: features.pop(key) for key in target_key} 
     else: 
     target = features.pop(target_key[0]) 
     return features, target 
    return features 
    return _generator_input_fn