我正在使用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]))
我想弄明白:
答案 0 :(得分:1)
Keras(及其后端)基于连接“张量”的“图表”工作。
在创作过程中,张量本身就是符号。他们有其他张量的形状和联系。但他们没有价值观。
层中确实存在一些值,即模型的权重。权重考虑输入形状和单位数量,但它们不依赖于批量大小。
因此,在创建过程中,模型中的数据非常少。只是模型的权重和张量表示,指示数据的方式和位置。 (当你想到它时,Tensorflow是一个非常好的名字)
在Tensorflow中,输入数据由他们称为占位符的内容表示。它就像一个空容器,以后会收到你的数据。
只有当您开始使用模型时(当您传递现有的输入数据时),它才会实际拥有数据和使用空间。 (不确定以后是否会立即释放这个空间)
大小比空模型大一些原因:
提示模特:
for (let i=0; i<=10; i++) {
setTimeout(() => {console.log(i);}, 1000 * i);
}
。其他都是自动推断的(并且可能忽略传递的值)。