在tensorflow上训练具有不同数据形状的LSTM模型时如何节省内存

在tensorflow上训练具有不同数据形状的LSTM模型时如何节省内存,tensorflow,lstm,Tensorflow,Lstm,我已经用lstm单元构建了一个模型,如下代码所示,其输入是data1和data2,它们的形状是[None,5],这意味着有时[3,5],有时[13,5],有时[80,5],并且大多数超过[50,5] 在训练过程中,我发现使用记忆随着训练步长的增加而不断增加,这意味着训练更多批次时使用记忆会更多,最后训练200或300批次后会出现记忆错误 现在我知道如何通过删除“@tf.function”来避免这种情况(训练时使用的内存会继续增加),但我不知道为什么“@tf.function”和否“@tf.fun

我已经用lstm单元构建了一个模型,如下代码所示,其输入是data1和data2,它们的形状是[None,5],这意味着有时[3,5],有时[13,5],有时[80,5],并且大多数超过[50,5]

在训练过程中,我发现使用记忆随着训练步长的增加而不断增加,这意味着训练更多批次时使用记忆会更多,最后训练200或300批次后会出现记忆错误

现在我知道如何通过删除“@tf.function”来避免这种情况(训练时使用的内存会继续增加),但我不知道为什么“@tf.function”和否“@tf.function”有什么区别

将tensorflow导入为tf
数据1=[
[[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,]],
[[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,],[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,]],
[[2,3,2,3,2],[3,2,3,2,2,]],
[[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,],[2.3,3.3,2,4.3,2.3]],
...
]
数据2=[
[[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,],[2.3,3.3,2,4.3,2.3]],
[[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,],[3.,1.2,3.,22.1,23.2,]],
[[2,3,2,3,2],[3,2,3,2,2,]],
[[2.3,3.3,2,4.3,2.3],[3.,1.2,3.,22.1,23.2,],[2.3,3.3,2,4.3,2.3],[3,2,3,2,2,]],
...
]
标签=[[0.0],[1.0],[1.0],[0.0],…]
L=长度(标签)
def生成器():
对于范围(L)中的i:
产量数据1[i],数据2[i],标签[i]
trains=tf.data.Dataset.from_生成器(生成器,(tf.float32,tf.float32,tf.float16))
ABC类(tf.keras.Model):
定义初始化(自):
超级(ABC,self)。\uuuuu init\uuuuuuuuu()
self.encoder1=tf.keras.models.Sequential([\
tf.keras.layers.LSTM(32,返回序列=True),
tf.keras.layers.LSTM(16)])
self.encoder2=tf.keras.models.Sequential([\
tf.keras.layers.LSTM(32,返回序列=True),
tf.keras.layers.LSTM(16)])
self.density=tf.keras.layers.density(1,活化='sigmoid')
def呼叫(自我、数据1、数据2):
en1=自编码器1(数据1)
en2=自编码器2(数据2)
en12=tf.keras.layers.concatenate([en1,en2])
返回自密实(en12)
模型=ABC()
loss_object=tf.keras.loss.BinaryCrossentropy()
optimizer=tf.keras.optimizers.Adam()
@功能
def系列步骤(数据1、数据2、标签):
使用tf.GradientTape()作为磁带:
预测=模型(数据1、数据2)
损失=损失\对象(标签、预测)
梯度=磁带梯度(损失、模型、可训练的变量)
优化器。应用_梯度(zip(梯度、模型、可训练的_变量))
对于范围(5)中的i:
对于数据1、数据2,在序列中标记。批次(1):
列车步骤(数据1、数据2、标签)

您可以发布错误回溯吗?这是内存错误;我认为这是因为记忆不足;当训练多个批次时,它运行良好,当训练20个批次或25个批次时,会出现内存错误。您是否尝试减少批次大小?我发现我只能将批次大小设置为1,或者模型无法运行,我认为这是因为每个样本大小不同,因此无法在一个批次中堆叠;