Эффективная взвешенная сумма изображений в tensorflow

#python #tensorflow

#python #tensorflow

Вопрос:

У меня есть куча изображений, которые сгруппированы в тензор следующей формы:

 > images.shape
  

выдает (2000, 1440, 1, 16) , которые имеют следующее значение (rows, cols, channels, images_count)

Теперь для простоты объяснения мне нужно выполнить взвешенную сумму тех изображений, которые приведут к одному изображению, т. Е. (2000, 1440, 1) .

На самом деле существует несколько групп весов (более 128), и это означает, что из 16 входных изображений я получаю 128 объединенных изображений вместо одного, что, судя по размеру изображения, является довольно тяжелой операцией.

И поэтому я ищу способы / идеи, которые позволили бы мне выполнить операцию быстро и эффективно с минимальным количеством временных ресурсов и объемом потребляемой памяти.

Существуют ли какие-либо механизмы в TF, которые позволили бы выполнить эту операцию эффективно и быстро?

Заранее благодарю вас!

Комментарии:

1. Не могли бы вы, пожалуйста, показать свою попытку, поскольку это поможет прояснить тип выполняемой вами операции?

2. @edkeveked что вы имеете в виду под attempt ?

3. Я действительно не понял, что вы пытаетесь сделать из вопроса. Итак, если вы можете предоставить код того, что вы пытаетесь сделать, это поможет увидеть, как упростить операции

Ответ №1:

Предположим для простоты, что у вас есть 8 разных групп весов и данные в указанном вами формате.

Сначала мы преобразуем изображения в обычную batch_size первую форму. Затем мы расширяем размеры изображений, добавляя второе для поддержки трансляции, когда мы выполняем поэлементное умножение между изображениями и весами. Наконец, мы уменьшаем первое измерение, вычисляя (уже взвешенную) сумму изображений для каждой весовой группы.

 import tensorflow as tf
import numpy as np

x = tf.placeholder(tf.float32, shape=(2000, 1440, 1, None))
w = tf.placeholder(tf.float32, shape=(None, 2000, 1440, 1))

xtransposed = tf.transpose(x, perm=[3, 0, 1, 2]) # n_samples first
xexpanded = tf.expand_dims(xtransposed, 1) # expand for broadcasting

multiplied = xexpanded * w

reduced = tf.reduce_sum(multiplied, axis=0) # weighted sum over all images

images = np.random.normal(size=(2000, 1440, 1, 16))
weights = np.random.normal(size=(8, 2000, 1440, 1))

with tf.Session() as sess:
    res = sess.run(reduced, feed_dict={x:images, w:weights})
    print(res.shape) # (8, 2000, 1440, 1)
  

res теперь хранятся взвешенные суммы для 8 различных групп весов в формате numpy.