Keras LSTM中2D输入的意义

rryofs0p  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(191)

在Keras中,LSTM的形式是[batch,timesteps,feature]。如果我将输入表示为keras.Input(shape=(20,1)),并将矩阵(100,20,1)作为输入,会怎样?在这种情况下,它考虑的批处理数量是多少?批处理大小是100,每个批处理中有20个时间干吗?

uz75evzq

uz75evzq1#

TL; DR

在您的示例中,batch, timestep, features定义为None, 20, 1,其中批处理表示在model.fit期间传递的batch_size参数。模型不需要事先知道这一点。因此,在定义输入图层时(或LSTM层的输入形状),你只需要定义(timesteps, features)就是(20, 1)。一个简单的model.summary()将显示在创建计算图时输入大小被转换为(None, 20, 1)
∮深入主题∮
了解情况的一个好方法是打印模型的摘要。让我举一个简单的例子,并向您介绍这些步骤-

#Creating a simple stacked LSTM model

from tensorflow.keras import layers, Model
import numpy as np

inp = layers.Input((20,1))                       #<------
x = layers.LSTM(5, return_sequences=True)(inp)
x = layers.LSTM(4)(x)
out = layers.Dense(1, activation='sigmoid')(x)

model = Model(inp, out)
model.compile(loss='binary_crossentropy')
model.summary()
Model: "model_8"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_10 (InputLayer)       [(None, 20, 1)]           0         
                                                                 
 lstm_14 (LSTM)              (None, 20, 5)             140       
                                                                 
 lstm_15 (LSTM)              (None, 4)                 160       
                                                                 
 dense_8 (Dense)             (None, 1)                 5         
                                                                 
=================================================================
Total params: 305
Trainable params: 305
Non-trainable params: 0
_________________________________________________________________

如你所见,Tensor的流动(更具体地说,Tensor的形状在网络中流动时是如何变化的)。正如您所看到的,我使用的函数API允许我专门创建20,1形状的输入层,然后将其传递给LSTM。但有趣的是,你可以看到这个Input层的实际形状是(None, 20, 1)。这也是你所指的batch, timesteps, features
时间步长为20,并且是单个要素,因此易于理解,但是,None是在model.fit期间定义的batch_size参数的占位符
一个二个一个一个
在本例中,我将batch_size设置为10。这意味着,当您训练模型时,每个"步骤"都将批量(10, 20, 1)形状传递给模型,并且每个时期将有10个这样的步骤,因为训练数据的总体大小为(100,20,1)。这由每个时期的进度条前面的10/10指示。
另一个有趣的事情是,只要你遵守模型训练的基本规则和批量大小约束,你就不一定需要定义输入的维度。这里有一个例子,我把时间步长的数量定义为None,这意味着我现在可以传递可变长度的时间步长(例如可变长度的句子),以使用LSTM层进行编码。

from tensorflow.keras import layers, Model
import numpy as np

inp = layers.Input((None,1))                       #<------
x = layers.LSTM(5, return_sequences=True)(inp)
x = layers.LSTM(4)(x)
out = layers.Dense(1, activation='sigmoid')(x)

model = Model(inp, out)
model.compile(loss='binary_crossentropy')
model.summary()
Model: "model_10"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_12 (InputLayer)       [(None, None, 1)]         0         
                                                                 
 lstm_18 (LSTM)              (None, None, 5)           140       
                                                                 
 lstm_19 (LSTM)              (None, 4)                 160       
                                                                 
 dense_10 (Dense)            (None, 1)                 5         
                                                                 
=================================================================
Total params: 305
Trainable params: 305
Non-trainable params: 0
_________________________________________________________________

这意味着模型不需要事先知道它需要处理多少个时间步长,类似于它不需要事先知道它会得到什么batch_size。这些东西可以在model.fit期间解释或作为参数传递。注意model.summary()只是将时间步长维周围的信息缺乏扩展到后续层。
但需要注意的是,LSTM可以处理可变大小的输入,因为在上面的例子中,您只需将时间步长作为None传递,但是,您必须确保每个批处理都具有相同数量的时间步长。换句话说,要处理可变大小的句子,比如[(20,1), (25, 1), (20, 1), ...],请使用批处理大小1,以便每个批处理具有一致的大小。或者创建一个生成器,该生成器创建相等batch_size的批并且组合具有恒定长度的句子。例如,第一批只有5(20,1)个句子,第二批只有5(25,1)个句子等等。第二种方法比第一种方法快,但是设置起来可能更痛苦。

奖金

此外,对于任何好奇batch_size对模型训练有何影响的人来说,大的batch_size可能会像preferred over decaying the learning rate一样对加快计算速度非常有帮助,但它可能会导致所谓的Generalization Gap
这两篇文章应该会很清楚地说明如何使用batch_size作为模型训练的一个强大参数,而这个参数经常被忽略。

相关问题