python-3.x - 神经网络、Keras 的内存使用情况

标签 python-3.x tensorflow keras

我正在尝试开发一个图像去噪模型。我一直在阅读如何计算神经网络的内存使用情况,标准方法似乎是:

    params = depth_n x (kernel_width x kernel_height) x depth_n-1 + depth

通过将网络中的所有参数相加,我最终得到 1,038,097,大​​约为 4.2MB。看来我在最后一层做了一个轻微的计算错误,因为 Keras 最终得到了 1,038,497 参数。然而,这是一个很小的差异。 4.2MB 只是参数,我在某处看到应该乘以 3 以包含反向传播和其他所需的计算。这将大约为 13MB。

我有大约 11 GB 的 GPU 内存可供使用,但这个模型已经耗尽。所有额外需要的内存从哪里来?我缺少什么?我知道这篇文章可能会被标记为重复,但其他人似乎都没有捕获我要问的主题。

我的模型:

    def network(self):
        weights = RandomUniform(minval=-0.05, maxval=0.05, seed=None)
        input_img = Input(shape=(self.img_rows, self.img_cols, self.channels))
        conv1 = Conv2D(1024, (3,3), activation='tanh', kernel_initializer=weights,
                padding='same', use_bias=True)(input_img)
        conv2 = Conv2D(64, (3,3), activation='tanh', kernel_initializer=weights,
                padding='same', use_bias=True)(conv1)
        conv3 = Conv2D(64, (3,3), activation='tanh', kernel_initializer=weights,
                padding='same', use_bias=True)(conv2)
        conv4 = Conv2D(64, (3,3), activation='relu', kernel_initializer=weights,
                padding='same', use_bias=True)(conv3)
        conv5 = Conv2D(64, (7,7), activation='relu', kernel_initializer=weights,
                padding='same', use_bias=True)(conv4)
        conv6 = Conv2D(64, (5,5), activation='relu', kernel_initializer=weights,
                padding='same', use_bias=True)(conv5)
        conv7 = Conv2D(32, (5,5), activation='relu', kernel_initializer=weights,
                padding='same', use_bias=True)(conv6)
        conv8 = Conv2D(32, (3,3), activation='relu', kernel_initializer=weights,
                padding='same', use_bias=True)(conv7)
        conv9 = Conv2D(16, (3,3), activation='relu', kernel_initializer=weights,
                padding='same', use_bias=True)(conv8)
        decoded = Conv2D(1, (5,5), kernel_initializer=weights,
                padding='same', activation='sigmoid', use_bias=True)(conv8)
        return input_img, decoded


    def compiler(self):
        self.model.compile(optimizer='RMSprop', loss='mse')
        self.model.summary()

我认为我的模型在很多方面都很愚蠢,并且有很多事情需要改进(dropout、其他过滤器大小和数量、优化器等),并且所有建议都会很高兴地收到,但实际问题仍然存在。为什么这个模型会消耗这么多内存?是因为conv1的深度极高吗?

模型摘要:

    Using TensorFlow backend.
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_1 (InputLayer)         (None, 1751, 480, 1)      0         
    _________________________________________________________________
    conv2d_1 (Conv2D)            (None, 1751, 480, 1024)   10240     
    _________________________________________________________________
    conv2d_2 (Conv2D)            (None, 1751, 480, 64)     589888    
    _________________________________________________________________
    conv2d_3 (Conv2D)            (None, 1751, 480, 64)     36928     
    _________________________________________________________________
    conv2d_4 (Conv2D)            (None, 1751, 480, 64)     36928     
    _________________________________________________________________
    conv2d_5 (Conv2D)            (None, 1751, 480, 64)     200768    
    _________________________________________________________________
    conv2d_6 (Conv2D)            (None, 1751, 480, 64)     102464    
    _________________________________________________________________
    conv2d_7 (Conv2D)            (None, 1751, 480, 32)     51232     
    _________________________________________________________________
    conv2d_8 (Conv2D)            (None, 1751, 480, 32)     9248      
    _________________________________________________________________
    conv2d_10 (Conv2D)           (None, 1751, 480, 1)      801       
    =================================================================
    Total params: 1,038,497
    Trainable params: 1,038,497
    Non-trainable params: 0
    _________________________________________________________________

最佳答案

你是对的,这是由于 conv1 中的过滤器数量所致。您必须计算的是存储激活所需的内存:

model.summary() 所示,该层的输出大小为 (None, 1751, 480, 1024)。对于单个图像,总共有 1751*480*1024 像素。由于您的图像可能采用 float32 格式,因此每个像素需要 4 个字节来存储。因此,该层的输出需要 1751*480*1024*4 字节,对于该层来说,每个图像大约需要 3.2 GB。

如果您将过滤器的数量更改为 64 个,则每个图像只需要大约 200 MB。

更改过滤器的数量或将批量大小更改为 1。

关于python-3.x - 神经网络、Keras 的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53170149/

相关文章:

tensorflow - 导入错误 : libcublas. so.10.0:无法打开共享对象文件:没有这样的文件或目录

python - 输入到 LSTM 网络 tensorflow

python - 具有非方形图像的 CNN 自动编码器

python - keras函数Permute中的参数 'dims'是什么意思?

tensorflow - keras 使用 tensorflow 作为后端 :Cannot interpret feed_dict key as Tensor: Can not convert a int into a Tensor

Python编码注释格式

python - 如何将确切的单词与正则表达式 python 匹配?

python - 覆盖/清除先前的控制台行

python - 如何更改此代码以检查输入单词是否与另一个单词(填字游戏)相交?

python - 使用多处理从多个进程中排队 tf.RandomShuffleQueue