#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.