对于任何Keras层(Layer类),可有人解释如何理解之间的区别input_shape,units,dim,等?
例如,doc说明了units指定图层的输出形状.
在神经网络的图像下面hidden layer1有4个单位.这是否直接转换为对象的units属性Layer?或者units在Keras中,隐藏层中每个权重的形状是否等于单位数?
普通Dense层中的第一个参数也是units,并且是该层中的神经元/节点的数量.然而,标准LSTM单元如下所示:
(这是" 理解LSTM网络 " 的重写版本)
在Keras,当我创建这样的LSTM对象LSTM(units=N, ...)时,我实际上是在创建N这些LSTM单元吗?或者它是LSTM单元内"神经网络"层的大小,即W公式中的?或者是别的什么?
对于上下文,我正在基于此示例代码工作.
以下是文档:https://keras.io/layers/recurrent/
它说:
units:正整数,输出空间的维数.
这让我觉得它是Keras LSTM"图层"对象的输出数量.意味着下一层将有N输入.这是否意味着NLSTM层中实际存在这些LSTM单元,或者可能只运行一个 LSTM单元用于N迭代输出N这些h[t]值,例如,从h[t-N]多达h[t]?
如果只定义了输出的数量,这是否意味着输入尚可,说,只是一个,还是我们必须手动创建滞后输入变量x[t-N]来x[t],一个由定义的每个LSTM单位units=N的说法?
在我写这篇文章的时候,我发现了论证的return_sequences作用.如果设置为True所有N输出都传递到下一层,而如果设置为False它,则只将最后一个h[t]输出传递给下一层.我对吗?
由于LSTM RNN使用先前的事件来预测当前序列,为什么我们将训练数据混洗?我们不会失去训练数据的时间顺序吗?在对改组后的训练数据进行训练后,如何进行预测仍然有效?
我想预测每周可预测的某些值(低SNR).我需要预测一年中形成的一年的整个时间序列(52个值 - 图1)
我的第一个想法是使用Keras over TensorFlow开发多对多LSTM模型(图2).我正在使用52输入层(前一年的给定时间序列)和52预测输出层(明年的时间序列)训练模型.train_X的形状是(X_examples,52,1),换言之,要训练的X_examples,每个1个特征的52个时间步长.据我所知,Keras会将52个输入视为同一域的时间序列.train_Y的形状是相同的(y_examples,52,1).我添加了一个TimeDistributed层.我的想法是算法会将值预测为时间序列而不是孤立值(我是否正确?)
Keras的模型代码是:
y = y.reshape(y.shape[0], 52, 1)
X = X.reshape(X.shape[0], 52, 1)
# design network
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(X.shape[1], X.shape[2]), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
# fit network
model.fit(X, y, epochs=n_epochs, batch_size=n_batch, verbose=2)
Run Code Online (Sandbox Code Playgroud)
问题是算法没有学习这个例子.它预测的值与属性的值非常相似.我是否正确建模了问题?
第二个问题:另一个想法是用1输入和1输出训练算法,但是在测试期间如何在不查看'1输入'的情况下预测整个2015时间序列?测试数据将具有与训练数据不同的形状.
有几个来源解释有状态/无状态LSTM以及我已经读过的batch_size的作用.我稍后会在帖子中提及它们:
[ 1 ] https://machinelearningmastery.com/understanding-stateful-lstm-recurrent-neural-networks-python-keras/
[ 2 ] https://machinelearningmastery.com/stateful-stateless-lstm-time-series-forecasting-python/
[ 3 ] http://philipperemy.github.io/keras-stateful-lstm/
[ 4 ] https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/
Ans还有其他SO线程,比如了解Keras LSTM和Keras - 有状态的vs无状态LSTM,但是并没有完全解释我正在寻找的东西.
我仍然不确定有关状态和确定batch_size的任务的正确方法是什么.
我有大约1000个独立的时间序列(samples),每个长度大约600天(timesteps)(实际上是可变长度,但我考虑将数据修剪到一个恒定的时间帧),input_dim每个时间步长有8个特征(或)(一些特征与每个样本相同,每个样本一些个体).
Input shape = (1000, 600, 8)
其中一个特征是我想要预测的特征,而其他特征(应该是)支持预测这一个"主要特征".我会为1000个时间序列中的每一个都这样做.什么是模拟这个问题的最佳策略?
Output shape = (1000, 600, 1)
从[ 4 ]:
Keras使用快速符号数学库作为后端,例如TensorFlow和Theano.
使用这些库的缺点是,无论您是在训练网络还是进行预测,数据的形状和大小都必须预先定义并保持不变.
[...]
当您希望进行的预测少于批量大小时,这确实会成为一个问题.例如,您可以获得批量较大的最佳结果,但需要在时间序列或序列问题等方面对一次观察进行预测.
这听起来像是一个"批处理"将沿着timesteps-dimension 分割数据.
但是,[ 3 ]指出:
换句话说,无论何时训练或测试LSTM,首先必须建立批量大小分割的输入
X形状矩阵.例如,如果和,则表示您的模型将接收64个样本的块,计算每个输出(无论每个样本的时间步数是多少),平均梯度并传播它以更新参数向量.nb_samples, timesteps, input_dimnb_samplesnb_samples=1024batch_size=64
当深入研究[ 1 ]和[ 4 ] 的例子时,Jason总是将他的时间序列分成几个只包含1个时间步长的样本(在他的例子中完全确定序列中下一个元素的前身).所以我认为批次实际上是沿着samples-axis …
我已经在7批样品的多批次上训练了一个LSTM模型(用Keras和TF构建),每个样品有3个特征,下面的样本形状类似(下面的数字只是占位符以便解释),每个批次标记为0或1:
数据:
[
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
[[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
...
]
Run Code Online (Sandbox Code Playgroud)
即:m个序列的批次,每个长度为7,其元素是三维向量(因此批次具有形状(m*7*3))
目标:
[
[1]
[0]
[1]
...
]
Run Code Online (Sandbox Code Playgroud)
在我的生产环境中,数据是具有3个特征([1,2,3],[1,2,3]...)的样本流.我希望在每个样本到达我的模型时流式传输并获得中间概率而不等待整个批次(7) - 请参阅下面的动画.
我的一个想法是用缺少的样本填充批处理0,
[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[1,2,3]]但这似乎是低效的.
我将非常感谢任何帮助,这些帮助将指引我以持久的方式保存LSTM中间状态,同时等待下一个样本并预测使用部分数据训练特定批量大小的模型.
更新,包括型号代码:
opt = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=10e-8, decay=0.001)
model = Sequential()
num_features = data.shape[2]
num_samples = data.shape[1]
first_lstm = LSTM(32, batch_input_shape=(None, num_samples, num_features), return_sequences=True, activation='tanh')
model.add(
first_lstm)
model.add(LeakyReLU())
model.add(Dropout(0.2))
model.add(LSTM(16, return_sequences=True, activation='tanh'))
model.add(Dropout(0.2))
model.add(LeakyReLU())
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=opt,
metrics=['accuracy', keras_metrics.precision(), keras_metrics.recall(), f1])
Run Code Online (Sandbox Code Playgroud)
型号摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_1 (LSTM) …Run Code Online (Sandbox Code Playgroud) 这是我的代码,训练完整的模型并保存它:
num_units = 2
activation_function = 'sigmoid'
optimizer = 'adam'
loss_function = 'mean_squared_error'
batch_size = 10
num_epochs = 100
# Initialize the RNN
regressor = Sequential()
# Adding the input layer and the LSTM layer
regressor.add(LSTM(units = num_units, activation = activation_function, input_shape=(None, 1)))
# Adding the output layer
regressor.add(Dense(units = 1))
# Compiling the RNN
regressor.compile(optimizer = optimizer, loss = loss_function)
# Using the training set to train the model
regressor.fit(x_train, y_train, batch_size = batch_size, epochs = num_epochs)
regressor.save('model.h5')
Run Code Online (Sandbox Code Playgroud)
在那之后,我已经看到大多数时候人们建议测试数据集来检查我已经尝试过的预测并获得了良好的结果. …
我是LSTM的新手,经历了理解Keras LSTM,并对Daniel Moller的漂亮答案产生了一些愚蠢的怀疑.
以下是我的一些疑问:
在Achieving one to many 编写的部分下指定了两种方法 ,我们可以使用stateful=True 这些方法循环地获取一步的输出并将其作为下一步的输入(需要output_features == input_features).
在该One to many with repeat vector图中,重复矢量在所有时间步长中One to many with stateful=True作为输入馈送,而在输出中在下一个时间步骤中作为输入馈送.那么,我们不是通过使用stateful=True?来改变图层的工作方式吗?
在构建RNN时,应遵循以上哪两种方法(使用重复向量或将前一时间步输出作为下一个输入)?
在该One to many with stateful=True部分下,为了改变one to many预测手动循环代码中的行为,我们将如何知道steps_to_predict变量,因为我们事先并不知道输出序列长度.
我也不明白整个模型使用last_step output生成方式的方式next_step ouput.它使我对model.predict()功能的工作感到困惑.我的意思是,不是model.predict()同时预测整个输出序列而不是循环通过no. of output sequences(我仍然不知道它的值)生成并做model.predict()预测给定迭代中的特定时间步输出?
我无法理解整个Many to many案例.任何其他链接都会有所帮助.
我知道我们model.reset_states()用来确保新批次独立于前一批次.但是,我们是否手动创建批次序列,以便一个批次跟随另一个批次,或者Keras在stateful=True …
我在输入中有多个时间序列,我想正确构建LSTM模型.
我真的很困惑如何选择参数.我的代码:
model.add(keras.layers.LSTM(hidden_nodes, input_shape=(window, num_features), consume_less="mem"))
model.add(Dropout(0.2))
model.add(keras.layers.Dense(num_features, activation='sigmoid'))
optimizer = keras.optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=0.9, nesterov=True)
Run Code Online (Sandbox Code Playgroud)
我想了解每行,输入参数的含义以及如何选择这些参数.
实际上我对代码没有任何问题,但我需要清楚地了解参数以获得更好的结果.
非常感谢!
我从机器上记录(m1, m2, so on)了 28 天的信号。(注意:每天的每个信号长度为 360)。
machine_num, day1, day2, ..., day28
m1, [12, 10, 5, 6, ...], [78, 85, 32, 12, ...], ..., [12, 12, 12, 12, ...]
m2, [2, 0, 5, 6, ...], [8, 5, 32, 12, ...], ..., [1, 1, 12, 12, ...]
...
m2000, [1, 1, 5, 6, ...], [79, 86, 3, 1, ...], ..., [1, 1, 12, 12, ...]
Run Code Online (Sandbox Code Playgroud)
我想预测未来3天每台机器的信号序列。即在day29, day30, day31. 不过,我没有为天的值29,30和31。所以,我的计划如下使用 …
keras ×9
lstm ×8
python ×5
time-series ×3
tensorflow ×2
forecasting ×1
forward ×1
keras-layer ×1
prediction ×1
stateful ×1
tensor ×1