我需要以某种方式运行某种东西:
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
答案 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工具
通过在导入器函数中使用*_bias
和image_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)。