deep-learning - 深度可分离卷积需要更多 GPU 内存
问题描述
我读过许多论文和网络文章,它们声称与标准卷积相比,深度可分离卷积减少了深度学习模型所需的内存。但是,我不明白这是怎么回事,因为深度可分离卷积需要存储一个额外的中间步骤矩阵以及最终输出矩阵。
这里有两种情况:
典型卷积:您有一个 3x3 过滤器,它应用于 7x7 RGB 输入体积。这导致需要存储在 GPU 内存中的大小为 5x5x1 的输出。假设激活是 float32,这需要100 字节的内存
深度可分离卷积:您将三个 3x3x1 过滤器应用于 7x7 RGB 输入体积。这会产生三个输出体积,每个体积为 5x5x1。然后,您将 1x1 卷积应用于连接的 5x5x3 体积,以获得大小为 5x5x1 的最终输出体积。因此,对于 float32 激活,中间 5x5x3 体积需要 300 字节,最终输出需要 100 字节。因此总共有400 字节的内存
作为额外的证据,当在 pytorch 中使用具有典型 nn.Conv2d 卷积的实现 U-Net 时,该模型具有 17.3M 参数和 320MB 的前向/后向传递大小。如果我将所有卷积替换为深度可分离卷积,则该模型有 2M 参数,以及 500MB 的前向/后向传递大小。所以更少的参数,但需要更多的内存
我确信我在某个地方出错了,因为每篇文章都指出深度可分离卷积需要更少的内存。我的逻辑哪里出了问题?
解决方案
推荐阅读
- angular - 更新 Angular 版本时,Font Awesome 模块抛出错误
- python - 使用 sklearn 调整神经网络中的参数
- reactjs - 构建 docker 容器时反应应用程序错误
- c#-4.0 - 是否有可能在剑道网格中,第一列应该限制为 10 行,然后它应该继续到下一列
- unity3d - ARCore 是否支持网格管理器,如果支持,如何使用 ARCore Unity 扩展渲染网格?
- visual-studio-code - TestMyCode 环境运行按钮未显示
- javascript - 在 webrtc 中是否可以在不使用画布的情况下获取视频帧?
- python - 删除嵌套字典的重复值
- java - Java Getter 和 Setter 在 Swing ActionListner 中不起作用
- python - 使用 PIL 包在图像上编写日语文本