我有一个大小为(?,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)
答案 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)