keras - 如何在 Keras 中更改中间层的批量大小?

标签 keras

我的问题是从 LSTM 中获取所有隐藏输出,并将它们用作单个密集层的训练示例。展平隐藏层的输出并将它们馈送到密集层并不是我想要做的。我尝试了以下几件事:

  • 我已经考虑了密集层的 Timedistributed 包装器( https://keras.io/layers/wrappers/ )。但是,这似乎将同一层应用于每个时间片,这不是我想要的。换句话说,Timedistributed 包装器具有 3D 张量的 input_shape(样本数、时间步数、特征数)并生成另一个相同类型的 3D 张量:(样本数、时间步数、特征数)。相反,我想要的是一个 2D 张量作为输出,它看起来像(样本数*时间步数,特征数)
  • 有一个 AdvancedReshapeLayer 的拉取请求:https://github.com/fchollet/keras/pull/36在 GitHub 上。这似乎正是我正在寻找的。不幸的是,该拉取请求似乎已关闭,但没有确定的结果。
  • 我尝试构建自己的 lambda 层来完成我想要的操作,如下所示: A). model.add(LSTM(NUM_LSTM_UNITS, return_sequences=True, activation='tanh')) # B). model.add(Lambda(lambda x: x, output_shape=lambda x: (x[0]*x[1], x[2]))) C). model.add(Dense(NUM_CLASSES, input_dim=NUM_LSTM_UNITS))

  • (A) 打印后的 mode.output_shape: (BATCH_SIZE, NUM_TIME_STEPS, NUM_LSTM_UNITS) 和 (B) 打印后的 model.output_shape: (BATCH_SIZE*NUM_OF_TIMESTEPS, NUM_LSTM_UNITS)

    这正是我想要实现的目标。

    不幸的是,当我尝试运行步骤 (C) 时。我收到以下错误:

    Input 0 is incompatible with layer dense_1: expected ndim=2, found ndim=3



    这令人困惑,因为当我在 (B) 之后打印 model.output_shape 时,我确实看到了 (BATCH_SIZE*NUM_OF_TIMESTEPS, NUM_LSTM_UNITS),它是 ndim=2。

    真的很感谢任何帮助。

    编辑:当我尝试使用功能 API 而不是顺序模型时,我仍然在步骤 (C) 上遇到相同的错误

    最佳答案

    您可以使用包含 batch_size 维度的后端 reshape 。

    def backend_reshape(x):
        return backend.reshape(x, (-1, NUM_LSTM_UNITS))
    
    model.add(Lambda(backend_reshape, output_shape=(NUM_LSTM_UNITS,)))
    

    关于keras - 如何在 Keras 中更改中间层的批量大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41291937/

    相关文章:

    python-3.x - 无法保存自定义子类化模型

    python - 如何在 scikit-learn 中有效地编码数字目标变量?

    python - 将输入与嵌入和密集层合并

    tensorflow - Keras 中的 5 层 DNN 使用 GPU 训练速度较慢

    python - 如何使用 GPU 运行 Keras Model.Predict()

    python - 'tf.data()' throwing 你的输入数据用完了;中断训练

    tensorflow - 用于 360 度预测的 keras 损失函数

    python - Keras 拟合生成器慢

    machine-learning - ReLU 没有学习处理负输入 Keras/Tensorflow

    python - 如何在损失函数中的 keras 张量上使用 numpy 函数?