当前位置: 首页 > 知识库问答 >
问题:

在Keras上用解码器输入seq2seq模型连接注意层

崔单弓
2023-03-14

我正试图使用Keras库实现一个序列2序列模型。html" target="_blank">模型框图如下

模型将输入序列嵌入到3D张量中。然后双向lstm创建编码层。接下来,编码序列被发送到自定义关注层,该层返回一个2D张量,该张量具有每个隐藏节点的关注权重。

解码器输入作为一个热向量注入模型中。现在在解码器(另一个bi lstm)中,解码器输入和注意权重都作为输入传递。解码器的输出通过softmax激活函数发送到时间分布密集层,以概率的方式获得每个时间步的输出。模型代码如下:

encoder_input = Input(shape=(MAX_LENGTH_Input, ))

embedded = Embedding(input_dim=vocab_size_input, output_dim= embedding_width, trainable=False)(encoder_input)

encoder = Bidirectional(LSTM(units= hidden_size, input_shape=(MAX_LENGTH_Input,embedding_width), return_sequences=True, dropout=0.25, recurrent_dropout=0.25))(embedded)

attention = Attention(MAX_LENGTH_Input)(encoder)

decoder_input = Input(shape=(MAX_LENGTH_Output,vocab_size_output))

merge = concatenate([attention, decoder_input])

decoder = Bidirectional(LSTM(units=hidden_size, input_shape=(MAX_LENGTH_Output,vocab_size_output))(merge))

output = TimeDistributed(Dense(MAX_LENGTH_Output, activation="softmax"))(decoder)

问题是当我连接注意力层和解码器输入时。由于解码器输入是3D张量,而注意力是2D张量,因此它显示以下错误:

ValueError:Concatenate层需要具有匹配形状的输入,但concatat轴除外。获得输入形状:[(无,1024),(无,10,8281)]

如何将2D注意力张量转换为3D张量?

共有1个答案

商燕七
2023-03-14

根据您的框图,看起来您在每个时间步都将相同的注意力向量传递给解码器。在这种情况下,您需要RepeatVector在每个时间步复制相同的注意力向量,以将2D注意力张量转换为3D张量:

# ...
attention = Attention(MAX_LENGTH_Input)(encoder)
attention = RepeatVector(MAX_LENGTH_Output)(attention) # (?, 10, 1024)
decoder_input = Input(shape=(MAX_LENGTH_Output,vocab_size_output))
merge = concatenate([attention, decoder_input]) # (?, 10, 1024+8281)
# ...

请注意,这将为每个时间步重复相同的注意力向量。

 类似资料:
  • 问题内容: 在Keras中创建顺序模型时,我知道您在第一层中提供了输入形状。然后,此输入形状会构成 隐式 输入层吗? 例如,下面的模型明确指定了2个密集层,但这实际上是一个3层模型,即由输入形状隐含的一个输入层,一个具有32个神经元的隐藏密集层,然后一个具有10个可能输出的输出层组成的模型吗? 问题答案: 好吧,实际上它实际上 是 一个隐式输入层,即您的模型是一个具有三层“输入,隐藏和输出”的“老

  • 我一直在尝试使用Keras构建一个多输入模型。我来自使用顺序模型,并且只有一个相当直接的输入。我一直在查看StackOverflow上的留档(https://keras.io/getting-started/functional-api-guide/)和一些答案(如何在Keras 2.0中“合并”顺序模型?)。基本上,我想要的是让两个输入训练一个模型。一个输入是一段文本,另一个是从该文本中提取的一

  • 我们已经在前两节中表征并变换了不定长的输入序列。但在自然语言处理的很多应用中,输入和输出都可以是不定长序列。以机器翻译为例,输入可以是一段不定长的英语文本序列,输出可以是一段不定长的法语文本序列,例如 英语输入:“They”、“are”、“watching”、“.” 法语输出:“Ils”、“regardent”、“.” 当输入和输出都是不定长序列时,我们可以使用编码器—解码器(encoder-de

  • /usr/local/lib/python3.6/dist-packages/tensorflow/python/training/checkpointable/base.py in_method_wrapper(self,*args,**kwargs)362 self._setattr_tracking=False#pylint:disable=protected-access 363 try:

  • 我正在为CNN开发一个功能性Keras模型,在R中具有1d输入层。 当我运行keras_model函数来构建模型时,我得到以下错误: py\u call\u impl(可调用,dots$args,dots$keywords)中出错:值错误:图形断开连接:无法获取“main\u input”层的张量张量(“main\u input\u 15:0”,shape=(4201,1024),dtype=fl

  • 问题内容: 我正在尝试合并两个模型的输出,并使用keras顺序模型将它们作为第三模型的输入。型号1: 型号1: 型号3: 直到这里,我的理解是,来自两个模型的输出x和y被合并并作为第三模型的输入。但是当我全都喜欢的时候 in1和in2是尺寸为10000 * 750的两个numpy ndarray,其中包含我的训练数据,而np_res_array是相应的目标。 这给了我错误,因为“列表”对象没有属性