我正在try 在TensorFlow中创建一个自定义的LSTMCell.我的CPU有24GB的RAM(没有GPU).首先,我创建了一个LSTMCell作为默认LSTMCell.代码如下:

class LSTMCell(tf.keras.layers.AbstractRNNCell):
    def __init__(self, units, **kwargs):
        self.units = units
        super(LSTMCell, self).__init__(**kwargs)

    def build(self, input_shape):
        input_dim = input_shape[-1]
        self.kernel = self.add_weight(shape=(input_dim, self.units * 4),name='kernel',initializer='uniform')
        self.recurrent_kernel = self.add_weight(shape=(self.units, self.units * 4),name='recurrent_kernel',initializer='uniform')
        self.bias = self.add_weight(shape=(self.units * 4,),name='bias',initializer='uniform')

    def _compute_carry_and_output_fused(self, z, c_tm1):
        z0, z1, z2, z3 = z
        i = K.sigmoid(z0)
        f = K.sigmoid(z1)
        c = f * c_tm1 + i * K.tanh(z2)
        o = K.sigmoid(z3)
        return c, o

    def call(self, inputs, states, training=None):
        h_tm1 = states[0] 
        c_tm1 = states[1]
        z = K.dot(inputs, self.kernel)
        z += K.dot(h_tm1, self.recurrent_kernel)
        z = K.bias_add(z, self.bias)
        z = tf.split(z, num_or_size_splits=4, axis=1)
        c, o = self._compute_carry_and_output_fused(z, c_tm1)
        h = o * K.sigmoid(c)
        self.h = h
        self.c = c
        return h, [h,c]

这间牢房工作正常.它只消耗8GB的RAM.然后,我根据自己的需要修改了单元格,将参数增加了一倍.代码如下:

class LSTMCell(tf.keras.layers.AbstractRNNCell):
    def __init__(self, units, **kwargs):
        self.units = units
        super(LSTMCell, self).__init__(**kwargs)

    def build(self, input_shape):
        input_dim = input_shape[-1]
        self.kernel = self.add_weight(shape=(input_dim, self.units * 4),name='kernel',initializer='uniform')
        self.recurrent_kernel = self.add_weight(shape=(self.units, self.units * 4),name='recurrent_kernel',initializer='uniform')
        self.bias = self.add_weight(shape=(self.units * 4,),name='bias',initializer='uniform')
        self.kernel_bits = self.add_weight(shape=(input_dim, self.units * 4),name='_diffq_k',initializer='uniform',trainable=True)
        self.recurrent_kernel_bits = self.add_weight(shape=(self.units, self.units * 4),name='_diffq_rk',initializer='uniform',trainable=True)

    def _compute_carry_and_output_fused(self, z, c_tm1):
        z0, z1, z2, z3 = z
        i = K.sigmoid(z0)
        f = K.sigmoid(z1)
        c = f * c_tm1 + i * K.tanh(z2)
        o = K.sigmoid(z3)
        return c, o

    def call(self, inputs, states, training=None):
        h_tm1 = states[0] 
        c_tm1 = states[1]
        z = K.dot(inputs, self.kernel + self.kernel_bits)
        z += K.dot(h_tm1, self.recurrent_kernel + self.recurrent_kernel_bits)
        z = K.bias_add(z, self.bias)
        z = tf.split(z, num_or_size_splits=4, axis=1)
        c, o = self._compute_carry_and_output_fused(z, c_tm1)
        h = o * K.sigmoid(c)
        self.h = h
        self.c = c
        return h, [h,c]

现在,当我try 使用这个单元进行训练时,它会在几秒钟内消耗掉我所有的RAM并导致死亡.我使用的模型如下所示:

input_shape = (1874, 1024)
input = tf.keras.layers.Input(shape=input_shape, name = "input_layer")
x = input
lstm = tf.keras.layers.RNN(LSTMCell(units=input_shape[1]), return_sequences = True)
x = lstm(x)
model = tf.keras.models.Model(input, x, name='my_model')

对于同一个数据集,两个单元的RAM消耗量有很大不同.我已经try 减少输入维度,在我的能力范围内,我只能训练128个单元的lstm.如果我超过这一点,公羊就会吃饱,训练也会失败.我在PyTorch也做了同样的事情,没有任何问题.有人能指出我遇到的问题的原因吗?

推荐答案

我找到了原因.正在为序列的每个元素调用LSTMCell.对于给定的输入形状(1874, 1024),在每个转发调用中,调用时的计算被执行1874次,并保持这些

Python相关问答推荐

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

以异步方式填充Pandas 数据帧

如何在Python Pandas中填充外部连接后的列中填充DDL值

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

将数字数组添加到Pandas DataFrame的单元格依赖于初始化

一维不匹配两个数组上的广义ufunc

如何获取给定列中包含特定值的行号?

Pandas 删除只有一种类型的值的行,重复或不重复

如何批量训练样本大小为奇数的神经网络?

如何在networkx图中提取和绘制直接邻居(以及邻居的邻居)?

Django查询集-排除True值

我的浮点问题--在C++/Python中的试用

日志(log)轴上的自定义刻度出现意外的次要刻度标记行为

如何在Python中使用Polars向SQLite数据库写入数据?

在动态创建带有图像的按钮时遇到问题

从一组加速度数据到位置的集成

TypeError:无法实例化抽象模型(Django)

如何分组并查找新的或正在消失的项目

PYTHON中的regex与PostgreSQL等其他系统中的regex有区别吗?

带公差的比率的唯一标识符