两个非常相似的功能之间奇怪的处理时间差

时间:2019-06-19 12:04:15

标签: python tensorflow optimization time recurrent-neural-network

我的问题是,做同一件事的两个函数之间的计算时间差很大。

  

这些功能的目的是产生对递归的感谢   神经网络句子的结尾。

  • 在第一个功能中,将随机生成每个句子的首字母。
  • 在第二个函数中,我提供一个种子作为参数,它将作为句子的开头。

一些其他信息:

  
      
  • 我的rnn是逐字母而不是逐字生成句子   字。

  •   
  • 字母是一种热编码的

  •   
  • 网络正在处理批处理,因此输入矢量的尺寸类似于:[batch_size,sequence_size,vocabulary_size]

  •   
     

sequence_size不是常量,因为我希望我的网络能够生成较短或较长的句子

所以有两个功能:

def gen_text(length, vocab_size):

    generated   = ['']*BATCH_SIZE
    seed        = []
    input_      = []

    # Seeds generation
    for i in range(0, BATCH_SIZE):
        seed.append(random.randint(1, vocab_size)-1)
        input_.append([one_hot(seed[i], vocab_size)])
        generated[i] += int_to_vocab[str(seed[i])]

    # Text generation loop
    for i in range(0, length):

        model.reset_states()
        output = model.predict([input_])

        # Add the last outputed value for each batch in the input vector
        for j in range(0, BATCH_SIZE):
            encoded     = [0.0] * vocab_size
            last_output = output[j][i]
            encoded[np.argmax(last_output)] = 1.0
            generated[j] += int_to_vocab[str(flat_hot(encoded))]
            input_[j].append(last_output)

    return generated

第二个功能

def gen_text_seed(length, seed, vocab_size):

    generated   = ''
    input_      = []

    seed_seq = []
    for i in range(0, len(seed)):

        seed_seq.append(one_hot(vocab_to_int[seed[i]], vocab_size))
        generated += seed[i]

    # Stack the same sequence BATCH_SIZE times
    for i in range(0, BATCH_SIZE):

        input_.append(seed_seq)

    # Text generation loop
    for i in range(len(seed)-1, length):

        model.reset_states()
        output = model.predict([input_])

        # Add the last outputed value for each batch in the input vector
        for j in range(0, BATCH_SIZE):
            encoded     = [0.0] * vocab_size
            last_output = output[j][i]
            encoded[np.argmax(last_output)] = 1.0
            input_[j].append(last_output)

        # Add the generated char to the generated sentence
        generated += int_to_vocab[str(flat_hot(encoded))]

    return generated

其他一些信息可以使一切变得清晰:

  • int_to_vocab或vocab_to_int仅仅是将字符与整数关联的字典
  • one_hot是一个函数,可以在间隔内为我提供一个整数的热表示
  • flat_hot正在执行逆运算
  • one_hots和flat_hots对值列表所做的相同
  

我在第二个功能中所做的事情有点奇怪:我复制了相同的内容   在我的输入向量中增加batch_size的时间,因为我才刚开始   使用rnn和LSTM单元格,但我没有发现如何不使用批处理   用于预测,如果我使用批次进行训练...那么作为   第二个功能我只有1个句子(相同的batch_size次)   与第一个相比,我生成了64个不同的句子   但功能原理是相同的,问题在于   第二个函数比第一个函数长   序列大小

如果您能抽出宝贵的时间来帮助我解决这个问题,我将非常感激,因为我不太理解这个处理时间的差异。

我也知道这些功能根本没有优化,我只想了解为什么会有这种计算时差

0 个答案:

没有答案