python - 创建模型并进行预测时,keras 是如何工作的?

标签 python keras

我正在使用 memory_profiler 来检查笔记本电脑使用 keras 时的内存使用情况。这是逐行输出的内存使用情况。

Line #    Mem usage    Increment   Line Contents
16        187.7 MiB      0.0 MiB       model = Sequential()
17        188.4 MiB      0.7 MiB       model.add(Dense(4096, input_shape=(7680,)))
18        189.2 MiB      0.7 MiB       model.add(BatchNormalization(input_shape=(4096,)))
19        189.2 MiB      0.0 MiB       model.add(Activation('relu', input_shape=(4096,)))
20                             
21        189.3 MiB      0.1 MiB       model.add(Dense(4096, input_shape=(4096,)))
22        190.0 MiB      0.7 MiB       model.add(BatchNormalization(input_shape=(4096,)))
23        190.0 MiB      0.1 MiB       model.add(Activation('relu', input_shape=(4096,)))
24                             
25        190.0 MiB      0.0 MiB       model.add(Dense(51, input_shape=(4096,)))
26        190.8 MiB      0.8 MiB       model.add(BatchNormalization(input_shape=(51,)))
27        190.8 MiB      0.0 MiB       model.add(Activation('softmax', input_shape=(51,)))
28        191.0 MiB      0.2 MiB       test_x = np.random.rand(7680)
29        399.9 MiB    208.8 MiB       output = model.predict(np.array([test_x]))

我想弄清楚:

  1. 为什么模型进行预测时内存使用量会增加?我猜是因为内存分配给了 GPU?
  2. 为什么创建模型时内存没有增加?

最佳答案

Keras(及其后端)基于连接“张量”的“图”工作。

在创建过程中,张量本身只是符号。它们具有形状以及与其他张量的连接。但他们没有值(value)观。

确实,层中存在一些值,它们是模型的权重。权重考虑输入形状和单位数量,但它们不依赖于批量大小

因此,在创建过程中,模型中的数据非常少。只是模型的权重和张量表示指示数据应该如何以及去往何处。 (Tensorflow 是一个非常棒的名字)

在 Tensorflow 中,输入数据由所谓的占位符表示。它就像一个空容器,稍后将接收您的数据。

只有当您开始使用模型时(当您传递现有的输入数据时),它才会真正拥有数据并使用空间。 (不知道后面会不会及时释放这个空间)

尺寸比空模型大得多有一些原因:

  • 首先,您的数据中有批量大小,但模型中没有该大小。批处理越大,消耗的内存就越多。
  • 似乎(需要专家的确认)(至少是tensorflow)一次性为模型中的所有张量分配了空间。因此,输入、第一个密集输出、第一个归一化、第一个激活、下一个密集输出等等……都将同时占用空间。 (我在使用 GPU 时得出了这个结论。它提示某个张量不适合内存。我检查了形状,发现它位于高级层中。随着我逐渐减小批量大小,模型中较早出现的其他张量是有罪的。直到我使用了足够小的一批)。
  • 我不确定这是否适用于“预测”,但也有梯度计算所需的所有空间。
<小时/>

模型提示:

  • 只有第一层需要input_shape。其他都是自动推断的(并且传递的值可能会被忽略)。

关于python - 创建模型并进行预测时,keras 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187410/

相关文章:

python - 从 werkzeug 导入安全导入 werkzeug VS

python - OpenCV 错误 : Unknown error code -49 in Python

python - 从 python 数据框的列构造二分图

python - 在 iPython Notebook 中写入标题会导致标题不可见

python - Keras:许多批量大小失败

python - ValueError at/image/Tensor Tensor ("activation_5/Softmax:0", shape=(?, 4), dtype=float32) 不是这个图的元素

python - 如何使用 ZeroMQ 通过 TCP 套接字发送 PNG 图像?

python - 输出层中不兼容的形状 - Tensorflow

machine-learning - 如何添加回归头

python - 跨多个表的 SQLAlchemy 关系