如何将具有动态尺寸的张量的每个2D元素乘以静态2D遮罩?

时间:2019-02-19 01:29:20

标签: python tensorflow lambda keras

我有一个大小为(?,64,64)的输入张量和一个大小为(64,64)的静态张量掩码。 我希望此模型的输出张量具有形状(?,64,64),其中输出的i_th元素是输入的i_th元素与掩码的元素乘元素相乘。

我尝试在keras中使用Multiply()层,因为它提供了逐个元素的乘法,但是它输出的张量为(64,64,64)。我现在读到Multiply()期望张量具有相同的维数,这解释了我的问题。

然后我想我可以通过连接?来创建形状的张量(?,64,64)。蒙版的副本,然后使用Multiply()。但是,我无法创建该张量,因为我没有?的值。 (我尝试使用Img.shape [0],但由于它是NoneType,所以它给我一个错误)

我还决定使用类似如下的方法来更改张量元素的值: rFD1 = K.zeros_like(img) rFD1 [:, :: 2,:: 2] = img [:, :: 2,:: 2] 但是我收到一个错误消息说tensorflow不支持项目分配(这对人们来说不是一个问题吗?!)。

我已经读了很多关于它的主题,但是没有一个主题解决了我的问题。

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

我希望输出形状为(None,64,64)

1 个答案:

答案 0 :(得分:0)

您可以使用*运算符which broadcasts代替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)