【问题标题】:Sampling from tensorflow Dataset into same tensor multiple times per single session.run() call每个 session.run() 调用多次从 tensorflow 数据集中采样到相同的张量
【发布时间】:2019-06-05 16:41:38
【问题描述】:

考虑以下示例:

import tensorflow as tf
import numpy as np

X = np.arange(4).reshape(4, 1) + (np.arange(3) / 10).reshape(1, 3)

batch = tf.data.Dataset.from_tensor_slices(X) \
        .batch(2).make_one_shot_iterator().get_next()

def foo(x):
    return x + 1

tensor = foo(batch)

现在,我正在寻找一种能够在每次 session.run() 调用中多次采样 tensor 的方法,即:

def bar(x):
    return x - 1

result1 = bar(tensor)
with tf.control_dependencies([result1]):
    op = <create operation to sample from dataset into `tensor` again>
    with tf.control_dependencies([op]):
        result2 = bar(tensor)

sess = tf.Session()
print(*sess.run([result1, result2]), sep='\n\n')

应该输出:

[[0.  0.1 0.2]
 [1.  1.1 1.2]]

[[2.  2.1 2.2]
 [3.  3.1 3.2]]

这可能吗?我知道可以多次调用get_next() 以获取不同张量对象中的多个数据集样本,但是一个样本可以进入相同张量对象吗?

对我来说,用例是这样的,该代码的 foobar 部分是分开的,而 foo 部分不知道每次运行需要多少次样本。

附: 我正在使用 tf 1.12。 1.13 也是一个选项,但不是 tf 2。

【问题讨论】:

    标签: python tensorflow tensorflow-datasets


    【解决方案1】:

    是的,这是可能的。

    关于您迄今为止尝试过的一些见解:

    1. 每次需要数据集中的新值时,您都可以使用从make_one_shot_iterator() 返回的数据集迭代器
    2. 您可以创建属于 tf 图一部分的自己的函数,以通过foo() 传递结果

    这样的东西可以提供你想要的输出(据我所知)

    import tensorflow as tf
    import numpy as np
    
    X = np.arange(4).reshape(4, 1) + (np.arange(3) / 10).reshape(1, 3)
    
    iterator = tf.data.Dataset.from_tensor_slices(X) \
            .batch(2).make_one_shot_iterator()
    
    def foo(x):
        return x + 1
    
    def get_tensor():
      return foo(iterator.get_next())
    
    tensor = get_tensor()
    
    def bar(x):
        return x - 1
    
    result1 = bar(tensor)
    with tf.control_dependencies([result1]):
        op = get_tensor()
        with tf.control_dependencies([op]):
            result2 = bar(op)
    
    sess = tf.Session()
    print(*sess.run([result1, result2]), sep='\n\n')
    

    【讨论】:

    • 谢谢,但这不是采样到相同的张量对象,而是创建一个新的张量。最初我想避免这种情况,但现在我想起来了,我可能没有充分的理由要避免这种情况。不过,我仍然很好奇是否可以重新采样到相同的张量。
    • 对不起,误解 - 我不确定你所说的“采样”同一个张量对象是什么意思(我误认为这是“从同一个数据集对象获取下一个样本张量”)。您当然可以多次重复使用tensor 作为后续操作的输入,但我怀疑这不是您的意思?张量只不过是一组(结构化的)数字。您可以为变量名称分配一个新的张量,您可以使用tf.assign 更改值,您可以将张量作为输入传递给任意数量的下游操作,但听起来您有其他想法?
    • 嗯,我的意思是如下。如果我有一个张量包含数据集中的样本/批次,然后我对该张量进行了许多后续操作,我希望能够在该数据集中的另一个样本/批次上重用这些精确操作,而无需构建副本图中的操作分支。
    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2019-10-18
    • 2018-09-18
    • 2019-09-22
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多