【发布时间】:2021-12-25 11:05:28
【问题描述】:
我想用我自己的一个热编码器给一个热编码器一个张量。为了这,
我必须在.map 中调用tf.keras.backend.get_value(),这只有在使用tf.py_function 时才有可能:
def one_hot_encode(categories,input):
encoded_input = []
data = tf.keras.backend.get_value(input)
for category in categories:
encoded_input.append(data==category)
return np.array(encoded_input)
问题是,在映射数据集并调用one_hot_encode时:
ds = ds.map(lambda input, target: (input, tf.py_function(one_hot_encode,inp=[[1,2,3,4,5,6,7,8,9,10],target], Tout=tf.float32)))
ds = ds.map(lambda input, target: (input, tf.reshape(target, (10,))))
tensorflow 将永远为这个数据集创建一个迭代器,例如尝试在 for 循环中访问数据时:
for (input, target) in dataset:
...
但如果我在一个热编码器中使用 tensorflows 构建,一切正常且 tensorflow 速度很快。
ds = ds.map(lambda input, target: (input, tf.one_hot(target,10)))
ds = ds.map(lambda input, target: (input, tf.reshape(target, (10,))))
在这两种方法中,数据集和所有张量都具有相同的形状。有谁知道另一种访问 .map 中张量值的方法,或者为什么 tensorflow 变得这么慢?
【问题讨论】:
-
输入数据(输入、标签)的形状是什么?你的目标到底是什么?
-
我正在使用来自 tensorflow 的基因组学_ood 数据集。我的目标是对基因组序列进行热编码。有 4 个字符,(A,C,G,T),每个序列有 250 个字符,所以一个热编码张量的形状为 (1000,),标签的形状为 (10,)。如果我在 one_hot 中使用 tensorflow,一切正常,但如果我将自己的 one_hot(所有值和形状在两种情况下都匹配)与 py_function 一起使用,则 tensorflow 会变得非常慢。而且因为我想/必须自己做一个热编码器,所以我不能使用内置功能。
-
你能展示一下你是如何实现你的一个热门编码器的吗?
-
我编辑了原帖。为简单起见,我没有对序列进行热编码,而是对可以是 1 到 10 的数字的标签进行热编码。但这不会改变输出行为
-
对不起,我目前很忙,项目的时间有限。我可能会在 2 或几天或一段时间内恢复它。我会让你知道它是否有效:)。谢谢回答
标签: python tensorflow iterator tf.keras eager-execution