Как умножить каждый 2D-элемент тензора с динамическим измерением на статическую 2D-маску? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть входной тензор размера (?, 64, 64) и статическая тензорная маска размера (64, 64).Я хочу, чтобы выходной тензор этой модели имел форму (?, 64, 64), где i-й элемент вывода - это поэлементное умножение i-го элемента ввода и маски.

IМы пытались использовать слой Multiply () в кератах, так как он обеспечивает умножение элементов на элементы, но выводит тензор (64, 64, 64).Теперь я прочитал, что Multiply () ожидает, что тензоры будут одного размера, что объясняет мою проблему.

Затем я подумал, что мог бы создать тензор формы (?, 64, 64), созданный путем конкатенации?копии маски, а затем используйте Multiply ().Однако я не могу создать этот тензор, потому что у меня нет значения?(Я пытаюсь использовать Img.shape [0], но выдает ошибку, так как это NoneType)

Я также решил изменить значения тензорного элемента по элементу примерно так: rFD1 = K.zeros_like (img) rFD1 [:, :: 2, :: 2] = img [:, :: 2, :: 2] Но я получаю сообщение о том, что тензор потока не поддерживает назначение элементов (как это не проблема длялюди?!).

Я читал об этом так много тем, но ни одна из них еще не решила мою проблему.

def MyFunc(img):
    rmask = np.zeros([64, 64])
    rmask[::2, ::2] = np.ones([32, 32])
    rmask = K.variable(rmask)
    rFD1 = Multiply()([img, rmask])

    return rFD1

img = Input(shape = (64, 64))
x1 = Lambda(MyFunc)(img)
model = Model(input = img, output = x1)
model.summary()

Слой (тип) Выходной параметр Параметр #

input_99 (InputLayer) (Нет, 64, 64) 0

lambda_720 (Lambda) (64, 64,64) 0

Всего параметров: 0 Обучаемые параметры: 0 Необучаемые параметры: 0

Где я ожидаю выходную форму (Нет, 64, 64)

1 Ответ

0 голосов
/ 19 февраля 2019

Вместо слоя Multiply вы можете использовать оператор *, , который транслирует :

import tensorflow as tf
import numpy as np

from keras.layers import Multiply, Input, Lambda
from keras.models import Model
from keras import backend as K
def MyFunc(img):
    rmask = np.zeros([64, 64])
    rmask[::2, ::2] = np.ones([32, 32])
    rmask = K.variable(rmask)
    rFD1 = img * rmask

    return rFD1

img = Input(shape = (64, 64))
x1 = Lambda(MyFunc)(img)
model = Model(input = img, output = x1)
model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_6 (InputLayer)         (None, 64, 64)            0         
_________________________________________________________________
lambda_6 (Lambda)            (None, 64, 64)            0         
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________

Проверьте, что все работает:

test_image = K.constant(5., shape=(64,64))
y = model(test_image)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(y.eval() )
    print(y.shape)
[[5. 0. 5. ... 0. 5. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [5. 0. 5. ... 0. 5. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [5. 0. 5. ... 0. 5. 0.]
 [0. 0. 0. ... 0. 0. 0.]]
(64, 64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...