代码之家  ›  专栏  ›  技术社区  ›  Dmitri K

sin延迟回波-无法再现张量流,导致KERA

  •  3
  • Dmitri K  · 技术社区  · 8 年前

    我正在Keras中尝试LSTM,几乎没有运气。在某个时刻,我决定回到最基本的问题,以最终取得一些积极的成果。
    然而,即使是最简单的问题,我发现Keras也无法收敛,而在Tensorflow中实现相同的问题可以得到稳定的结果。

    我不愿意在不理解为什么Keras在我试图解决的任何问题上不断出现分歧的情况下,直接切换到Tensorflow。

    signal_n_prediction
    蓝线是网络输入序列,红色虚线是预期输出。
    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训练模型的对数损耗: tensorflow_logloss

    Keras训练模型的对数损耗: enter image description here 从图中读取不容易,但Tensorflow达到 target_loss=0.15 在大约10k批次后提前停止。但Keras用完了所有1.3万个批次 loss 仅关于 1.5 . 在一个单独的实验中,Keras运行了10万批,没有出现进一步的停滞 1.0

    下图包括:黑线-模型输入信号,绿色虚线-地面实况输出,红线-采集的模型输出。

    Tensorflow训练模型的预测:
    predictions_tensorflow Keras训练模型的预测: enter image description here 亲爱的同事们,谢谢你们的建议和见解!

    1 回复  |  直到 8 年前
        1
  •  0
  •   Dmitri K    8 年前

    好的,我已经设法解决了这个问题。Keras实施现在也稳步收敛到合理的解决方案:
    keras_new_training_loss keras_new_inference_example

    这些模型实际上并不完全相同。您可以格外小心地检查 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

    凯拉斯 从问题所附的推理示例中,答案已经很明显。我们看到,早期的时间戳完全失败,而后期的时间戳几乎完美。这些早期的时间戳对应于LSTM的状态,当它刚刚在新窗口上初始化并且不知道上下文时。