代码之家  ›  专栏  ›  技术社区  ›  AlexIIP

TensorFlow 1.12将dataset.filter应用于dataset.window

  •  1
  • AlexIIP  · 技术社区  · 7 年前

    我有一个顺序数据集,从中创建窗口以训练RNN。有些情况下,我想扔掉某些窗户。但是,当我使用 dataset.window 然后 dataset.filter 管道内有东西破裂了。这是一个玩具的例子,有人能告诉我如何正确地做这件事吗?这个玩具例子说明了我的问题。下面的代码创建大小为4的窗口,然后每批创建4个窗口。如果窗口中的最后一个元素是奇数,我想丢弃一个窗口,因此我的批处理将始终为4大小,但批处理中的窗口始终必须以事件元素结束。

    import tensorflow as tf
    sess = tf.InteractiveSession()
    ds = tf.data.Dataset.range(100)
    ds = ds.window(size=4, shift=1,
                   stride=1,
                   drop_remainder=True).flat_map(lambda x: x.batch(4))
    
    #*I want to keep the window if the last element in the window is even*
    ds = ds.filter(lambda x: x[3] % 2 == 0) 
    
    ds = ds.repeat()
    ds = ds.batch(4, drop_remainder=True)
    it = ds.make_one_shot_iterator()
    data = it.get_next()
    for i in range(100):
        print(sess.run([data]))
    sess.close()
    

    这会引发以下错误:

    OutOfRangeError: End of sequence
         [[{{node IteratorGetNext_6}} = IteratorGetNext[output_shapes=[[4,?]], output_types=[DT_INT64], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator_6)]]
    
    During handling of the above exception, another exception occurred:
    
    OutOfRangeError                           Traceback (most recent call last)
    <ipython-input-54-d6d959b5be78> in <module>
          1 for i in range(100):
    ----> 2     print(sess.run([data]))
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   kvish    7 年前

    如果查看中谓词的返回类型, filter 方法,您需要返回一个标量tf bool张量,我怀疑您的python谓词没有发生这种情况。修改代码以返回这样一个张量,会得到结果。

    import tensorflow as tf
    sess = tf.InteractiveSession()
    ds = tf.data.Dataset.range(100)
    ds = ds.window(size=4, shift=1,
                   stride=1,
                   drop_remainder=True).flat_map(lambda x: x.batch(4))
    
    #*I want to keep the window if the last element in the window is even*
    ds = ds.filter(lambda x: tf.equal(x[3] % 2, 0)) 
    
    ds = ds.repeat()
    ds = ds.batch(4, drop_remainder=True)
    it = ds.make_one_shot_iterator()
    data = it.get_next()
    for i in range(100):
        print(sess.run([data]))
    sess.close()
    

    结果:

    [array([[ 1,  2,  3,  4],
           [ 3,  4,  5,  6],
           [ 5,  6,  7,  8],
           [ 7,  8,  9, 10]])]
    [array([[ 9, 10, 11, 12],
           [11, 12, 13, 14],
           [13, 14, 15, 16],
           [15, 16, 17, 18]])]
    [array([[17, 18, 19, 20],
           [19, 20, 21, 22],
           [21, 22, 23, 24],
           [23, 24, 25, 26]])]
    [array([[25, 26, 27, 28],
           [27, 28, 29, 30],
           [29, 30, 31, 32],
           [31, 32, 33, 34]])]
    [array([[33, 34, 35, 36],
           [35, 36, 37, 38],
           [37, 38, 39, 40],
           [39, 40, 41, 42]])]
    

    等等

    推荐文章