问题标签 [recurrent-neural-network]
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.
neural-network - LSTM NN:前向传播
我是神经网络的新手,正在从头开始创建 LSTM。我有前向传播工作......但我对在训练模型、反向传播和内存管理的上下文中的前向传播中的移动部分有一些疑问。
所以,现在,当我运行前向传播时,我将新列堆叠f_t, i_t, C_t, h_t, etc
在它们对应的数组上,因为我为 bptt 梯度计算积累了先前的位置。
我的问题是 4 部分:
1)为了保留合理的长期记忆,我需要回溯多长时间?(内存向后延伸 20-40 个时间步可能是我的系统所需要的(尽管我可以从更长的时间段中受益——这只是获得良好性能的最低限度——而且我只是在争取最低限度的权利现在,所以我可以让它工作)
2)一旦我认为我的模型“经过训练”,我是否有任何理由保持超过 2 个时间步长来计算下一个C
和h
值?(C_t
Cell 状态在哪里,h_t
是 LSTM 网络的最终输出) 在这种情况下,我需要多个版本的前向传播函数
3)如果我要训练的时间序列数据有限,并且我想训练我的模型,那么当我在训练数据上一遍又一遍地训练它时,我的模型的性能是否会收敛(而不是在一些最大平均性能附近振荡) ? 如果我实施 dropout,它会收敛吗?
4)我需要考虑多少渐变分量?当我计算各种矩阵的梯度时,我在时间步 t 得到主要贡献,从时间步 t-1 得到次要贡献(并且计算一直递归到 t=0)?(换句话说:主要贡献是否在梯度计算中占主导地位——由于次要分量引起的斜率变化是否足以保证在我反向传播时间步长时实现递归......)
python - 如何在 TensorFlow 中处理具有可变长度序列的批次?
我试图使用 RNN(特别是 LSTM)进行序列预测。但是,我遇到了可变序列长度的问题。例如,
我正在尝试使用基于此基准的简单 RNN 来预测当前单词之后的下一个单词,以构建 PTB LSTM 模型。
但是,num_steps
参数(用于展开到先前的隐藏状态)在每个 Tensorflow 的 epoch 中应该保持不变。基本上,批处理句子是不可能的,因为句子的长度不同。
在这里,num_steps
在我的情况下,每个句子都需要更改。我已经尝试了几个黑客,但似乎没有任何工作。
machine-learning - TensorFlow 中的堆叠 RNN 模型设置
我有点迷失在 TensorFlow 中为文本分类构建堆叠 LSTM 模型。
我的输入数据是这样的:
我的代码骨架如下所示:
问题是无论数据集有多大,损失和准确率都没有改善的迹象(看起来完全是随机的)。我做错什么了吗?
更新:
machine-learning - Keras 中的序列标记
我正在研究句子标签问题。我自己完成了嵌入和填充,我的输入看起来像:
对于句子中的每个单词,我想预测四个类中的一个,所以我想要的输出应该如下所示:
我的简单网络架构是:
它在训练时显示大约 95%,但是当我尝试使用训练有素的模型预测新句子时,结果真的很糟糕。看起来模型刚刚学习了一些关于第一个单词的类,并且每次都显示出来。我认为问题可以是:
自己写的padding(句尾零向量),会不会让学习变差?
我应该尝试学习不同长度的句子,没有填充(如果是的话,你能帮我如何在 Keras 中训练这种模型吗?)
错误的学习目标,但我尝试了均方误差、二元交叉熵等,它没有改变。
我认为带有
TimeDistributedDense
andsoftmax
的东西我已经知道它是如何工作的,但仍然不是 100% 确定。
我很高兴看到有关此问题的任何提示或帮助,谢谢!
python - 如何堆叠 LSTM 层以对语音文件进行分类
我一直在尝试实现一个基于 LSTM 的分类器来对离散语音进行分类。我用 13 mfcc 创建了特征向量。对于给定的文件,具有 [99, 13] 的 2D 向量。在遵循 mnist_irnn 示例之后,我可以设置单层 RNN 来分类我的语音文件。但现在我想向网络添加更多层。因此,我一直在尝试用两个 LSTM 层和 softmax 层作为输出层来实现网络。在这里浏览了许多帖子后,我可以按如下方式设置网络,在模型构建期间它不会抛出任何异常。
我一直在不同的点尝试不同的价值观。(目前我一直在尝试使用小样本,因此值非常小)但是,现在它在训练期间抛出异常。一些尺寸不匹配。
我想知道我在这里做错了什么。我整天都在浏览代码,但我仍然无法找出尺寸不匹配的原因。
此外,如果有人能解释 output_dim 的含义,我将非常感激。(当我们在给定层中有n个节点时,是单个节点输出的向量的形状吗?它应该等于下一层的节点数吗?)
python - 双向 LSTM (BLSTM) 的训练、测试和验证集
当涉及到正常的人工神经网络或任何标准机器学习技术时,我了解训练、测试和验证集应该是什么(概念上和经验法则比率)。但是,对于双向 LSTM (BLSTM) 网络,如何拆分数据让我感到困惑。
我正在尝试改进对由监测的健康值组成的个体受试者数据的预测。在最简单的情况下,对于每个受试者,都有一个长时间的值序列(>20k 值),并且该时间序列的连续部分根据受试者当前的健康状况从一组类别中标记出来。对于 BLSTM,网络同时对所有向前和向后的数据进行训练。那么问题是,如何为一个主题拆分时间序列?
- 我不能只取最后 2,000 个值(例如),因为它们可能都属于一个类别。
- 而且我不能随机分割时间序列,因为这样学习和测试阶段都将由不连贯的块组成。
最后,每个主题(据我所知)都有略微不同(但相似)的特征。那么,也许,因为我有成千上万的科目,我是否会在一些科目上进行训练、在一些科目上进行测试并在其他科目上进行验证?但是,由于存在学科间差异,如果我只考虑一个学科开始,我将如何设置测试?
python - LSTM 网络张量流的输入
我有一个长度为 t (x0, ...,xt) 的时间序列,每个 xi 都是一个 d 维向量,即 xi=(x0i, x1i, ...., xdi)。因此我的输入 X 的形状为 [batch_size, d]
张量流 LSTM 的输入应该是大小 [batchSize, hidden_size]。我的问题是我应该如何将我的时间序列输入到 LSTM。我想到的一种可能的解决方案是增加大小为 [d,hidden_size] 的权重矩阵 W,并使用 X*W + B 输入 LSTM。
这是正确的还是我应该在网络上输入其他内容?
谢谢
neural-network - 如何在 Keras 中为循环神经网络 (RNN) 使用嵌入层
我对神经网络和 Keras 库还很陌生,我想知道如何使用此处描述的嵌入层将输入数据从 2D 张量屏蔽为RNN的 3D 张量。
说我的时间序列数据如下(随着时间的增加):
现在,假设我想给 RNN 最后 2 个特征向量,以便预测时间 t+1 的特征向量。
目前(没有嵌入层),我正在自己创建所需的具有形状 (nb_samples, timesteps, input_dim) 的 3D 张量(如本例所示)。
与我的示例相关,最终的 3D 张量将如下所示:
和 Y_train:
我的模型如下所示(适用于上面的简化示例):
最后,我的问题是,如何避免将那些 2D 张量转换为 3D 张量重塑自己并使用嵌入层?我想在模型 = 顺序()之后我必须添加类似的内容:
可能答案很简单,我只是对嵌入层的文档感到困惑。
python - 我怎么知道在 seq2seq 模型中是否达到了纪元点?
很多天以来,我一直在使用 seq2seq 模型的默认设置在大约一百万个句子的自定义并行语料库上训练 seq2seq 模型。以下是教程中提到的经过 350k 步的输出日志。我看到bucket perplexity突然显着增加了整个train perplexity很长时间以来一直保持在1.02,并且学习率初始化为0.5但现在显示为0.007左右,因此学习率也显着降低,而且系统的输出不能令人满意。我如何知道是否达到了纪元点,我应该停止并重新配置参数调整和优化器改进等设置?
什么时候会停止?
python - 使用 theano 的 RNNLM
我在 theano 用户列表上问了同样的问题,但没有得到答复,只是想知道是否有人可以在这里帮助我。
我正在尝试根据这篇不错的帖子重新实现http://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf的 RNNLM。我尝试了一个玩具测试用例,训练数据是 PTB 训练数据的前 100 句(从http://rnnlm.org/下载),同样的数据也用于评估。
基线:
我使用来自http://rnnlm.org/的 rnnlm-0.4b 训练了 LM 25 次迭代,我得到了测试日志概率:-4107.323481 PPL net: 85.496622
生成基线的命令行是:
使用我的实现,经过 25 次迭代,PPL 有很大的不同:
纪元=24:对数概率=-5374.255371 ppl=337.187731
我还在学习 Theano,我在实现过程中是否遗漏了什么?
谢谢
我的实现可以在这里找到: