【问题标题】:How to read a tensor as a numpy array or list in Tensorflow?如何在 Tensorflow 中将张量读取为 numpy 数组或列表?
【发布时间】:2019-08-14 12:37:23
【问题描述】:

我有一个张量 x,

x={Tensor} Tensor("Cast:0", shape=(?,3), dtype=int32)

现在,我需要遍历这个张量批次的每个三元组(比如一个三元组是 (a,b,c))并获取其中的第一个元素(在本例中为 a)。

然后,我需要获取数据集 Y(如下)中的所有其他三元组,它们的第一个元素也为 'a'。

最终,我希望返回所有以 'a' 作为第一个元素的三元组,不包括有问题的三元组(即在这种情况下,不包括 (a,b,c))。

假设 x 是一个列表,我之前也在使用相同的方法。

因此,就列表操作而言:

t=list({triple for x in x_to_score for triple in self.d[x[0]]} - set(x_to_score.eval()))

其中 d 是一个字典,其中包含按第一个元素分组的所有三元组的列表。例如:

对于

    Y=np.array([['a', 'y', 'b'],
              ['b', 'y', 'a'],
              ['a', 'y', 'c'],
              ['c', 'y', 'a'],
              ['a', 'y', 'd'],
              ['c', 'y', 'd'],
              ['b', 'y', 'c'],
              ['f', 'y', 'e']])

    d={'f': [('f', 'y', 'e')],
       'c': [('c', 'y', 'a'), ('c', 'y', 'd')],
        'a': [('a', 'y', 'b'), ('a', 'y', 'c'), ('a', 'y', 'd')],
        'b': [('b', 'y', 'a'), ('b', 'y', 'c')]}

但是,我是 tensorflow 的新手,无法找到将这些操作转换为张量的方法。对于每个评估的三元组,结果也应该是 [?,3] 的顺序。

请注意,必须禁用急切执行。

欢迎任何帮助!

编辑: 如果输入张量 x=(a,y,d)(注意这可以是一个批次,所以 x=[(a,y,d),(b,y,c)] 等),那么预期的输出将是:

[('a', 'y', 'b'), ('a', 'y', 'c')]

【问题讨论】:

  • 您能否给出示例中的X 数组所需的输出?我不明白您是否想要 X 中的“三元组”匹配 first 三元组或 each 三元组的第一个元素,如果是第二种情况,我不确定你是否想要获得几个张量或什么。另外,我不清楚X 是否可能包含重复的三元组,在这种情况下,是否需要排除匹配的三元组的副本。
  • @jdehesa 刚刚意识到问题不是很清楚,进行了编辑。数据集 Y 或 x 中不会有重复的三元组。
  • 好的,但是你说“注意这可以是一个批处理”,那么在批处理的情况下你会得到什么输出?连接所有子结果?多个张量? 3D 张量(在这种情况下,每个给定输入的匹配数必须相同,否则结果需要不规则或填充)?
  • @jdehesa 基本上是一个 [n,3] 列表,它是所有连接的子结果,但对于每个主题都是可区分的。所以在 [(a,y,d),(b,y,c)] 的示例批次中,结果应该是 [[(a,y,b),(a,y,c)],[(b, y,a)]]
  • 好的,一批内匹配的三元组数,是固定的吗?因为如果它是可变的,你将无法做到这一点(如果你想要一个 Python 的张量列表,该列表的大小必须是固定的并且事先知道)。

标签: python numpy tensorflow tensor-indexing


【解决方案1】:

对此的一种可能解决方案是计算数组结果,一个与所有输入的连接匹配,另一个指示它所引用的输入的索引。它可以像这样工作:

import tensorflow as tf

X = tf.placeholder(tf.string, [None, 3])
Y = tf.constant([
    ['a', 'y', 'b'],
    ['b', 'y', 'a'],
    ['a', 'y', 'c'],
    ['c', 'y', 'a'],
    ['a', 'y', 'd'],
    ['c', 'y', 'd'],
    ['b', 'y', 'c'],
    ['f', 'y', 'e']
])
# Compare every input to every data
cmp = tf.equal(tf.expand_dims(X, 1), Y)
# Triples matching the first element
first_match = cmp[:, :, 0]
# Triples matching all elements
all_match = tf.reduce_all(cmp, axis=2)
# Triple matching the first element but not all elements
matches = first_match & (~all_match)
# Find indices
match_idx = tf.where(matches)
# Index of the input triple each result refers to
match_x = match_idx[:, 0]
# Concatenated resulting triples
match_y = tf.gather(Y, match_idx[:, 1])
# Test
with tf.Graph().as_default(), tf.Session() as sess:
    x_val = [['a', 'y', 'd'], ['b', 'y', 'c']]
    match_x_val, match_y_val = sess.run((match_x, match_y), feed_dict={X: x_val})
    print(*zip(match_x_val, match_y_val), sep='\n')

输出:

(0, array([b'a', b'y', b'b'], dtype=object))
(0, array([b'a', b'y', b'c'], dtype=object))
(1, array([b'b', b'y', b'a'], dtype=object))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-09
    • 2020-12-31
    • 2021-10-13
    • 2021-08-15
    • 2017-08-11
    • 2021-02-02
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多