我使用 coremltools 4.0 将 Keras 模型转换为 MLModel,但成功有限。
它有效,但前提是我使用 MLMultiArray 作为输出并转换为图像。转换为图像比推理需要更长的时间;使其无法使用。
如果我尝试更改 MLModel 规范以使用图像作为输出,我会收到此错误运行预测:
无法将输出身份转换为图像:
NSUnderlyingError=0x2809bad00 {Error Domain=com.apple.CoreML Code=0 "无效的数组形状 (2048, 2048, 3) 用于转换为灰度图像"
即使我为输出颜色指定了RGB :
输出{名称:“身份”类型{图像类型{宽度:2048高度:2048颜色空间:RGB }}}
如果我使用 MultiArray(有效)Xcode 报告:
输出:Float32 1 x 2048 x 2048 x 3 数组
我怀疑问题出在第一个维度,即批号,但没有显示任何维度,所以我无法删除批次维度:
输出 { 名称:“身份”类型 { multiArrayType { 数据类型:FLOAT32 } } }
我认为我不能只向 Keras Conv2D 输出层添加一个输出形状,因为它有多个不同形状的入站节点。以下是输出形状:
>>> print(outputLayer.get_output_shape_at(0))
(None, None, None, 3)
>>> print(outputLayer.get_output_shape_at(1))
(1, 512, 512, 3)
>>> print(outputLayer.get_output_shape_at(2))
(1, 2048, 2048, 3)
>>> print(outputLayer.output)
Tensor("SR/Identity:0", shape=(None, None, None, 3), dtype=float32)
我认为 coremltools 混淆了通道的批次,这就是为什么即使我指定 RGB 也尝试创建灰度图像的原因。
知道如何解决吗?
我有原始的 Keras 模型,但我看不到如何在没有批量维度的情况下指定形状。这里是 Keras 模型层描述的开始和结束
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
LR_input (InputLayer) [(None, None, None, 0
__________________________________________________________________________________________________
Pre_blocks_conv (Conv2D) multiple 896 LR_input[0][0]
__________________________________________________________________________________________________
F_1_1_1 (Conv2D) multiple 9248 Pre_blocks_conv[0][0]
... multiple
... multiple
SR (Conv2D) multiple 84 PixelShuffle[0][0]
==================================================================================================