我正在尝试对Keras模型的内存消耗进行数字计算,但这些数字不会累加。
我有一个3输入/ 3输出模型(我们称它们为6个不同的图像)。每个图像都有(1216, 540, 1)
形状。另外,我正在使用单精度来减小其大小。我使用6个样本的小批量生产,在生成器中有max_queue_size=5
。我大约有15万个可训练的参数(每个16个字节),所以无关紧要。
有了这个,我的内存消耗应该是:
queue_size x batch_size x (6, 1216, 540, 1) x sp bytes
那是
5 x 6 x 3939840 x 4 = 47278000 bytes = 0.44 GB
相反,我的内存峰值为20 GB,平均约为10-12 GB。 Keras本身是否使用Tensorflow后端(一种内存需求工具)? (例如它是否重复某些操作的数据?)我还缺少其他东西吗?下面是生成器的代码,因为误解可能出在代码本身。
def gen(df, batch_size=64, shuffle=False, seed=2019, n_batches=None):
if n_batches is None:
n_batches = np.ceil(df.shape[0] / batch_size)
print(n_batches)
if shuffle:
np.random.seed(seed)
df = df.sample(frac=1)
it = 0 # Iterations counter
while True:
idx_start = batch_size * it
idx_end = batch_size * (it + 1)
xy = np.empty((6, batch_size, N, M, 1))
for i,sample_files in enumerate(df.iloc[idx_start:idx_end].values):
for field,f in enumerate(sample_files):
p = io.read_data(f, shape=(N, M), ncomponents=1)
p = p[..., np.newaxis] # To transform from (N, M) to (N, M, 1)
p = p.astype(np.float32, copy=False)
xy[field,i] = p
it += 1
yield [xy[0],xy[1],xy[2]],[xy[3],xy[4],xy[5]]
if it == n_batches:
np.random.seed(seed + 1)
df = df.sample(frac=1)
it = 0