我正在Keras试验LSTM,几乎没有运气。在某一时刻,我决定缩小到最基本的问题,以便最终取得一些积极的结果。
然而,即使对于最简单的问题,我也发现Keras无法收敛,而在Tensorflow中实现相同的问题则提供了稳定的结果。
我不愿意仅仅切换到Tensorflow,而不理解为什么Keras总是在我尝试的任何问题上出现分歧。
我的问题是延迟回波的多到多序列预测,例如:
蓝线是一个网络输入序列,红色虚线是一个期望输出。
实验是受此存储库的启发,也由此产生了可行的Tensorflow溶液。下面是我的代码的相关摘录,我的最小可复制示例的完整版本是可用的这里。
Keras模型:
model = Sequential()
model.add(LSTM(n_hidden,
input_shape=(n_steps, n_input),
return_sequences=True))
model.add(TimeDistributed(Dense(n_input, activation='linear')))
model.compile(loss=custom_loss,
optimizer=keras.optimizers.Adam(lr=learning_rate),
metrics=[])
Tensorflow模型:
x = tf.placeholder(tf.float32, [None, n_steps, n_input])
y = tf.placeholder(tf.float32, [None, n_steps])
weights = {
'out': tf.Variable(tf.random_normal([n_hidden, n_steps], seed = SEED))
}
biases = {
'out': tf.Variable(tf.random_normal([n_steps], seed = SEED))
}
lstm = rnn.LSTMCell(n_hidden, forget_bias=1.0)
outputs, states = tf.nn.dynamic_rnn(lstm, inputs=x,
dtype=tf.float32,
time_major=False)
h = tf.transpose(outputs, [1, 0, 2])
pred = tf.nn.bias_add(tf.matmul(h[-1], weights['out']), biases['out'])
individual_losses = tf.reduce_sum(tf.squared_difference(pred, y),
reduction_indices=1)
loss = tf.reduce_mean(individual_losses)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate) \
.minimize(loss)
我声称代码的其他部分(data_generation
,training
)是完全相同的。但是,对Keras的学习进展提前停止,并产生了令人不满意的预测。库和示例预测的logloss
图附在下面:
Tensorflow训练模型的日志丢失:
Keras培训模型的日志丢失:
从图中读取并不容易,但是Tensorflow到达target_loss=0.15
,在大约10k批之后就停止了。但是Keras耗尽了所有13k批到loss
的时间,大约只有1.5
。在一个单独的实验中,Keras正在运行100 K批,它没有在1.0
周围进一步停滞。
下图包括:黑线模型输入信号,绿色虚线地面真实输出,红线获取模型输出.
Tensorflow训练模型的预测:
Keras训练模型的预测:
谢谢您的建议和见解,亲爱的同事们!
发布于 2017-10-30 10:44:41
好吧,我已经解决了这个问题。Keras实现现在也稳定地收敛到一个合理的解决方案:
实际上,这些模型并不完全相同。您可以格外小心地检查问题中的Tensorflow
模型版本,并亲自验证实际的Keras
等效值是否列在下面,而不是问题中所述的:
model = Sequential()
model.add(LSTM(n_hidden,
input_shape=(n_steps, n_input),
return_sequences=False))
model.add(Dense(n_steps, input_shape=(n_hidden,), activation='linear'))
model.compile(loss=custom_loss,
optimizer=keras.optimizers.Adam(lr=learning_rate),
metrics=[])
我会详细说明的。这里的可行解决方案使用最后一列大小为n_hidden
的LSTM作为中间激活,然后提供给Dense
层。
所以,在某种程度上,这里的实际预测是由常规感知器做的。
从附加问题的推理示例中可以看出,原始Keras
解决方案中的一个额外的注释来源是错误的。我们在那里看到,早期的时间戳完全失败,而后期的时间戳几乎是完美的。这些较早的时间戳对应于当LSTM只是在新窗口上初始化并且不了解上下文时的状态。
https://stackoverflow.com/questions/46937898
复制相似问题