Python 推理期间解码器模型上的InvalidArgumentError,用于Tensorflow 2.0上基于LSTM的Seq2Seq

Python 推理期间解码器模型上的InvalidArgumentError,用于Tensorflow 2.0上基于LSTM的Seq2Seq,python,lstm,tensorflow2.0,tf.keras,seq2seq,Python,Lstm,Tensorflow2.0,Tf.keras,Seq2seq,版本:Python 3.6.9、Tensorflow 2.0.0、CUDA 10.0、CUDNN 7.6.1、Nvidia驱动程序版本410.78 我正在尝试将基于LSTM的Seq2Seq tf.keras模型移植到tensorflow 2.0 现在,当我试图调用解码器模型上的predict时,我面临以下错误,请参见下面的实际推理设置代码 这就像它期待一个单词作为参数,但我需要它来解码一个完整的句子我的句子是单词索引的右填充序列,长度为24 注:该代码过去的工作方式与TF1.15上的工作方式完全

版本:Python 3.6.9、Tensorflow 2.0.0、CUDA 10.0、CUDNN 7.6.1、Nvidia驱动程序版本410.78

我正在尝试将基于LSTM的Seq2Seq tf.keras模型移植到tensorflow 2.0

现在,当我试图调用解码器模型上的predict时,我面临以下错误,请参见下面的实际推理设置代码

这就像它期待一个单词作为参数,但我需要它来解码一个完整的句子我的句子是单词索引的右填充序列,长度为24

注:该代码过去的工作方式与TF1.15上的工作方式完全相同

全模型

编码器推理模型

译码器推理模型

实际发生错误的推理设置行 重要信息:序列被右填充到24个元素,100是每个单词嵌入的维度数。这就是为什么错误消息和打印显示输入形状为24100

请注意,此代码在CPU上运行。在GPU上运行它会导致另一个错误

original_关键字是一个示例文本字符串 使用tf。设备/设备:CPU:0: 此方法将原始字符串转换为右填充序列 查询\u序列=关键字\u到\u填充的\u序列\u单个原始\u关键字 这里没问题 初始状态=编码器模型。预测查询序列 打印初始状态[0]。形状打印24100 打印初始状态[1]。形状24100 空\u目标\u序列=np.zeros1,1 空\u目标\u序列[0,0]=单词\u目录\u标题[sos] 此处发生错误: InvalidArgumentError:[[u派生的][u]输入到Select类型的/body/\u 1/Select\u 2时的操作 必须具有相同的大小和形状。输入0:[1100]!=输入1:[24100] 解码器\u输出,h,c=解码器\u模型。预测[空\u目标\u序列]+初始\u状态 我尝试过的事情

禁用渴望模式只会使训练速度大大减慢,推理过程中的错误保持不变

在将输入输入输入到预测函数之前对其进行整形

在调用LSTM层时,手动计算embedding_layer.compute_Maskinput并设置掩码


从您的模型架构中我可以看到,初始状态是一个张量数组,形状为:[?、100、、100、、100]。在您的情况下,未知维度固定为24

然后,构建一个形状为1,1的Numpy数组/TF张量。您将其包装在一个列表中,并附加您的初始状态。因此,您将得到一个形状为[1,1,100,100,100]的张量列表

您尝试将其作为输入传递给您的解码器模型,该解码器模型期望3个输入,一个具有形状[?、24、、100、、100]的输入列表

从那开始似乎有什么不对劲

但是,TF在/body/_1/Select_2时抱怨操作的输入。输入1应该来自任何初始状态张量,我们知道它的形状是24100。输入2似乎来自空的_-target_序列,该序列的形状为1,1可以是到1100。顺便说一句,很奇怪,它没有被广播到24100,因为两个维度的大小都是1


我建议您在TensorBoard中查看图表。您应该能够找到混乱的操作并跟踪其输入张量。

如何构建层?您在LSTM层中设置了return_sequences=True吗?@emirc对于编码器,它是False。对于解码器来说,这是真的。下面是完整的代码:您好,您可以尝试将解码器输入形状更改为解码器输入=tf.keras.layers.Inputshape=无,,name=解码器输入吗。出现错误是因为空的\u目标\u序列具有形状1,1,而解码器需要输入形状?24。
InvalidArgumentError:  [_Derived_]  Inputs to operation while/body/_1/Select_2 of type Select must have the same size and shape.
Input 0: [1,100] != input 1: [24,100]
     [[{{node while/body/_1/Select_2}}]]
     [[lstm_1_3/StatefulPartitionedCall]] [Op:__inference_keras_scratch_graph_45160]

Function call stack:
keras_scratch_graph -> keras_scratch_graph -> keras_scratch_graph