Я пытаюсь запустить числа по потреблению памяти для моей модели Keras, но они не складываются.
У меня есть модель с 3 входами / 3 выходами (назовем их 6 различными изображениями).Каждое изображение имеет (1216, 540, 1)
форму.Также я использую одинарную точность, чтобы уменьшить ее размер.Я использую мини-партию из 6 образцов, и в моем генераторе у меня есть max_queue_size=5
.У меня есть около 150 тыс. Обучаемых параметров (каждые 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 ГБ, а в среднем около 10-12 ГБ.Является ли 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