如何修改 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
我正在 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