tf.lookup.StaticHashTable以列表任意大小作为值

问题描述

我想为每个人的名字关联一个数字列表。

keys = ["Fritz","Franz","Fred"]
values = [[1,2,3],[4,5],[6,7,8,9]]

如果我运行以下命令:

import tensorflow as tf
table = tf.lookup.StaticHashTable(tf.lookup.keyvalueTensorInitializer(keys,values),default_value=0)

,我得到一个ValueError: Can't convert non-rectangular Python sequence to Tensor. 因为列表的大小不同,因此无法转换为tf.Tensor

还有另一种方法来将张量的值与任意形状的列表相关联吗?

谢谢您的帮助:)

解决方法

StaticHashTable-从TF 2.3开始-无法返回多维值,更不用说参差不齐的值了。因此,尽管填充了值,还是创建了一个像这样的哈希表:

keys = ["Fritz","Franz","Fred"]
values = [[1,2,3,-1],[4,5,-1,[6,7,8,9]]
table_init = tf.lookup.KeyValueTensorInitializer(keys,values)
table = tf.lookup.StaticHashTable(table_init,-1)

将引发以下错误:

InvalidArgumentError: Expected shape [3] for value,got [3,4] [Op:LookupTableImportV2]

为避免这种情况,您可以使用Dense hash tables,尽管它处于实验模式。密集哈希表和静态哈希表均不支持参差不齐的密钥or values。因此,最好的选择是填充您的值,并创建一个密集的哈希表。在查找过程中,您可以将它们重新拉回。总体代码如下:

keys = ["Fritz",9]]
table = tf.lookup.experimental.DenseHashTable(key_dtype=tf.string,value_dtype=tf.int64,empty_key="<EMPTY_SENTINEL>",deleted_key="<DELETE_SENTINEL>",default_value=[-1,-1])
table.insert(keys,values)

在查找过程中:

>>> tf.RaggedTensor.from_tensor(table.lookup(['Franz','Emil']),padding=-1)
<tf.RaggedTensor [[4,5],[]]>