【问题标题】:How to implement generator function for one hot encoding如何为一种热编码实现生成器功能
【发布时间】:2019-08-26 22:06:53
【问题描述】:

我实现了一个生成器函数来生成一个热编码向量,但生成器实际上抛出了错误

我使用生成器函数来生成一个热编码向量,因为后者将用作深度学习 lstm 模型的输入。我这样做是为了避免在尝试在非常大的数据集上创建一个热编码时出现过多的负载和内存故障。但是,我没有得到生成器函数的错误。我需要帮助找出我哪里出错了。

之前的代码:

X = np.zeros((len(sequences), seq_length, vocab_size), dtype=np.bool)
y = np.zeros((len(sequences), vocab_size), dtype=np.bool)
for i, sentence in enumerate(sequences):
    for t, word in enumerate(sentence):
        X[i, t, vocab[word]] = 1
    y[i, vocab[next_words[i]]] = 1

这里,

sequences = sentences generated from data set
seq_length = length of each sentence(this is constant)
vocab_size = number of unique words in dictionary

My program when run on the large data set produces,

sequences = 44073315
seq_length = 30
vocab_size = 124958

所以,当上面的代码直接用在后面的输入上时,会出现beloe错误。

Traceback (most recent call last):
  File "1.py", line 206, in <module>
    X = np.zeros((len(sequences), seq_length, vocab_size), dtype=np.bool)
MemoryError
(my_env) [rjagannath1@login ~]$

所以,我尝试创建一个生成器函数(用于测试),如下所示 -

def gen(batch_size, no_of_sequences, seq_length, vocab_size):
    bs = batch_size
    ns = no_of_sequences
    X = np.zeros((batch_size, seq_length, vocab_size), dtype=np.bool)
    y = np.zeros((batch_size, vocab_size), dtype=np.bool)
    while(ns > bs):
        for i, sentence in enumerate(sequences):
            for t, word in enumerate(sentence):
                X[i, t, vocab[word]] = 1
            y[i, vocab[next_words[i]]] = 1
        print(X.shape())
        print(y.shape())
        yield(X, y)
        ns = ns - bs 

for item in gen(1000, 44073315, 30, 124958):
    print(item) 

但我收到以下错误 -

File "path_of_file", line 247, in gen
    X[i, t, vocab[word]] = 1

IndexError: index 1000 is out of bounds for axis 0 with size 1000

我在生成器函数中犯了什么错误?

【问题讨论】:

  • 如果 batch_size 有 1000 个元素,则 X 无法到达索引 1000(而不是 999,因为索引从 0 开始)。如果序列大于 1000 个元素,则会导致问题
  • 所以我需要将 batch_size 重置为 999。我正确吗?
  • 如果我理解正确的话,你那边的整个循环方案并不好。您的整个“X”数据是什么?是sequences
  • X 将是 30 个单词序列的每个输入单词的一个热编码向量

标签: python deep-learning generator one-hot-encoding


【解决方案1】:

在你的生成器中修改如下:

batch_i = 0
while(ns > bs):
    s = batch_i*batch_size
    e = (batch_i+1)*batch_size
    for i, sentence in enumerate(sequences[s:e]):

基本上,您希望在大小为 batch_size 的窗口上运行,因此您正在通过 sequences 进行运行切片,这似乎是您的整个数据集。

你还必须增加batch_i,把它放在yield之后,所以添加 batch_i+=1

【讨论】:

  • 您的修复确实有效。非常感谢。生成器产生形状为 (1000, 30, 124958) 的 X 和形状为 (1000, 124958) 的 y。所以,如果我是正确的,生成器对象会存储输入序列的下一个产量的内存。我对吗?如果是这种情况,我可以在我的 lstm 模型的 fit 生成器函数中使用这个生成器。你同意吗?
  • 是的,我会编辑答案以更好地解释,以防有人遇到同样的问题:) 实际上,就在几天前,我自己编写了一个热编码生成器。如果您对答案感到满意,可以按“接受”。
  • 我接受了。再次感谢。如果我能很好地解释我的问题,你能否给我的问题投票?我希望这篇文章对其他人有所帮助。
猜你喜欢
  • 2018-10-25
  • 2020-05-01
  • 2019-02-06
  • 2016-03-19
  • 2019-02-18
  • 2020-08-28
  • 1970-01-01
  • 2020-09-18
  • 2018-06-26
相关资源
最近更新 更多