Python 在单个会话中多次从tensorflow数据集中采样到同一个tensor中。run()调用

Python 在单个会话中多次从tensorflow数据集中采样到同一个tensor中。run()调用,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,考虑以下示例: 将tensorflow导入为tf 将numpy作为np导入 X=np.arange(4)。重塑(4,1)+(np.arange(3)/10)。重塑(1,3) batch=tf.data.Dataset.from_tensor_切片(X)\ .batch(2).生成一个\u shot\u迭代器().get\u next() def foo(x): 返回x+1 张量=foo(批次) 现在,我正在寻找一种方法,可以在单个会话中多次对张量进行采样。run()调用,即: def条(x):

考虑以下示例:

将tensorflow导入为tf
将numpy作为np导入
X=np.arange(4)。重塑(4,1)+(np.arange(3)/10)。重塑(1,3)
batch=tf.data.Dataset.from_tensor_切片(X)\
.batch(2).生成一个\u shot\u迭代器().get\u next()
def foo(x):
返回x+1
张量=foo(批次)
现在,我正在寻找一种方法,可以在单个
会话中多次对
张量进行采样。run()
调用,即:

def条(x):
返回x-1
结果1=巴(张量)
使用tf.control_依赖项([result1]):
op=
使用tf.control_依赖项([op]):
结果2=巴(张量)
sess=tf.Session()
打印(*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()
以在不同的张量对象中获取多个数据集样本,但是一个样本可以进入相同的张量对象吗

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

附言。 我用的是TF1.12。1.13也是一个选项,但不是TF2。

是的,这是可能的

关于您迄今为止所做的尝试的几点见解:

  • 每次需要数据集中的新值时,都可以使用从
    make\u one\u shot\u iterator()
    返回的数据集迭代器
  • 您可以创建自己的函数作为tf图的一部分,将结果通过
    foo()
  • 类似这样的东西可以提供您想要的输出(据我所知)

    将tensorflow导入为tf
    将numpy作为np导入
    X=np.arange(4)。重塑(4,1)+(np.arange(3)/10)。重塑(1,3)
    迭代器=tf.data.Dataset.from_tensor_切片(X)\
    .batch(2).make_one_shot_iterator()
    def foo(x):
    返回x+1
    def get_tensor():
    返回foo(迭代器.get_next())
    张量=得到张量()
    def巴(x):
    返回x-1
    结果1=巴(张量)
    使用tf.control_依赖项([result1]):
    op=get_张量()
    使用tf.control_依赖项([op]):
    结果2=巴(op)
    sess=tf.Session()
    打印(*sess.run([result1,result2]),sep='\n\n')
    
    是的,这是可能的

    关于您迄今为止所做的尝试的几点见解:

  • 每次需要数据集中的新值时,都可以使用从
    make\u one\u shot\u iterator()
    返回的数据集迭代器
  • 您可以创建自己的函数作为tf图的一部分,将结果通过
    foo()
  • 类似这样的东西可以提供您想要的输出(据我所知)

    将tensorflow导入为tf
    将numpy作为np导入
    X=np.arange(4)。重塑(4,1)+(np.arange(3)/10)。重塑(1,3)
    迭代器=tf.data.Dataset.from_tensor_切片(X)\
    .batch(2).make_one_shot_iterator()
    def foo(x):
    返回x+1
    def get_tensor():
    返回foo(迭代器.get_next())
    张量=得到张量()
    def巴(x):
    返回x-1
    结果1=巴(张量)
    使用tf.control_依赖项([result1]):
    op=get_张量()
    使用tf.control_依赖项([op]):
    结果2=巴(op)
    sess=tf.Session()
    打印(*sess.run([result1,result2]),sep='\n\n')
    
    谢谢,但这不是对同一张量对象进行采样,而是创建一个新的张量。起初我想避免这种情况,但现在我想起来了,可能没有什么好的理由让我想避免这种情况。我仍然很好奇是否有可能对同一个张量进行重新采样。很抱歉误解了-我不确定“采样到”同一个张量对象是什么意思(我误认为这是“从同一数据集对象获取下一个样本张量”)。您当然可以重复使用
    tensor
    作为后续操作的输入,但我怀疑这不是您的意思?张量只不过是一组(结构化的)数字。你可以给变量名分配一个新的张量,你可以用
    tf更改值。分配
    ,你可以把张量作为输入传递给任意多个下游操作,但听起来你好像在想别的什么?好吧,我的意思是如下所示。如果我有一个从数据集中保存样本/批次的张量,然后我对该张量进行了大量后续操作,我希望能够在该数据集中的另一个样本/批次上重用这些精确操作,而无需在图中构建重复的操作分支。谢谢,但这不是对同一个张量对象进行采样,这是在创建一个新的张量。起初我想避免这种情况,但现在我想起来了,可能没有什么好的理由让我想避免这种情况。我仍然很好奇是否有可能对同一个张量进行重新采样。很抱歉误解了-我不确定“采样到”同一个张量对象是什么意思(我误认为这是“从同一数据集对象获取下一个样本张量”)。您当然可以重复使用
    tensor
    作为后续操作的输入,但我怀疑这不是您的意思?张量只不过是一组(结构化的)数字。你可以给变量名分配一个新的张量,你可以用
    tf更改值。分配
    ,你可以把张量作为输入传递给任意多个下游操作,但听起来你好像在想别的什么?好吧,我的意思是如下所示。如果我有一个从数据集中保存样本/批次的张量,然后我在该张量上有许多后续操作,我希望能够在该数据集中的另一个样本/批次上重用这些精确操作,而无需在图中构建重复的操作分支。