sho*_*369 5 updatebatchsize keras
我的问题是从 LSTM 中获取所有隐藏输出,并将它们用作单个密集层的训练示例。展平隐藏层的输出并将它们馈送到密集层并不是我想要做的。我尝试了以下几件事:
我已经考虑了密集层的 Timedistributed 包装器(https://keras.io/layers/wrappers/)。但是,这似乎将同一层应用于每个时间片,这不是我想要的。换句话说,Timedistributed 包装器具有 3D 张量的 input_shape(样本数、时间步数、特征数)并生成另一个相同类型的 3D 张量:(样本数、时间步数、特征数)。相反,我想要的是一个 2D 张量作为输出,它看起来像(样本数*时间步数,特征数)
GitHub 上有一个 AdvancedReshapeLayer 的拉取请求:https : //github.com/fchollet/keras/pull/36。这似乎正是我正在寻找的。不幸的是,该拉取请求似乎已关闭,但没有确定的结果。
我尝试构建自己的 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) 时。我收到以下错误:
输入 0 与层密集_1 不兼容:预期 ndim=2,发现 ndim=3
这令人困惑,因为当我在 (B) 之后打印 model.output_shape 时,我确实看到了 (BATCH_SIZE*NUM_OF_TIMESTEPS, NUM_LSTM_UNITS),即 ndim=2。
真的很感谢任何帮助。
编辑:当我尝试使用功能 API 而不是顺序模型时,我仍然在步骤 (C) 上遇到相同的错误
小智 7
您可以使用包含 batch_size 维度的后端重塑。
def backend_reshape(x):
return backend.reshape(x, (-1, NUM_LSTM_UNITS))
model.add(Lambda(backend_reshape, output_shape=(NUM_LSTM_UNITS,)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2500 次 |
| 最近记录: |