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

时间:2017-11-08 18:47:43

标签: 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. 为什么在创建模型时内存不会增加?

1 个答案:

答案 0 :(得分:1)

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

在创作过程中,张量本身就是符号。他们有其他张量的形状和联系。但他们没有价值观。

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

因此,在创建过程中,模型中的数据非常少。只是模型的权重和张量表示,指示数据的方式和位置。 (当你想到它时,Tensorflow是一个非常好的名字)

在Tensorflow中,输入数据由他们称为占位符的内容表示。它就像一个空容器,以后会收到你的数据。

只有当您开始使用模型时(当您传递现有的输入数据时),它才会实际拥有数据和使用空间。 (不确定以后是否会立即释放这个空间)

大小比空模型大一些原因:

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

提示模特:

  • 只有第一层需要for (let i=0; i<=10; i++) { setTimeout(() => {console.log(i);}, 1000 * i); } 。其他都是自动推断的(并且可能忽略传递的值)。