Model Input and Output Types#
When using the Core ML Tools Unified Conversion API, you can specify various properties for the model inputs and outputs using the inputs
and outputs
parameters for convert()
. The following summarizes the key options.
Use the Default Behavior#
The convert()
method generates by default a Core ML model with a multidimensional array (MLMultiArray
) as the type for both input and output. The data types, names, and shapes are picked up automatically from a TensorFlow source model. For a PyTorch model you must provide the input shape.
In Core ML Tools 7.0 and newer versions, the default input/output dtype for models converted to the mlprogram
type are float 16 for the iOS16
/macOS13
and newer deployment targets. Also, the convert()
method produces an mlprogram
(ML program) by default with an iOS15
/macOS12
or newer deployment target. For more details, see Convert Models to ML Programs.
Use Images#
To produce a Core ML model with images for input and output, use the ImageType
class to specify the inputs
and outputs
parameters for convert()
. For details and examples, see Image Input and Output.
Provide the Shape of the Input#
To convert PyTorch models, you must provide the input shape using the shape
parameter with TensorType
or ImageType
, since the PyTorch traced program does not contain the shape information.
For TensorFlow models, the shape is automatically picked up from the model. However, it is good practice to provide at least a static shape, which enables the converter to apply graph optimizations and produce a more efficient model. For variable input shapes use EnumeratedShapes
. For details and an example, see Select from Predetermined Shapes.
Set the dtype#
Use the dtype
parameter with TensorType
to override data types (such as float 32, float 16, and integer). The dtype
parameter can take either a NumPy dtype
(such as np.float32
and np.int32
) or an MIL type with TensorType
(such as coremltools.converters.mil.mil.types.fp32
).
Starting in coremltools version 6, you can use the np.float16
type with ML programs, which can reduce the overhead of input and output type conversions for float16
typed models (which is the default precision for ML programs). For more information, see ML Programs.
For example, the following code snippet converts the source_model
to a Core ML model with float 16 multiarray (TensorType
) input and output:
# to produce a model with float 16 input and output of type multiarray
mlmodel = ct.convert(
source_model,
inputs=[ct.TensorType(shape=input.shape, dtype=np.float16)],
outputs=[ct.TensorType(dtype=np.float16)],
minimum_deployment_target=ct.target.iOS16,
)
Set Names for PyTorch Conversion#
For PyTorch model conversion, use name
with TensorType
to set the input and output names of the converted model. For example, the following code snippet will produce a Core ML model with inputs
named my_input_name
and outputs
named my_output_name
:
mlmodel = ct.convert(
source_torch_model,
inputs=[ct.TensorType(shape=input.shape, name="my_input_name")],
outputs=[ct.TensorType(name="my_output_name")],
minimum_deployment_target=ct.target.iOS16,
)
For TensorFlow conversions, the names are picked up automatically from the TF graph. Unlike PyTorch models in which the inputs and outputs are ordered, with TensorFlow models you can’t provide your own names, because in the TF graph the input and output tensors are referred to by the names. After converting the model, you can change the names of the inputs and outputs using the rename_feature()
method. For an example, see Rename a Feature.