我正在Keras中尝试LSTM,几乎没有运气。在某个时刻,我决定回到最基本的问题,以最终取得一些积极的成果。
然而,即使是最简单的问题,我发现Keras也无法收敛,而在Tensorflow中实现相同的问题可以得到稳定的结果。
我不愿意在不理解为什么Keras在我试图解决的任何问题上不断出现分歧的情况下,直接切换到Tensorflow。
蓝线是网络输入序列,红色虚线是预期输出。
repo
并由此建立了可行的张量流解。
我的代码的相关摘录如下,我的最小可复制示例的完整版本可用
here
.
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用完了所有1.3万个批次
loss
仅关于
1.5
. 在一个单独的实验中,Keras运行了10万批,没有出现进一步的停滞
1.0
下图包括:黑线-模型输入信号,绿色虚线-地面实况输出,红线-采集的模型输出。
Tensorflow训练模型的预测:
Keras训练模型的预测:
亲爱的同事们,谢谢你们的建议和见解!