Можно ли замаскировать тензорные пиксели в графическом режиме, используя двумерный массив? - PullRequest
0 голосов
/ 13 октября 2019

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

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

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

    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)]]

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

1 Ответ

0 голосов
/ 13 октября 2019

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

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