Я пытался построить сеть, которая выводит двоичный хэш изображения.Для этого я использую две сети 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 ГБ и даже использует пространство подкачки.Как уменьшить проблему увеличения памяти (я также пытался перенести код в массивы, но такая же проблема возникает)