如何在Keras中将标量添加到张量或从标量创建张量?

时间:2018-07-26 10:48:29

标签: keras keras-layer coreml coremltools

我需要以某种方式运行某种东西:

x = Input(shape=(img_height, img_width, img_channels))
x1 = Add()([x, 127.5])
x2 = Multiply()(x1, -127.5])

但是,出现了错误:
ValueError: Layer add_1 was called with an input that isn't a symbolic tensor. Received type: <class 'float'>. Full input: [<tf.Tensor 'input_1:0' shape=(?, 400, 300, 3) dtype=float32>, 0.00784313725490196]. All inputs to the layer should be tensors.

我不能使用Lambda()层,因为我需要将最终模型转换为CoreML,并且无法迅速重写它们。

有什么方法可以从float中创建Keras张量吗?
也许对此问题有不同的解决方案?

UPD:后端是TensorFlow

1 个答案:

答案 0 :(得分:0)

基于上面的评论,我已经测试了两种方法。自定义层不是一种选择,因为我需要迅速编写它才能转换为CoreML模型(而且我也不知道Swift)。

其他输入
据我所知,没有办法预定义输入值,因此我需要在输入中传递其他参数,这不太方便。
考虑下面的示例代码:

input1 = keras.layers.Input(shape=(1,), tensor=t_b, name='11')
input2 = keras.layers.Input(shape=(1,))
input3 = keras.layers.Input(shape=(1,), tensor=t_a, name='22')

# x1 = keras.layers.Dense(4, activation='relu')(input1)
# x2 = keras.layers.Dense(4, activation='relu')(input2)

added = keras.layers.Add()([input1, input3])  # equivalent to added = keras.layers.add([x1, x2])
added2 = keras.layers.Add()([input2, added])  # equivalent to added = keras.layers.add([x1, x2])

# out = keras.layers.Dense(4)(added2)

model = keras.models.Model(inputs=[input1, input2, input3], outputs=added2)

如果要在干净的环境中加载该模型,则实际上需要向其传递3个值:my_model.predict([np.array([1]), np.array([1]), np.array([1])])否则会出现错误。

CoreML工具
通过在导入器函数中使用*_biasimage_scale参数,可以达到理想的效果。下面的示例。

coreml_model = coremltools.converters.keras.convert(
    model_path,
    input_names='image',
    image_input_names='image',
    output_names=['cla','bo'],
    image_scale=1/127.5,  # divide matrix by value
    # substract 1 from every value in matrix
    red_bias=-1.0,  # substract value from channel
    blue_bias=-1.0,
    green_bias=-1.0
)

如果有人知道如何在Keras中预定义常量(不应通过输入层加载该常量),请编写方式(tf.constant() solution is not working)。