我的问题是从LSTM获取所有隐藏的输出,并将它们用作单个密集层的训练示例。将隐藏层的输出展平并将它们送入密集层并不是我想要做的。我尝试了以下事项:
我已经考虑了密集层(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))
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与图层dense_1不兼容:预期ndim = 2,找到 NDIM = 3
这令人困惑,因为当我在(B)之后打印model.output_shape时,我确实看到了(BATCH_SIZE * NUM_OF_TIMESTEPS,NUM_LSTM_UNITS),它是ndim = 2。
真的很感激任何帮助。
编辑:当我尝试使用功能API而不是顺序模型时,我仍然在步骤(C)上得到相同的错误
答案 0 :(得分:3)
您可以使用包含batch_size维度的后端重塑。
func setCenter(days: Int){
let circleColor = UIColor.black
var textColor = UIColor.white
pieChart.holeRadiusPercent = 0.3
pieChart.transparentCircleRadiusPercent = 0.0
let dayString = String(describing: days)
let centerText = NSAttributedString(string: dayString , attributes: [
NSForegroundColorAttributeName:textColor,NSFontAttributeName: UIFont(name: "SubwayLogo",size:30)!])
pieChart.centerAttributedText = centerText
pieChart.centerTextRadiusPercent = 1.0
pieChart.holeColor = circleColor
}