在Windows上将tensorflow模型转换为coreml模型会产生问题

时间:2018-10-29 09:58:55

标签: ios tensorflow coreml coremltools

我在转换自定义tf模型时遇到问题。 该模型如下所示: tensorflow model

,转换后(没有错误)看起来像这样:

coreml model

加法运算符在哪里?

另一个问题是转换的输出给了我这个

Core ML input(s):
[name: "x_placeholder__0"
type {
  multiArrayType {
    shape: 41
    dataType: DOUBLE
  }
}
]
Core ML output(s):
[name: "softmax_prediction__0"
type {
  multiArrayType {
    shape: 2
    dataType: DOUBLE
  }
}
]

但是我的模型只有浮点值? (转换实际上将其从float32更改为float64)

有人可以回答我的问题,也许告诉我我做错了吗?

Thx

1 个答案:

答案 0 :(得分:1)

后跟加号的MatMul与innerProduct运算符相同。

请注意,innerProduct层具有“偏差”。如果查看这些偏差值,就会发现它们与“添加”运算符中使用的值相同。因此coremltools / tf-coreml只需将这两个操作合并到一个层中即可。

MLMultiArray对象的默认数据类型为DOUBLE。您可以将其更改为FLOAT,但不一定会更快。在Python中执行以下操作的方法如下:

import coremltools  
import sys  

def update_multiarray_to_float32(feature):  
    if feature.type.HasField('multiArrayType'):  
        import coremltools.proto.FeatureTypes_pb2 as _ft  
        feature.type.multiArrayType.dataType = _ft.ArrayFeatureType.FLOAT32  

if __name__ == "__main__":  
    if len(sys.argv) != 3:  
        print "USAGE: %s <input_model_path> <output_model_path>" % sys.argv[0]  
        sys.exit(1)  

    input_model_path = sys.argv[1]  
    output_model_path = sys.argv[2]  

    spec = coremltools.utils.load_spec(input_model_path)  

    for input_feature in spec.description.input:  
        update_multiarray_to_float32(input_feature)  

    for output_feature in spec.description.output:  
        update_multiarray_to_float32(output_feature)  

    coremltools.utils.save_spec(spec, output_model_path)  

脚本由友好的Apple员工提供(请参见https://forums.developer.apple.com/thread/84401)。