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

时间:2016-12-22 21:31:37

标签: keras updatebatchsize

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

  1. 我已经考虑了密集层(https://keras.io/layers/wrappers/)的Timedistributed包装器。但是,这似乎将相同的图层应用于每个时间片,这不是我想要的。换句话说,时间分布包装器具有3D张量的input_shape(样本数,时间步数,特征数)并产生相同类型的另一个3D张量:(样本数,时间步数,特征数)。相反,我想要的是2D张量作为输出,看起来像(样本数量*时间步数,特征数量)

  2. 在GitHub上有一个AdvancedReshapeLayer的拉取请求:https://github.com/fchollet/keras/pull/36。这似乎正是我正在寻找的。不幸的是,看起来拉动请求已经结束,没有确凿的结果。

  3. 我尝试构建自己的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))

  4. (P)打印后的

    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)上得到相同的错误

1 个答案:

答案 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
}