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

如何改变Keras中间层的批量大小?,keras,updatebatchsize,Keras,Updatebatchsize,我的问题是从LSTM获取所有隐藏的输出,并将它们用作单个密集层的训练示例。将隐藏层的输出展平并将其提供给密集层不是我想要做的。我试过以下几件事: 我考虑了稠密层()的时间分布包装器。但是,这似乎将同一层应用于每个时间片,这不是我想要的。换句话说,Timedistributed包装器具有3D张量的输入形状(样本数、时间步数、特征数),并生成另一个相同类型的3D张量:(样本数、时间步数、特征数)。相反,我想要的是一个2D张量作为输出,它看起来像(样本数*时间步数,特征数) 在GitHub上有一个对A

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

  • 我考虑了稠密层()的时间分布包装器。但是,这似乎将同一层应用于每个时间片,这不是我想要的。换句话说,Timedistributed包装器具有3D张量的输入形状(样本数、时间步数、特征数),并生成另一个相同类型的3D张量:(样本数、时间步数、特征数)。相反,我想要的是一个2D张量作为输出,它看起来像(样本数*时间步数,特征数)

  • 在GitHub上有一个对AdvancedReformateLayer:的拉取请求。这似乎正是我要找的。不幸的是,拉取请求似乎已经结束,没有最终结果

  • 我尝试构建自己的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) 。添加(密集(NUM_类,input_dim=NUM_LSTM_单位))
    

  • (A)打印后的mode.output_形状:(批大小、NUM_时间步数、NUM_LSTM_单位)和(B)打印后的mode.output_形状:(批大小*NUM_时间步数、NUM_LSTM_单位)

    这正是我想要实现的

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

    输入0与层密度_1不兼容:应为ndim=2,找到 ndim=3

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

    非常感谢您的帮助


    编辑:当我尝试使用函数式API而不是顺序模型时,我在步骤(C)中仍然会遇到相同的错误。

    您可以使用后端重塑,其中包括批量大小维度

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

    这太棒了。谢谢。