1

我使用 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]               
==================================================================================================
4

1 回答 1

1

在 Core ML 中,尺寸的顺序是(通道、高度、宽度),因此它期望看到 3 x 2048 x 2048 的输出,而不是 2048 x 2048 x 3。

请注意,您还需要确保输出像素在 [0, 255] 范围内,而不是 [0, 1] 范围内,这可能是您的 Keras 模型给您的。

于 2020-07-21T09:17:18.903 回答