【问题标题】:Pytorch convert a pd.DataFrame which is variable length sequence to tensorPytorch 将可变长度序列的 pd.DataFrame 转换为张量
【发布时间】:2020-07-17 07:27:09
【问题描述】:

我得到一个pandas DataFrame,如下所示,并希望将其转换为torch.tensor 以进行嵌入。

# output first 5 rows examples
print(df['col'].head(5))

                      col
0             [a, bc, cd]
1      [d, ed, fsd, g, h]
2  [i, hh, ihj, gfw, hah]
3                 [a, cb]
4                   [sad]



train_tensor = torch.from_numpy(train)

但它得到一个错误:

TypeError:无法转换 numpy.str_ 类型的 np.ndarray。唯一支持的类型是:float64、float32、float16、int64、int32、int16、int8、uint8 和 bool。

from_numpy() 似乎不支持可变长度序列。
那么如果要初始化 tensor 形式,正确的方法是什么?
在得到相应的tensor 之后,我会尝试为可变长度序列添加填充并为其做嵌入层。
有人可以帮我吗?
提前致谢。

【问题讨论】:

  • train 到底是什么?那 5 个文字数组是什么?能不能得到更精确的代码sn-ps?

标签: python pandas pytorch tensor


【解决方案1】:

这里涉及多个步骤

单词到 ID

  • 预训练:如果您使用 Glove/word2vec 等预训练嵌入,则必须将每个单词映射到其在词汇表中的 ID,以便嵌入层可以加载预训练嵌入。
  • 如果您想训练自己的嵌入,则必须将每个单词映射到一个 ID 并保存该映射以供以后使用(在预测期间)。这通常称为词汇表
# Vocabulary to our own ID
def to_vocabulary_id(df):
  word2id = {}
  sentences = []
  for v in df['col'].values:
    row = []
    for w in v:
      if w not in word2id:
        word2id[w] = len(word2id)+1
      row.append(word2id[w])
      
    sentences.append(row)
  return sentences, word2id


df = pd.DataFrame({'col': [
                           ['a', 'bc', 'cd'], 
                           ['d', 'ed', 'fsd', 'g', 'h'], 
                           ['i', 'hh', 'ihj', 'gfw', 'hah'],
                           ['a', 'cb'],
                           ['sad']]})
sentences, word2id = to_vocabulary_id(df)

嵌入层

如果我们的词汇量是 100,嵌入大小是 8,那么我们将创建一个嵌入层,如下所示

embedding = nn.Embedding(100, 8)

将可变长度句子填充为 0 并创建 Tensor

data = pad_sequence([torch.LongTensor(s) for s in sentences], batch_first=True, padding_value=0)

贯穿嵌入层

终于

import torch
from torch.nn.utils.rnn import pad_sequence
        
data = pad_sequence([torch.LongTensor(s) for s in sentences], batch_first=True, padding_value=0)

embedding = nn.Embedding(100, 8)
embedding(data).shape

输出:

torch.Size([5, 5, 8])

如您所见,我们已经传递了 5 个句子,最大长度为 5。所以我们得到大小为 5 X 5 X 8 的嵌入。 5 个句子,5 个词,每个词的嵌入大小为 8。

【讨论】:

    【解决方案2】:

    你想做的事情有很多问题:

    • Torch 张量(如错误中所述)不存储字符串,只存储数字。
    • Torch 张量是数学张量(多维矩阵),这意味着它具有明确定义的形状(不能存储不同长度的角色)。

    我建议您看看如何在以下教程中训练 NLP(自然语言处理)模型:https://pytorch.org/tutorials/beginner/deep_learning_nlp_tutorial.html 它们涵盖了 word2vec 技术的理论和实践以及如何将其用于不同的机器学习任务。

    希望对你有帮助 =)

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2019-02-13
      • 2020-08-05
      • 2022-10-17
      • 2019-05-23
      • 2022-01-10
      • 2021-11-25
      • 2020-04-07
      相关资源
      最近更新 更多