Pytorch中等同于TensorFlow Keras StringLookup的功能是什么?

3
我现在正在使用pytorch,但是我缺少一个层:tf.keras.layers.StringLookup,这个层对id的处理非常有帮助。是否有任何方法可以在pytorch中实现类似的功能?
下面是我需要的功能的一个例子:
vocab = ["a", "b", "c", "d"]
data = tf.constant([["a", "c", "d"], ["d", "a", "b"]])
layer = tf.keras.layers.StringLookup(vocabulary=vocab)
layer(data)

Outputs:
<tf.Tensor: shape=(2, 3), dtype=int64, numpy=
array([[1, 3, 4],
       [4, 1, 2]])>
3个回答

5

torchnlp包,

pip install pytorch-nlp

from torchnlp.encoders import LabelEncoder

data = ["a", "c", "d", "e", "d"]
encoder = LabelEncoder(data, reserved_labels=['unknown'], unknown_index=0)

enl = encoder.batch_encode(data)

print(enl)

tensor([1, 2, 3, 4, 3])

该解决方案是否支持发送 PyTorch 张量并接收 PyTorch 张量?(类似于 TensorFlow)在 Python 列表级别上执行操作将会使 GPU 执行代码受到瓶颈制约。 - eljiwo
不确定您是否想避免使用列表作为输入。正如您所知,将字符串列表直接转换为PyTorch张量是不可能的。 - Damir Devetak
我使用batch_encode编辑了你的评论,以更好地适应情况,谢谢! - eljiwo

5

您可以使用 Collections.Countertorchtextvocab 对象来构建一个查找函数,用于从您的词汇表中获取编码。然后,您可以轻松地将序列传递给该函数,并获得它们作为张量的编码:

from torchtext.vocab import vocab
from collections import Counter

tokens = ["a", "b", "c", "d"]
samples = [["a", "c", "d"], ["d", "a", "b"]]

# Build string lookup
lookup = vocab(Counter(tokens))

>>> torch.tensor([lookup(s) for s in samples])
tensor([[0, 2, 3],
        [3, 0, 1]])

1

您可以使用torchtext库,只需使用python3 -m pip install torchtext进行安装。

然后您可以这样使用:

from torchtext.vocab import vocab
from collections import OrderedDict

tokens = ['a', 'b', 'c', 'd']
v1 = vocab(OrderedDict([(token, 1) for token in tokens]))
v1.lookup_indices(["a","b","c"])

而这就是结果:
([0, 1, 2],)

这个解决方案支持发送 PyTorch 张量并接收 PyTorch 张量吗?(类似于 TensorFlow)在 Python 列表级别执行操作会限制 GPU 执行代码的速度。 - eljiwo
是的,但它应该是一个一维张量,所以您需要对您的代码进行一些处理。 - sbabti zied

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接