LSTM中input_shape和batch_input_shape之间的区别是什么

时间:2018-03-20 00:22:35

标签: machine-learning deep-learning keras lstm rnn

它只是设置相同内容的不同方式,还是实际上有不同的含义?它与网络配置有什么关系吗?

举一个简单的例子,我看不出任何区别:

model = Sequential()
model.add(LSTM(1, batch_input_shape=(None,5,1), return_sequences=True))
model.add(LSTM(1, return_sequences=False))

model = Sequential()
model.add(LSTM(1, input_shape=(5,1), return_sequences=True))
model.add(LSTM(1, return_sequences=False))

但是,当我将批量大小设置为12 batch_input_shape=(12,5,1)并在拟合模型时使用batch_size=10时,我收到了错误。

  

ValueError:无法为Tensor提供形状值(10,5,1)   'lstm_96_input:0',其形状为'(12,5,1)'

这显然是有道理的。但是,我认为在模型级别限制批量大小没有意义。

我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

  

它只是设置相同内容的不同方式,还是实际上有不同的含义?它与网络配置有什么关系吗?

是的,它们实际上是等效的,您的实验证实了这一点,另请参阅this discussion

  

但是,我认为在模型级别限制批量大小没有意义。

批量大小限制有时是必要的,我想到的一个例子是有状态LSTM ,其中记住批处理中的最后一个单元格状态并用于后续批处理的初始化。这可确保客户不会将不同的批量大小输入网络。示例代码:

# Expected input batch shape: (batch_size, timesteps, data_dim)
# Note that we have to provide the full batch_input_shape since the network is stateful.
# the sample of index i in batch k is the follow-up for the sample i in batch k-1.
model = Sequential()
model.add(LSTM(32, return_sequences=True, stateful=True,
               batch_input_shape=(batch_size, timesteps, data_dim)))