【问题标题】:Convert elements in a tensorflow array using a dictionary使用字典转换张量流数组中的元素
【发布时间】:2018-06-27 14:22:52
【问题描述】:

我有一个 tensorflow 数组,我想使用字典将它的每个元素转换为另一个元素。

这是我的数组:

elems = tf.convert_to_tensor(np.array([1, 2, 3, 4, 5, 6]))

这是字典:

d = {1:1,2:5,3:7,4:5,5:8,6:2}

转换后的结果数组应该是

tf.convert_to_tensor(np.array([1, 5, 7, 5, 8, 2]))

为了做到这一点,我尝试如下使用tf.map_fn

import tensorflow as tf
import numpy as np

d = {1:1,2:5,3:7,4:5,5:8,6:2}

elems = tf.convert_to_tensor(np.array([1, 2, 3, 4, 5, 6]))
res = tf.map_fn(lambda x: d[x], elems)
sess=tf.Session()
print(sess.run(res))

当我运行上面的代码时,我得到以下错误:

squares = tf.map_fn(lambda x: d[x], elems) KeyError: <tf.Tensor 'map/while/TensorArrayReadV3:0' shape=() dtype=int64>

这样做的正确方法是什么?我基本上是在尝试遵循 here 的用法。

附:我的数组实际上是 3D,我只是使用 1D 作为示例,因为在这种情况下代码也会失败。

【问题讨论】:

  • 这是一个用于数组的 NumPy 解决方案 - stackoverflow.com/questions/47171356
  • @Divakar 感谢您的链接!在我的情况下,这是更大张量流代码的一部分,所以我不想每次都将数组传输到一个 numpy 数组,然后再返回一个张量。我希望有一些直接的方法可以在不进行翻译的情况下做到这一点。
  • 您是否正在使用 tf.data.* 管道,这是一个中间步骤?
  • 你的密钥是0..n,还是更复杂?
  • @gdelab 不,键只是一组非负整数,例如 [0,14,30,55]。所以它们不会是连续的。

标签: python arrays numpy tensorflow machine-learning


【解决方案1】:

你应该使用tensorflow.contrib.lookup.HashTable:

import tensorflow as tf
import numpy as np

d = {1:1,2:5,3:7,4:5,5:8,6:2}
keys = list(d.keys())
values = [d[k] for k in keys]
table = tf.contrib.lookup.HashTable(
  tf.contrib.lookup.KeyValueTensorInitializer(keys, values, key_dtype=tf.int64, value_dtype=tf.int64), -1
)
elems = tf.convert_to_tensor(np.array([1, 2, 3, 4, 5, 6]), dtype=tf.int64)
res = tf.map_fn(lambda x: table.lookup(x), elems)
sess=tf.Session()
sess.run(table.init)
print(sess.run(res))

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多