问题描述
请耐心等待。
这对某些人来说可能难以理解,因为我添加了伪代码来支持我不清楚的内容。我一直在关注一个教程,有人提到我们需要在目标序列上定义一个 for 循环,因为我们正在使用 LSTM 使用注意力机制进行机器翻译。
我已经做了一些看起来像 keras 的东西。
这是伪代码
h = encoder(input) # For getting input sequences for calculation attention weights and context vector
decoder_hidden_state = 0 # Hidden state
decoder_cell_state = 0 # Cell state
outputs = []
for t in range(Ty): # Ty being the length of the target sequence
context = calc_attention(decoder_hidden_state,h) # decoder_hiddent_state(t-1),h(1),......h(Tx)
decoder_output,decoder_hidden_state,decoder_cell_state = decoder_lstm(context,init = [decoder_hidden_state,decoder_cell_state])
probabilities = dense_layer(o)
outputs.append(probabilities)
model = Model ( input,outputs)
我不清楚的是为什么我们要使用 for 循环,据说“在常规的 seq2seq 中,我们一次性传入整个目标输入序列,因为输出是一次性计算的。但是我们需要在 Ty 步骤上循环,因为每个上下文都取决于先前的状态"
但我认为在注意力的情况下也可以这样做,因为如果我只是删除 for 循环。
就像下面这段代码,它是普通seq2seq的解码器部分
decoder_inputs_placeholder = Input(shape=(max_len_target,))
decoder_embedding = Embedding(num_words_output,EMbedDING_DIM)
decoder_inputs_x = decoder_embedding(decoder_inputs_placeholder)
decoder_lstm = LSTM(
LATENT_DIM,return_sequences=True,return_state=True,)
如果我想添加注意力,我不能在这里定义状态并调用 calc_attention 函数,该函数将在解码时返回特定时间步的上下文,并且可以像之前在伪代码中所做的那样传递给 lstm 调用?
decoder_outputs,decoder_cell_state = decoder_lstm(
decoder_inputs_x,initial_state=[decoder_hidden_state,decoder_cell_state]
)
decoder_outputs = decoder_dense(decoder_outputs)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)