实施一种热编码

时间:2018-08-31 04:40:50

标签: neural-network one-hot-encoding

我已经了解了一种使用神经网络进行热编码的用途和概念。我的问题是如何实施该概念。

例如,假设我有一个神经网络,该网络最多接受10个字母(不区分大小写)并使用一种热编码。每个输入将是每个点的某种26维向量。为了对此进行编码,我是否要充当260个输入,每个输入仅显示1或0,还是有其他标准方法来实现这26个维向量?

2 个答案:

答案 0 :(得分:0)

在您的情况下,您必须在各种框架之间有所不同。我可以代表PyTorch,这是我对神经网络进行编程时的goto框架。

在那里,序列的一键编码通常以您的网络期望序列 indices 的方式执行。以您的10个字母为例,这可能是["a", "b", "c" , ...]
的顺序 embedding layer将使用“字典长度”进行初始化,即您的网络可以接收的不同元素(num_embeddings)的数量-在您的情况下为26。此外,您可以指定embedding_dim,即单个字符的输出尺寸。这已经超出了一次性编码的步骤,因为您通常只需要他们知道与该项目相关联的值即可。

然后,您将上述字符串的编码版本提供给该层,该层看起来可能像这样:[0,1,2,3, ...]。假设序列的长度为10,他将产生[10,embedding_dim]的输出,即二维张量。

总而言之,PyTorch实际上允许您跳过将其编码为单点编码的繁琐步骤。这主要是由于您的词汇量在某些情况下可能非常大的事实:例如考虑机器翻译系统,其中您的词汇量可能超过10,000个单词。与其将每个单词都存储为10,000维向量,不如使用单个索引更方便。

如果那不能完全回答您的问题(因为我本质上是在告诉您通常如何使用它):您可以再次使用[10,26]张量,而不是制作260维向量,其中每行代表另一个字母。

答案 1 :(得分:0)

如果您有10个不同的元素(例如:a,b .... j或1,2 ... 10)表示为26维的“一个热编码”矢量,则您的输入为10向量仅由26维向量表示。这样做:

y = torch.eye(26)      # If you want a tensor for each 'letter' of length 26.
y[torch.arange(0,10)]  #This line gives you 10 one hot-encoding vector each of dimension 26.

希望这会有所帮助。