如何修改 Keras Tensor 对象的元素

How to modify elements of a Keras Tensor object

我正在 Keras 中构建一个卷积神经网络,它接收尺寸为 (None, 256, 256, 1) 的一批图像,输出将是尺寸为 (None, 256 , 256, 3).现在,在最后一层输出之后,我想添加一个层,该层根据输入的值条件为输出层中的某些像素分配值。这是我尝试过的:

函数

def SetBoundaries(ins):
    xi = ins[0]
    xo = ins[1]

    bnds = np.where(xi[:, :, :, 0] == 0)
    bnds_s, bnds_i, bnds_j = bnds[0], bnds[1], bnds[2]
    xo[bnds_s, bnds_i, bnds_j, 0] = 0
    xo[bnds_s, bnds_i, bnds_j, 1] = 0
    xo[bnds_s, bnds_i, bnds_j, 2] = 0

    return xo

Keras 模型

def conv_res(inputs):
    x0 = inputs

    ...

    xc = conv_layer(xc, kernel_size=3, stride=1,
                    num_filters=3, name="Final_Conv")

    # apply assignment function
    xc = Lambda(SetBoundaries, name="assign_boundaries")([x0, xc])
    return xc

最后,模型构建使用

def build_model(inputs):
    xres = int(inputs.shape[1])
    yres = int(inputs.shape[2])
    cres = int(inputs.shape[3])

    inputs = Input((xres, yres, cres))
    outputs = UNet.conv_res(inputs)
    model = keras.Model(inputs=inputs, outputs=outputs)
    return model

然而,当我 运行 我得到错误:

NotImplementedError: Cannot convert a symbolic Tensor (assign_boundaries/Equal:0) to a numpy array.

没有 Lambda 函数一切正常。我知道问题是为 Tensor 对象赋值,但我怎样才能实现我所追求的目标?

谢谢

np.where 适用于 NumPy 数组,但模型的输出是 Tensorflow 张量。尝试使用 tf.where,这与 tf.Tensor 相同。

我设法通过将函数更改为:

使其工作
def SetBoundaries(ins):
    xi = ins[0]
    xo = ins[1]

    xin = tf.broadcast_to(xi, tf.shape(xo))
    mask = K.cast(tf.not_equal(xin, 0), dtype="float32")
    xf = layers.Multiply()([mask, xo])

    return xf