|
18 | 18 |
|
19 | 19 | import os
|
20 | 20 | import numpy as np
|
21 |
| -from onnx import helper |
| 21 | +from onnx import helper, numpy_helper |
22 | 22 | from onnx import onnx_pb as onnx_proto
|
23 | 23 | from enum import Enum
|
24 | 24 | from pathlib import Path
|
@@ -103,58 +103,24 @@ def split_shared_bias(model):
|
103 | 103 | node.input[2] = new_input_name
|
104 | 104 | return model
|
105 | 105 |
|
106 |
| -def convert_np_to_float16(np_array, min_positive_val=1e-7, max_finite_val=1e4): # pragma: no cover |
| 106 | +def cast_tensor(tensor, dtype): # pragma: no cover |
107 | 107 | '''
|
108 |
| - Convert float32 numpy array to float16 without changing sign or finiteness. |
109 |
| - Positive values less than min_positive_val are mapped to min_positive_val. |
110 |
| - Positive finite values greater than max_finite_val are mapped to max_finite_val. |
111 |
| - Similar for negative values. NaN, 0, inf, and -inf are unchanged. |
112 |
| - ''' |
113 |
| - def between(a, b, c): |
114 |
| - return np.logical_and(a < b, b < c) |
115 |
| - np_array = np.where(between(0, np_array, min_positive_val), min_positive_val, np_array) |
116 |
| - np_array = np.where(between(-min_positive_val, np_array, 0), -min_positive_val, np_array) |
117 |
| - np_array = np.where(between(max_finite_val, np_array, float('inf')), max_finite_val, np_array) |
118 |
| - np_array = np.where(between(float('-inf'), np_array, -max_finite_val), -max_finite_val, np_array) |
119 |
| - return np.float16(np_array) |
120 |
| - |
121 |
| -def _npfloat16_to_int(np_list): |
122 |
| - ''' |
123 |
| - Convert numpy float16 to python int. |
124 |
| - param np_list: numpy float16 list |
125 |
| - return int_list: python int list |
126 |
| - ''' |
127 |
| - return [int(bin(_.view('H'))[2:].zfill(16), 2) for _ in np_list] |
128 |
| - |
129 |
| -def cast_tensor(tensor, dtype, min_positive_val=1e-7, max_finite_val=1e4): # pragma: no cover |
130 |
| - ''' |
131 |
| - Convert tensor float to float16. |
| 108 | + Convert tensor float to target dtype. |
132 | 109 | param tensor: TensorProto object
|
133 |
| - return tensor_float16: converted TensorProto object |
134 |
| - Example: |
135 |
| - from onnxmltools.utils.float16_converter import convert_tensor_float_to_float16 |
136 |
| - new_tensor = convert_tensor_float_to_float16(tensor) |
| 110 | + return tensor_target_dtype: converted TensorProto object |
137 | 111 | '''
|
138 | 112 | if not isinstance(tensor, onnx_proto.TensorProto):
|
139 | 113 | raise ValueError('Expected input type is an ONNX TensorProto but got %s' % type(tensor))
|
140 | 114 |
|
141 | 115 | if tensor.data_type == onnx_proto.TensorProto.FLOAT:
|
142 |
| - tensor.data_type = onnx_proto.TensorProto.FLOAT16 |
143 |
| - # convert float_data (float type) to float16 and write to int32_data |
144 |
| - if tensor.float_data: |
145 |
| - float16_data = convert_np_to_float16(np.array(tensor.float_data), min_positive_val, max_finite_val) |
146 |
| - int_list = _npfloat16_to_int(float16_data) |
147 |
| - tensor.int32_data[:] = int_list |
148 |
| - tensor.float_data[:] = [] |
149 |
| - # convert raw_data (bytes type) |
150 |
| - if tensor.raw_data: |
151 |
| - # convert n.raw_data to float |
152 |
| - float32_list = np.fromstring(tensor.raw_data, dtype='float32') |
153 |
| - # convert float to float16 |
154 |
| - float16_list = convert_np_to_float16(float32_list, min_positive_val, max_finite_val) |
155 |
| - # convert float16 to bytes and write back to raw_data |
156 |
| - tensor.raw_data = float16_list.tostring() |
157 |
| - return tensor |
| 116 | + new_tensor = helper.make_tensor( |
| 117 | + name=tensor.name, |
| 118 | + data_type=dtype_mapping[dtype], |
| 119 | + dims=numpy_helper.to_array(tensor).shape, |
| 120 | + vals=numpy_helper.to_array(tensor) |
| 121 | + ) |
| 122 | + return new_tensor |
| 123 | + return None |
158 | 124 |
|
159 | 125 | def remove_init_from_model_input(model):
|
160 | 126 | inputs = model.model.graph.input
|
|
0 commit comments