【问题标题】:filtering "empty" values from Tensorflow从 Tensorflow 过滤“空”值
【发布时间】:2017-09-07 08:57:54
【问题描述】:

我编写这段代码是为了从Dataset 中过滤

import tensorflow as tf
import tensorflow.contrib.data as ds

def make_graph():
    inits = []
    filter_value = tf.constant([6], dtype=tf.int64)
    source = ds.Dataset.range(10)
    batched = source.batch(3)
    batched_iter = batched.make_initializable_iterator()
    batched_next = batched_iter.get_next()
    inits.append(batched_iter.initializer)
    predicate = tf.less_equal(batched_next, filter_value, name="less_than_filter")
    true_coordinates = tf.where(predicate)
    reshaped = tf.reshape(true_coordinates, [-1])
    # need to turn bools into 1 and 0 elsewhere
    found = tf.gather(params=batched_next, indices=reshaped)

    return found, inits # prepend final tensor

def run_graph(final_tensor, initializers, rounds):
    with tf.Session() as sess:
        init_ops = (tf.local_variables_initializer(), tf.global_variables_initializer())
        sess.run(init_ops)
        summary_writer = tf.summary.FileWriter(graph=sess.graph, logdir=".")
        while rounds > 0:
            for i in initializers:
                sess.run(i)
            try:
                while True:
                    final_result = sess.run(final_tensor)
                    p```pythrint("Got result: {r}".format(r=final_result))
            except tf.errors.OutOfRangeError:
                print("Got out of range error")
            rounds -=1

        summary_writer.flush()

def run():
    final_tensor, initializers = make_graph()
    run_graph(final_tensor=final_tensor,
              initializers=initializers,
              rounds=1)

if __name__ == "__main__":
    run()

但是,结果如下:

Got result: [0 1 2]
Got result: [3 4 5]
Got result: [6]
Got result: []
Got out of range error

有没有办法过滤这个空的张量? 我试图集思广益,可能使用tf.while 循环,但我不确定在 Tensorflow 中,我是否遗漏了某些东西或这样的操作(即 OpKernel 通过不根据其值产生输出来“丢弃”输入)是不可能的。

【问题讨论】:

标签: python tensorflow


【解决方案1】:

在批处理之前只保留值 :

dataset = ds.Dataset.range(10)
dataset = dataset.filter( lambda v : v <= 6 )
dataset = dataset.batch(3)
batched_iter = dataset.make_initializable_iterator()

这将生成仅包含您想要的数据的批次。请注意,通常最好在构建批次之前过滤掉不需要的数据。这样,迭代器就不会生成空的张量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2015-07-10
    • 2022-11-15
    • 1970-01-01
    • 2017-08-24
    • 2012-10-21
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多