我用TensorFlow建立了一些神经网络,比如基本的MLP和卷积神经网络.现在我想转向循环神经网络.但是,我在自然语言处理方面没有经验.因此,针对RNN的TensorFlow NLP教程对我来说并不容易阅读(并且也不是很有趣).
基本上我想从简单的事情开始,而不是LSTM.
如何在TensorFlow中构建一个简单的递归神经网络,如Elman网络?
我只能找到TensorFlow的GRU或LSTM RNN示例,主要用于NLP.有没有人知道一些简单的递归神经网络教程或TensorFlow的例子?
该图显示了一个基本的Elman网络,通常简称为SRN(简单的循环网络):
下面我有一个Tensorflow RNN Cell的实现,旨在模拟Alex Graves的算法ACT:http://arxiv.org/abs/1603.08983 .
在通过rnn.rnn调用的序列中的单个时间步(带有静态sequence_length参数,因此rnn动态展开 - 我使用的固定批量大小为20),我们递归调用ACTStep,生成大小为(1,200)的输出RNN单元的隐藏维数为200,批量大小为1.
在Tensorflow中使用while循环,我们迭代直到累积的停止概率足够高.所有这些工作都相当顺利,但是我在while循环中积累状态,概率和输出时遇到了问题,我们需要这样做才能创建这些的加权组合作为最终的单元输出/状态.
我已经尝试使用一个简单的列表,如下所示,但是当编译图形时输出不在同一帧中,这会失败(是否可以使用control_flow_ops中的"switch"函数将张量转发到以下点:它们是必需的,即在返回值之前的add_n函数?).我也尝试使用TensorArray结构,但我发现这很难使用,因为它似乎破坏了形状信息并且手动替换它没有用.我也无法找到关于TensorArrays的大量文档,大概就像我们想象的那样,主要是用于内部TF使用.
关于如何正确累积ACTStep产生的变量的任何建议都将非常感激.
class ACTCell(RNNCell):
"""An RNN cell implementing Graves' Adaptive Computation time algorithm"""
def __init__(self, num_units, cell, epsilon, max_computation):
self.one_minus_eps = tf.constant(1.0 - epsilon)
self._num_units = num_units
self.cell = cell
self.N = tf.constant(max_computation)
@property
def input_size(self):
return self._num_units
@property
def output_size(self):
return self._num_units
@property
def state_size(self):
return self._num_units
def __call__(self, inputs, state, scope=None):
with vs.variable_scope(scope or type(self).__name__):
# define within cell constants/ counters used to control while loop
prob …Run Code Online (Sandbox Code Playgroud) 我已经看到有关神经网络不同部分的丢失的描述:
重量矩阵中的丢失,
在矩阵乘法之后和relu之前隐藏层中的丢失,
relu后隐藏层中的丢失,
并且在softmax函数之前输出分数中的丢失
我对应该在哪里执行辍学感到有点困惑.有人可以帮忙详细说明吗?谢谢!
neural-network conv-neural-network recurrent-neural-network dropout
我使用BasicLSTMCell训练了LSTM分类器.如何保存模型并将其恢复以用于以后的分类?
尝试使用一个循环图层编译网络时发现了问题.似乎第一层的维度存在一些问题,因此我理解RNN层在Keras中的工作方式.
我的代码示例是:
model.add(Dense(8,
input_dim = 2,
activation = "tanh",
use_bias = False))
model.add(SimpleRNN(2,
activation = "tanh",
use_bias = False))
model.add(Dense(1,
activation = "tanh",
use_bias = False))
Run Code Online (Sandbox Code Playgroud)
错误是
ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2
Run Code Online (Sandbox Code Playgroud)
无论input_dim值如何,都会返回此错误.我错过了什么?
machine-learning neural-network keras recurrent-neural-network rnn
以下是自包含的,当您运行它时,它将:
1.打印损失以确认它正在减少(学习sin波浪),
2.根据手工衍生的梯度函数检查数值梯度.
两个渐变倾向于匹配1e-1 to 1e-2(这仍然是坏的,但显示它正在尝试)并且偶尔会出现极端异常值.
我已经花了整个星期六回到正常的FFNN,让它工作(yay,渐变匹配!),现在星期天在这个LSTM上,好吧,我找不到我的逻辑中的错误.哦,这在很大程度上取决于我的随机种子,有时它很棒,有时很糟糕.
我亲自检查了我对LSTM方程的手衍生衍生物的实现(我做了微积分),并反对这3个博客/ gist中的实现:
并尝试了这里建议的(惊人的)调试方法:https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working-4020854bd607
你能帮忙看看我实施错误的地方吗?
import numpy as np
np.set_printoptions(precision=3, suppress=True)
def check_grad(params, In, Target, f, df_analytical, delta=1e-5, tolerance=1e-7, num_checks=10):
"""
delta : how far on either side of the param value to go
tolerance : how far the analytical and numerical values can diverge
"""
h_n = params['Wf'].shape[1] # TODO: h & c should be passed in …Run Code Online (Sandbox Code Playgroud) 我正在对MSR-VTT数据集进行视频字幕。
在此数据集中,我有10,000个视频,每个视频有20个不同的字幕。
我的模型由seq2seq RNN组成。编码器的输入是视频功能,解码器的输入是嵌入式目标字幕,解码器的输出是预测字幕。
我想知道使用几次相同标题不同标题的视频是否有用。
由于我找不到明确的信息,因此尝试对其进行基准测试
我在1108个运动视频中对其进行了训练,批量大小为5,超过60个时期。此配置每个时期大约需要211秒。
Epoch 1/60 ; Batch loss: 5.185806 ; Batch accuracy: 14.67% ; Test accuracy: 17.64%
Epoch 2/60 ; Batch loss: 4.453338 ; Batch accuracy: 18.51% ; Test accuracy: 20.15%
Epoch 3/60 ; Batch loss: 3.992785 ; Batch accuracy: 21.82% ; Test accuracy: 54.74%
...
Epoch 10/60 ; Batch loss: 2.388662 ; Batch accuracy: 59.83% ; Test accuracy: 58.30%
...
Epoch 20/60 ; Batch loss: 1.228056 ; Batch accuracy: 69.62% ; …Run Code Online (Sandbox Code Playgroud) 我无法准确理解 LSTM 单元的范围——它如何映射到网络层。来自格雷夫斯 (2014):
在我看来,在单层网络中,layer = lstm 单元。这实际上如何在多层 rnn 中工作?
单元格的输出是h_t,没有表示特定层的超级索引。等式也是一样。每个单元格是否跨越单个层?或者每个单元格是否在每个时间步跨越整个三个节点?
我正在尝试训练 Keras LSTM 模型来预测序列中的下一个数字。
我的输入训练数据的形状 (16000, 10) 如下所示
[
[14955 14956 14957 14958 14959 14960 14961 14962 14963 14964]
[14731 14732 14733 14734 14735 14736 14737 14738 14739 14740]
[35821 35822 35823 35824 35825 35826 35827 35828 35829 35830]
[12379 12380 12381 12382 12383 12384 12385 12386 12387 12388]
...
]
Run Code Online (Sandbox Code Playgroud)
相应的输出训练数据的形状 (16000, 1) 如下所示
[[14965] [14741] [35831] [12389] ...]
Run Code Online (Sandbox Code Playgroud)
正如 LSTM 所抱怨的,我重塑了训练/测试数据
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
Run Code Online (Sandbox Code Playgroud)
这是最终的训练/测试数据形状
Total Samples: 20000 …Run Code Online (Sandbox Code Playgroud) machine-learning neural-network lstm keras recurrent-neural-network
我试图将CRNN模型移植到 Keras。
但是,我在将 Conv2D 层的输出连接到 LSTM 层时卡住了。
CNN 层的输出将具有(batch_size, 512, 1, width_dash)的形状,其中第一个取决于 batch_size,最后一个取决于输入的输入宽度(此模型可以接受可变宽度输入)
例如:形状为[2, 1, 32, 829]的输入产生形状为(2, 512, 1, 208) 的输出
现在,根据Pytorch 模型,我们必须执行挤压 (2) 和permute(2, 0, 1) 它将产生一个形状为 [208, 2, 512] 的张量
我试图实现这是 Keras,但我无法做到这一点,因为在 Keras 中,我们无法更改keras.models.Sequential模型中的batch_size 维度
有人可以指导我如何将这个模型的一部分移植到 Keras 吗?