问题标签 [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.
python - 使用 LSTM 时输入包含 NaN
我正在尝试构建一个单变量编码器-解码器 LSTM 模型。我一次又一次地得到这个错误:
ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值。
我已经搜索并阅读了其他询问相同错误的帖子,但是,我确信数据没有任何 nan 值。
由于 LSTM 隐藏计算导致的 nan 值让我确定的是:
我为每个时代做了一个循环来调用model.fit
和打印历史。
它运行良好,直到大约numEpoch
= 610(对不起,我忘记了确切的数字),然后它开始显示nan
为验证损失。
这是我的模型定义:
Train_X
形状为 (362, 3, 27)
如果需要,我很乐意提供更多详细信息。
swift - 如何伪装成 `__SwiftValue` 获取 swift 结构的实际类型
我正在使用 YapDatabase 对我的 Swift 值类型进行编码/解码。解码后,类型信息似乎丢失了,即type(of:element)
返回__SwiftValue
而不是,例如Reservation
。
如果我调用po element
调试器,似乎类型信息仍然保留:
这是什么__SwiftValue
,有没有办法获得实际类型(除了解析的任何可怕方法String(describing: element
)?
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 个
请告诉我。
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。最终的结果总是一样的。
如果您有任何指示,那将非常有帮助。我用谷歌搜索了很多关于神经网络总是预测同一个项目的东西,我已经尝试了所有我能找到的建议。欢迎任何新的,无论多么疯狂!
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_inputs
None
sequence_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 函数。
该代码中发生了很多事情,我对发生的事情感到非常困惑。如果有人能把事情弄清楚一点,我将非常感激。
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 个单元的原因是什么?
deep-learning - 当输出是浮点数数组时,pytorch中的适当损失函数
我正在编写一个与https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html非常相似的编码器/解码器模型
唯一的区别是,这里的单词由一些索引表示。我想根据另一个指标来展示它们,这些指标由浮点数表示。
损失函数nn.criterion = nn.NLLLoss() 似乎在我们只使用类的时候有效。
如果我的输出数组不是整数数组,而是浮点数数组,我可以使用什么样的损失函数?考虑到所有其他部分都与教程相似?
提前致谢。
machine-learning - 用于开发编码器-解码器模型的 nn.embedding 是如何工作的?
在本教程中,它教授如何使用 pytorch 开发一个简单的带有注意力的编码器-解码器模型。然而,在编码器或解码器中,self.embedding = nn.Embedding(input_size, hidden_size)
(或类似的)是定义的。在pytorch 文档中,nn.Embedding 被定义为“存储固定字典和大小的嵌入的简单查找表”。所以我很困惑,在初始化时,这个查找表是从哪里来的?它是否为索引初始化了一些随机嵌入,然后它们将被训练?真的有必要在编码器/解码器部分吗?提前致谢。