#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()
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()
此外,对于任何好奇batch_size对模型训练有何影响的人来说,大的batch_size可能会像preferred over decaying the learning rate一样对加快计算速度非常有帮助,但它可能会导致所谓的Generalization Gap。 这两篇文章应该会很清楚地说明如何使用batch_size作为模型训练的一个强大参数,而这个参数经常被忽略。
1条答案
按热度按时间uz75evzq1#
TL; DR
在您的示例中,
batch, timestep, features
定义为None, 20, 1
,其中批处理表示在model.fit
期间传递的batch_size
参数。模型不需要事先知道这一点。因此,在定义输入图层时(或LSTM层的输入形状),你只需要定义(timesteps, features)
就是(20, 1)
。一个简单的model.summary()
将显示在创建计算图时输入大小被转换为(None, 20, 1)
。∮深入主题∮
了解情况的一个好方法是打印模型的摘要。让我举一个简单的例子,并向您介绍这些步骤-
如你所见,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层进行编码。这意味着模型不需要事先知道它需要处理多少个时间步长,类似于它不需要事先知道它会得到什么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
作为模型训练的一个强大参数,而这个参数经常被忽略。