问题标签 [encoder-decoder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
53 浏览

python - 使用 LSTM 时输入包含 NaN

我正在尝试构建一个单变量编码器-解码器 LSTM 模型。我一次又一次地得到这个错误:

ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值。

我已经搜索并阅读了其他询问相同错误的帖子,但是,我确信数据没有任何 nan 值。

由于 LSTM 隐藏计算导致的 nan 值让我确定的是:

我为每个时代做了一个循环来调用model.fit和打印历史。

它运行良好,直到大约numEpoch= 610(对不起,我忘记了确切的数字),然后它开始显示nan为验证损失。

这是我的模型定义:

Train_X形状为 (362, 3, 27)

如果需要,我很乐意提供更多详细信息。

0 投票
1 回答
188 浏览

swift - 如何伪装成 `__SwiftValue` 获取 swift 结构的实际类型

我正在使用 YapDatabase 对我的 Swift 值类型进行编码/解码。解码后,类型信息似乎丢失了,即type(of:element)返回__SwiftValue而不是,例如Reservation

如果我调用po element调试器,似乎类型信息仍然保留:

这是什么__SwiftValue,有没有办法获得实际类型(除了解析的任何可怕方法String(describing: element)?

0 投票
1 回答
106 浏览

tensorflow - 在 vanilla 编码器-解码器架构中实现注意力

我尝试了一个vanila enc-dec arch如下(英语到法语NMT)

我的编码器-解码器架构

我想知道如何在这里集成keras注意力层。也欢迎来自keras 文档或来自第三方 repo 的任何其他关注模块。我只需要集成它,看看它是如何工作的并对其进行微调。

完整代码可在此处获得。

在这篇文章中没有显示任何代码,因为它又大又复杂。

0 投票
1 回答
1121 浏览

python - 模型输入必须来自 `tf.keras.Input` ...,它们不能是先前非输入层的输出

我正在使用 Python 3.7.7。和张量流 2.1.0。

我有一个预训练的 U-Net 网络,我想得到它的编码器解码器

在下图中:

在此处输入图像描述

您可以看到卷积编码器-解码器架构。我想得到编码器部分,也就是出现在图像左侧的图层:

在此处输入图像描述

和解码器部分:

在此处输入图像描述

我从这个函数中得到了 U-Net 模型:

辅助功能是:

该模型的图表是:

在此处输入图像描述

我训练网络,训练后我让编码器这样做:

而且效果很好。

但是,当我尝试使用以下方法提取解码器时:

我收到这些我不明白的错误:

TraceBack,然后是另一个错误:

我试过这段代码来获取解码器:

但我得到的错误大多相同:

如何从预训练的 U-Net 网络中获取解码器?

0 投票
1 回答
90 浏览

python-3.x - 从经过训练的 UNet 获取编码器

我已经在一些图像上训练了一个 UNet 模型,但现在,我想提取模型的编码器部分。我的 UNet 具有以下架构:

我试图通过 model.down_convs 加载编码器层,但出现以下错误:

----> 1 res = encoder(train_img) 中的 TypeError Traceback(最近一次调用最后一次)

~/anaconda3/envs/work/lib/python3.8/site-packages/torch/nn/modules/module.py in call(self, *input, **kwargs) 548 结果 = self._slow_forward(*input, * *kwargs)549 其他:-> 550 结果 = self.forward(*input, **kwargs) 551 for hook in self._forward_hooks.values(): 552 hook_result = hook(self, input, result)

TypeError: forward() 接受 1 个位置参数,但给出了 2 个

我已附上模型,您可以尝试一下。还有这里的权重

请告诉我。

0 投票
1 回答
301 浏览

pytorch - 解码器总是预测相同的标记

我有以下用于机器翻译的解码器,经过几个步骤后仅预测 EOS 令牌。因此,在一个虚拟的、微小的数据集上过度拟合是不可能的,因此代码中似乎存在很大的错误。

前向相对简单(看看我在那里做了什么?):将 input_ids 传递给嵌入和 FFN,然后在 RNN 中使用该表示,并将给定sembedding作为初始隐藏状态。将输出通过另一个 FFN 并进行 softmax。返回 RNN 的 logits 和最后的隐藏状态。在下一步中,使用这些隐藏状态作为新的隐藏状态,并将最高预测的标记作为新的输入。

sembedding是 RNN 的初始 hidden_​​state。这类似于编码器-解码器架构,只是在这里我们不训练编码器,但我们确实可以访问预训练的编码器表示

在我的训练循环中,我从每个批次开始使用一个 SOS 令牌,并将每个顶部预测的令牌提供给下一步,直到target_len达到。我也在老师强制训练之间随机交换。

我还在每一步之后剪辑渐变:

起初,随后的预测已经相对相同,但经过几次迭代后,会有更多的变化。但是相对较快,所有预测都变成了其他词(但总是相同的),最终变成了 EOS 令牌(编辑:将激活更改为 ReLU 后,总是预测另一个令牌 - 它似乎是一个总是重复的随机令牌)。请注意,这已经发生在 80 步之后(batch_size 128)。

我发现RNN返回的隐藏状态包含很多零。我不确定这是否是问题,但似乎它可能是相关的。

我不知道可能出了什么问题,尽管我怀疑问题出在我身上而step不是模型上。我已经尝试过使用学习率,禁用一些层(LayerNorm,dropout,ffn2),使用预训练嵌入并冻结或解冻它们,并禁用教师强制,使用双向与单向 GRU。最终的结果总是一样的。

如果您有任何指示,那将非常有帮助。我用谷歌搜索了很多关于神经网络总是预测同一个项目的东西,我已经尝试了所有我能找到的建议。欢迎任何新的,无论多么疯狂!

0 投票
0 回答
287 浏览

python - 需要帮助理解 Tensorflow 中的编码器-解码器代码

我正在阅读 Aurelion Geron 的“Hands-On Machine Learning with Scikit-Learn and TensorFlow”。我目前正在阅读本书的编码器-解码器部分,偶然发现了一些我不完全理解的代码,并且我发现书中的解释并不令人满意(至少对于像我这样的初学者来说)。下图展示了我们正在尝试实现的模型(或者更准确地说,我们将实现一个与下图类似的模型,不完全是这个模型):

在此处输入图像描述

(图片来自Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow,第 16 章,第 543 页,图 16-3)

这是使用的代码(同样,上面的模型不是我们要编码的确切内容。作者明确表示我们将构建的模型与上图类似):

上面的代码中有些事情我不知道他们在做什么,有些事情我认为我知道他们在做什么,所以我将尝试准确解释我的困惑。如果我从这一点上说的任何内容有误,请告诉我。

我们导入 tensorflow_addons。

在第 2-4 行中,我们为编码器、解码器和原始字符串创建输入层。我们可以在图片中看到它们的去向。这里出现了第一个困惑:为什么 shape of是一个包含 in元素的列表,encoder_inputs而shape of是一个空列表?这些形状的含义是什么?为什么它们不同?为什么我们必须像这样初始化它们?decoder_inputsNonesequence_lengths

在第 5-7 行中,我们创建了嵌入层并将其应用于编码器输入和解码器输入。

在第 8-10 行中,我们为编码器创建了 LSTM 层。我们保存 LSTM 的隐藏状态h和记忆单元状态C,因为这将是解码器的输入。

第 11 行对我来说是另一个困惑。我们显然创建了一个所谓的TrainingSampler,但我不知道这是什么或它做什么。用作者的话来说:

TrainingSampler 是 TensorFlow Addons 中可用的几个采样器之一:它们的作用是在每一步告诉解码器它应该假装以前的输出是什么。在推理过程中,这应该是实际输出的令牌的嵌入。在训练期间,应该是之前目标令牌的嵌入:这就是我们使用 TrainingSampler 的原因。

我真的不明白这个解释。具体是TrainingSampler做什么的?它是否告诉解码器正确的先前输出是先前的目标?它是如何做到的?更重要的是,我们是否需要在推理过程中更改这个采样器(因为我们在推理过程中没有目标)?

在第 12 和 13 行,我们定义了解码器单元和输出层。我的问题是为什么我们将解码器定义为LSTMCell,而我们将编码器声明为 ,而LSTM不是单元格。我阅读了LSTM作为循环层的stackoverflow,同时LSTMCell包含一步的计算逻辑。但我不明白为什么我们必须LSTM在编码器和LSTMCell解码器中使用。为什么会有这种差异?是因为在下一行中,BasicDecoder实际上需要一个单元格吗?

在接下来的几行中,我们定义BasicDecoder并将其应用于解码器嵌入(同样,我不知道sequence_lengths这里是做什么的)。我们得到最终输出,然后我们将其传递给 softmax 函数。

该代码中发生了很多事情,我对发生的事情感到非常困惑。如果有人能把事情弄清楚一点,我将非常感激。

0 投票
1 回答
422 浏览

tensorflow - 为什么编码器隐藏状态形状与 Bahdanau 注意力中的编码器输出形状不同

这个问题与此处显示的神经机器翻译有关: 神经机器翻译

这里:

批量大小= 64

输入长度(示例输入句子中的单词数,也称为不同的时间步长)= 16

RNN 单元的数量(也是隐藏状态向量的长度或隐藏状态向量在每个时间步的维数)= 1024

这被解释为:

在每批(共 64 个)中,对于每个输入词(共 16 个),每个时间步都存在一个 1024 维向量。这个 1024 维向量表示在编码过程中特定时间步的输入词。这个 1024 维的向量被称为每个词的隐藏状态。

我的问题是:

为什么 (64, 1024) 的隐藏状态维度与( 64, 16, 1024)的编码器输出维度不同?两者应该不一样,因为对于每个批次,我们在输入句子中有 16 个单词,对于输入句子中的每个单词,我们都有一个 1024 维的隐藏状态向量。所以在编码步骤结束时,我们得到一个形状为 (64, 16, 1024) 的累积隐藏状态向量,这也是编码器的输出。两者尺寸相同。

具有维度(64, 1024)的编码器隐藏输出进一步作为第一个隐藏状态输入提供给解码器。

另一个相关问题:

如果输入长度是 16 个字,而不是使用 16 个单元,那么在编码器中使用 1024 个单元的原因是什么?

0 投票
0 回答
208 浏览

deep-learning - 当输出是浮点数数组时,pytorch中的适当损失函数

我正在编写一个与https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html非常相似的编码器/解码器模型

唯一的区别是,这里的单词由一些索引表示。我想根据另一个指标来展示它们,这些指标由浮点数表示。

损失函数nn.criterion = nn.NLLLoss() 似乎在我们只使用类的时候有效。

如果我的输出数组不是整数数组,而是浮点数数组,我可以使用什么样的损失函数?考虑到所有其他部分都与教程相似?

提前致谢。

0 投票
1 回答
145 浏览

machine-learning - 用于开发编码器-解码器模型的 nn.embedding 是如何工作的?

本教程中,它教授如何使用 pytorch 开发一个简单的带有注意力的编码器-解码器模型。然而,在编码器或解码器中,self.embedding = nn.Embedding(input_size, hidden_size)(或类似的)是定义的。在pytorch 文档中,nn.Embedding 被定义为“存储固定字典和大小的嵌入的简单查找表”。所以我很困惑,在初始化时,这个查找表是从哪里来的?它是否为索引初始化了一些随机嵌入,然后它们将被训练?真的有必要在编码器/解码器部分吗?提前致谢。