TensorFlow中MutableHashTable用int64键值对报InvalidArgumentError问题
解决TensorFlow MutableHashTable int64键值对的OpKernel错误
问题根源
从你贴的错误日志就能看出问题所在——你用的应该是比较旧的TensorFlow 1.x版本(毕竟还在使用tf.contrib模块和Session),当时的MutableHashTableV2算子没有注册支持int64键+int64值的CPU/GPU内核,日志里列的已注册组合里确实找不到这一项;而HashTable是不可变哈希表,它的内核早就支持这个类型组合了,所以能正常运行。
可行解决方案
1. 升级TensorFlow版本(最推荐)
较新的TensorFlow 1.x后期版本或者TensorFlow 2.x已经修复了这个内核缺失的问题,而且TF2.x里已经把哈希表模块从tf.contrib移到了正式的tf.lookup下。比如TF2.x的示例代码:
import tensorflow as tf keys = tf.range(10, dtype=tf.int64) vals = tf.range(10, dtype=tf.int64) table = tf.lookup.MutableHashTable( key_dtype=tf.int64, value_dtype=tf.int64, default_value=-1 ) table.insert(keys, vals) print(table.lookup(tf.range(20, dtype=tf.int64)).numpy())
2. 临时类型转换(无法升级时用)
如果因为环境限制没法升级TF,你可以临时把值的类型转换成tf.float64这类MutableHashTable支持的类型,查询后再转回来。示例代码:
import tensorflow as tf with tf.Session() as sess: keys = tf.range(10, dtype=tf.int64) # 把int64的值转成float64,适配已注册的内核组合 vals = tf.cast(tf.range(10, dtype=tf.int64), tf.float64) table = tf.contrib.lookup.MutableHashTable( key_dtype=tf.int64, value_dtype=tf.float64, default_value=-1.0 ) table.insert(keys, vals) # 查询结果转回int64 result = tf.cast(table.lookup(tf.range(20, dtype=tf.int64)), tf.int64) print(sess.run(result))
3. 沿用不可变HashTable(不需要动态修改时)
如果你的业务场景不需要动态插入、修改哈希表内容,直接用你已经验证可行的tf.contrib.lookup.HashTable就好,这是最省心的方案。
补充说明
不可变哈希表和可变哈希表的实现逻辑差异很大,TensorFlow早期对可变哈希表的内核支持不够全面,漏掉了int64键值对的组合,后续版本才补全了这部分支持。
内容的提问来源于stack exchange,提问作者kafaso
相关产品推荐
相关产品推荐

