我试图用keras编写一个非常简单的RNN示例,但结果并不像预期的那样.
我的X_train是一个长度为6000的重复列表,如: 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, ...
我将其格式化为: (6000, 1, 1)
我的y_train是一个长度为6000的重复列表,如: 1, 0.8, 0.6, 0, 0, 0, 1, 0.8, 0.6, 0, ...
我将其格式化为: (6000, 1)
根据我的理解,递归神经网络应该学会正确地预测0.8和0.6,因为它可以记住两个时间段前X_train中的1.
我的模特:
model=Sequential()
model.add(SimpleRNN(input_dim=1, output_dim=50))
model.add(Dense(output_dim=1, activation = "sigmoid"))
model.compile(loss="mse", optimizer="rmsprop")
model.fit(X_train, y_train, nb_epoch=10, batch_size=32)
Run Code Online (Sandbox Code Playgroud)
该模型可以成功训练,损失最小〜0.1015但结果不如预期.
test case --------------------------------------------- model result -------------expected result
model.predict(np.array([[[1]]])) --------------------0.9825--------------------1
model.predict(np.array([[[1],[0]]])) ----------------0.2081--------------------0.8
model.predict(np.array([[[1],[0],[0]]])) ------------0.2778 -------------------0.6
model.predict(np.array([[[1],[0],[0],[0]]]))---------0.3186--------------------0
Run Code Online (Sandbox Code Playgroud)
我在这里有什么误解吗?
编辑:我编辑了我的代码来制作seq2seq教程/练习,这里是:https: //github.com/guillaume-chevalier/seq2seq-signal-prediction
我尝试使用多维输入和输出进行序列到序列(seq2seq)回归.我尝试了一些随着时间的推移产生以下损失的东西
该模型完全无法学习预测克隆在每个输入和输出维度上的正弦,即使我尝试非常小的学习率.
为RNN构建的Tensorflow损失函数似乎解决了我们直接想要训练标签或单词嵌入的情况,因此我尝试自己计算损失.关于这一点,我不知道我们应该如何处理dec_inp(解码器输入)变量,我尝试做的似乎还没有在Tensorflow中完成,但从概念上讲尤其简单(见标题).
这是张量图:
图中有一些我不会想到的东西,例如RMSProp优化器和basic_rnn_seq2seq之间的链接.
这是我尝试过的:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import tempfile
import math
rnn_cell = tf.nn.rnn_cell
seq2seq = tf.nn.seq2seq
tf.reset_default_graph()
sess = tf.InteractiveSession()
# Neural net's parameters
seq_length = 5 # Inputs and outputs are sequences of 5 units
batch_size = 1 # Keeping it simple for now
# Each unit in the sequence is a float32 vector of lenght 10:
# Same dimension …Run Code Online (Sandbox Code Playgroud) python machine-learning deep-learning tensorflow recurrent-neural-network
我正在尝试开发一个神经网络来预测时间序列.
据我所知,我正在训练我的神经网络训练集并用测试集验证它.
当我对我的结果感到满意时,我可以使用我的神经网络来预测新值,而神经网络本身基本上只是我使用训练集调整的所有权重.
它是否正确?
如果是这样,我应该只训练我的网络一次,然后只使用我的网络(权重)来预测未来的价值.您通常如何避免重新计算整个网络?我是否应该将所有权重保存在数据库或其他内容中,以便我可以随时访问它而无需再次训练?
如果我的理解是正确的,我可以在专用计算机(例如超级计算机)上进行大量计算,然后在网络服务器,iPhone应用程序或类似的东西上使用我的网络,但我不知道如何存储它.
python machine-learning neural-network heavy-computation recurrent-neural-network
我正在尝试在 Keras 中实现自定义 RNN 层,并尝试遵循此链接中的说明,该链接基本上指示如何从现有 RNN 类继承。然而,我的公式中隐藏层的更新方程有点不同:h(t) = tanh(W.x + U.h(t-1) + V.r(t) + b)我有点困惑。在此方程中,r(t) = f(x, p(t))是 的函数x,即随时间分布的固定输入,也是 的函数p(t) = O(t-1).alpha + p(t-1),其中O(t)是每个 RNN 单元的 Softmax 输出。
我认为super(customRNN, self).step在调用继承的step函数后,标准h(t)应该被我的定义覆盖h(t)。但是我不确定如何修改statesandget_constants函数,以及是否需要修改 Keras 中的循环和 simpleRNN 类的任何其他部分。我的直觉是,该get_constants函数仅将丢失矩阵作为额外状态返回到阶跃函数,因此我猜测应该为我的方程中的丢失矩阵添加至少一个状态V。
我最近刚刚开始使用 Keras,但找不到很多关于自定义 Keras 层定义的参考。抱歉,如果我的问题因大量参数而有点不知所措,我只是想确保我没有遗漏任何要点。谢谢!
我将有状态LSTM定义为顺序模型:
model = Sequential()
model.add(LSTM(..., stateful=True))
...
Run Code Online (Sandbox Code Playgroud)
后来,我将它用作功能模型:
input_1, input_2 = Input(...), Input(...)
output_1 = model(input_1)
output_2 = model(input_2) # Is the state from input_1 preserved?
Run Code Online (Sandbox Code Playgroud)
input_1当我们model再次申请时,input_2是否保留了州 ?如果是,我如何在呼叫之间重置模型状态?
python machine-learning neural-network keras recurrent-neural-network
当输入是批量主要而不是时间主要时,RNN会学习不同的依赖模式吗?
python deep-learning lstm tensorflow recurrent-neural-network
是否有可能在Keras实施一对多LSTM?
如果是的话,你能给我一个简单的例子吗?
machine-learning neural-network deep-learning keras recurrent-neural-network
给定具有维度的X (m个样本,n个序列和k个特征),以及具有维度的y个标签(m个样本,0/1):
假设我想训练一个有状态的LSTM(通过keras定义,其中"stateful = True"意味着每个样本的序列之间没有重置单元状态 - 如果我错了请纠正我!),是否应该重置状态在每个时期或每个样本的基础上?
例:
for e in epoch:
for m in X.shape[0]: #for each sample
for n in X.shape[1]: #for each sequence
#train_on_batch for model...
#model.reset_states() (1) I believe this is 'stateful = False'?
#model.reset_states() (2) wouldn't this make more sense?
#model.reset_states() (3) This is what I usually see...
Run Code Online (Sandbox Code Playgroud)
总之,我不确定是否在每个序列或每个时期之后重置状态(在所有m个样本都在X中训练之后).
建议非常感谢.
我正在从某人的代码中使用 PyTorch 学习 LSTM。这里他clip_grad_norm_在两层 LSTM 的训练过程中使用了该函数。我想知道他为什么clip_grad_norm_在这里使用这个函数,这样我就可以正确理解整个代码(他在倒数第二行使用了它)。
for x, y in get_batches(data, batch_size, seq_length):
counter += 1
x = one_hot_encode(x, n_chars)
inputs, targets = torch.from_numpy(x), torch.from_numpy(y)
if(train_on_gpu):
inputs, targets = inputs.cuda(), targets.cuda()
h = tuple([each.data for each in h])
net.zero_grad()
output, h = net(inputs, h)
loss = criterion(output, targets.view(batch_size*seq_length).long())
loss.backward()
nn.utils.clip_grad_norm_(net.parameters(), clip)
opt.step()
Run Code Online (Sandbox Code Playgroud)
如果您需要有关问题的更多信息,请告诉我。
大家晚上好,
我花了过去 6 个小时尝试调试 Jax 中看似随机出现的 NaN 值。我已经缩小范围,NaN 最初源于损失函数或其梯度。
此处提供了重现错误的最小笔记本https://colab.research.google.com/drive/1uXa-igMm9QBOOl8ZNdK1OkwxRFlLqvZD?usp=sharing
作为 Jax 的一个用例,这也可能很有趣。当只有有限数量的陀螺仪/加速度计测量可用时,我使用 Jax 来解决方向估计任务。在这里,四元数运算的有效实现是很好的。
训练循环一开始很好,但最终会出现分歧
Step 0| Loss: 4.550444602966309 | Time: 13.910547971725464s
Step 1| Loss: 4.110116481781006 | Time: 5.478027105331421s
Step 2| Loss: 3.7159230709075928 | Time: 5.476970911026001s
Step 3| Loss: 3.491917371749878 | Time: 5.474078416824341s
Step 4| Loss: 3.232130765914917 | Time: 5.433410406112671s
Step 5| Loss: 3.095140218734741 | Time: 5.433837413787842s
Step 6| Loss: 2.9580295085906982 | Time: 5.429029941558838s
Step 7| Loss: nan | Time: 5.427825689315796s
Step 8| Loss: …Run Code Online (Sandbox Code Playgroud)