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

Похоже, что большинство символьных операторов работают в графическом режиме, и в keras.backend есть подмножество операций numpy. Но не поддерживается итерация или перечисление .

Так, например, у меня есть:

    arr = [[(1,2,3),(2,3,4),(4,5,6)],[(5,6,7),(6,7,8),(7,8,9)]]
    mask = [[1, 0, 1],[0, 0, 1]]
    # and I want
    arr * mask == [[(1,2,3),(0,0,0),(4,5,6)],[(0,0,0),(0,0,0),(7,8,9)]]

Фактические массивы - это изображения, намного больше, чем в этом примере. Есть ли разумный способ замаскировать такие точки?

0
npjohns 13 Окт 2019 в 06:13

1 ответ

Лучший ответ

Из предоставленного вами кода один из самых простых способов сделать - использовать широковещательную рассылку, например @ user1318499, упомянутый в комментариях. Поскольку mask имеет форму (2,3), а arr имеет форму (2,3,3), mask можно растянуть на один тускл, чтобы транслировать с помощью {{X5} }.

import tensorflow as tf

arr = tf.reshape(tf.range(2*3*3), [2,3,3])
# array([[[ 0,  1,  2],
#         [ 3,  4,  5],
#         [ 6,  7,  8]],

#        [[ 9, 10, 11],
#         [12, 13, 14],
#         [15, 16, 17]]], dtype=int32)
mask = tf.constant([[1, 0, 1],[0, 0, 1]])
res = arr * tf.expand_dims(mask, axis=-1)
# array([[[ 0,  1,  2],
#         [ 0,  0,  0],
#         [ 6,  7,  8]],

#        [[ 0,  0,  0],
#         [ 0,  0,  0],
#         [15, 16, 17]]], dtype=int32)
0
zihaozhihao 13 Окт 2019 в 05:18