TypeError: Tensor is unhashable. Instead, use tensor.ref()

TypeError: Tensor is unhashable. Instead, use tensor.ref()

我收到“TypeError: Tensor is unhashable。相反,请使用 tensor.ref() 作为键”

我对 a public kaggle kernel

做了一点改动

我定义了一个函数来检查某个值是否在一个集合中:

li = pd.read_csv('../input/ch-stock-market-companies/censored_list')
def map_id (id):
  li_set = set(li['investment_id'])
  if id in li_set: return id
  return -5

在预处理 tensorflow 数据集期间调用此函数:

def preprocess(item):
  return (map_id(item["investment_id"]), item["features"]), item["target"] #this is the offending line

def make_dataset(file_paths, batch_size=4096, mode="train"):
  ds = tf.data.TFRecordDataset(file_paths)
  ds = ds.map(decode_function)
  ds = ds.map(preprocess)
  if mode == "train":
      ds = ds.shuffle(batch_size * 4)
  ds = ds.batch(batch_size).cache().prefetch(tf.data.AUTOTUNE)
  return ds

如果不更改上述违规行,它将如下所示:

    def preprocess(item):
      return (item["investment_id"], item["features"]), item["target"] #this was the line before I changed it

错误信息告诉我不能使用定义的函数map_id

但是如何正确地实现我想要实现的目标呢?也就是说,我想通过将 pandas 数据框中的某些值替换为默认值 -5 来“审查”它们。我想这样做,理想情况下,作为创建 tensforflow 数据集的一部分

如错误消息所述,您不能直接在 Set 中使用张量,因为它不可哈希。尝试使用 tf.lookup.StaticHashTable:

keys_tensor = tf.constant([1, 2, 3])
vals_tensor = tf.constant([1, 2, 3])
table = tf.lookup.StaticHashTable(
    tf.lookup.KeyValueTensorInitializer(keys_tensor, vals_tensor),
    default_value=-5)

print(table.lookup(tf.constant(1)))
print(table.lookup(tf.constant(5)))
tf.Tensor(1, shape=(), dtype=int32)
tf.Tensor(-5, shape=(), dtype=int32)

或者,您也可以使用 tf.where:

def check_value(value):
  frozen_set = tf.constant([1, 2, 3])
  return tf.where(tf.reduce_any(tf.equal(value, frozen_set), axis=0, keepdims=True), value, tf.constant(-5))

print(check_value(tf.constant(1)))
print(check_value(tf.constant(2)))
print(check_value(tf.constant(4)))
tf.Tensor([1], shape=(1,), dtype=int32)
tf.Tensor([2], shape=(1,), dtype=int32)
tf.Tensor([-5], shape=(1,), dtype=int32)