Программа Keras занимает слишком много памяти - PullRequest
0 голосов
/ 14 мая 2018

Я пытался построить сеть, которая выводит двоичный хэш изображения.Для этого я использую две сети Vgg-19 бок о бок, и для тренировки передаю два изображения так, чтобы конечный хеш был ближе, если изображения похожи, и наоборот.Я использую Geforce GTX 1080 с 12 ГБ оперативной памяти. Вот фрагмент кода для обучения модели:

#positive images
prim_model.fit(data[index][0], temp_label, epochs=1, verbose=0)
sec_model.fit(data[index][i], temp_label, epochs=1, verbose=0) 
model_vars._calculate_binary([prim_model, sec_model], [index, 0, index, i])

#negative images
prim_model.fit(data[index][0], temp_label, epochs=1, verbose=0)
sec_model.fit(data[index][i], temp_label, epochs=1, verbose=0) 
model_vars._calculate_binary([prim_model, sec_model], [index, 0, index, i])

здесь model_vars - это объект, содержащий все важные переменные модели, такие как

U = a tensor of shape (64, 3200) where 64 is binary bits of output and 3200 is number of images and U represents the output of all the images from prim_model(first model)
V = a tensor of same shape which holds output of sec_model
B = a tensor of shape(16, 3200) storing the final binary values of output

теперь после каждой операции подбора (то есть изображения передаются в виде пар, одна из которых мы собираемся сгенерировать хэш, а другая включает в себя одно похожее изображение и одно отрицательное изображение.я] будет содержать аналогичное изображение, а в другой подгонке - разное изображение).Здесь значение Kbit равно 64. Теперь, после прохождения пары, я вычисляю тензор B, используя функцию calc_binary, которая имеет вид

for index in xrange(3200):

        Q = some_calculations (a 2-d tenor of shape(16, 3200)


        Q_star_c =  tf.reshape(tf.transpose(Q)[:, (index)], [self.kbit, 1] )    #extracting a column from Q
        U_star_c =  #A column extracted from U
        V_star_c =  #A column extracted from V

        self.U_1 = tf.concat( [ self.U[:, 0:index], self.U[:, index+1: self.total_images]] , axis=1) #Removing the column extracted above from the original now the size of U_1 is (16, 3199)
        self.V_1 = #same as above
        self.B = #slicing the original B tensor


        #Now doing some calcultion to calculate B_star_c (binary value of index'th image
        B_star_c =  tf.scalar_mul(-1, \
                    tf.sign(tf.add(tf.matmul(tf.scalar_mul(2, self.B), \
                    tf.add(tf.matmul(self.U_1, U_star_c, transpose_a=True), tf.matmul(self.V_1, V_star_c, transpose_a=True)) ) , Q_star_c)) )

        #Now combining the final generated binary column to the original Binary tensor making the size of B to be (16, 3200) again
        self.B = tf.concat( [ self.B[:, 0:index], tf.concat( [B_star_c, self.B[:, index:self.total_images]], axis=1)], axis=1)

. Теперь после подбора более 100/3200 изображений моему коду не хватает памяти.Это вызвано функцией calc_binary (потому что всякий раз, когда я прекращаю использовать ее, проблемы решаются). Когда я использовал htop для просмотра состояния памяти, он показывает полное потребление 32 ГБ / 32 ГБ и даже использует пространство подкачки.Как уменьшить проблему увеличения памяти (я также пытался перенести код в массивы, но такая же проблема возникает)

1 Ответ

0 голосов
/ 15 мая 2018

Я собираюсь догадаться, что это tf.concat of self.B ...

Потому что каждый раз, когда функция запускается, она объединяет себя. Все больше и больше. Вы можете проверить, какой тензор вызывает ошибку памяти, печатая его размер на каждой итерации.

...