from tensorflow.python.util import compat
+def AppendFloat16ArrayToTensorProto(
+ # For numpy, npy_half is a typedef for npy_uint16,
+ # see: https://github.com/numpy/numpy/blob/master/doc/source/reference/c-api.coremath.rst#half-precision-functions
+ # Because np.float16_t dosen't exist in cython, we use uint16_t here.
+ # TODO: Use np.float16_t when cython supports it.
+ tensor_proto, np.ndarray[np.uint16_t, ndim=1] nparray):
+ cdef long i, n
+ n = nparray.size
+ for i in range(n):
+ tensor_proto.half_val.append(nparray[i])
+
+
def AppendFloat32ArrayToTensorProto(
tensor_proto, np.ndarray[np.float32_t, ndim=1] nparray):
cdef long i, n
[ExtractBitsFromFloat16(x) for x in proto_values])
+def _MediumAppendFloat16ArrayToTensorProto(tensor_proto, proto_values):
+ # TODO: Remove the conversion if cython supports np.float16_t
+ fast_tensor_util.AppendFloat16ArrayToTensorProto(
+ tensor_proto,
+ np.asarray(proto_values, dtype=np.float16).view(np.uint16))
+
+
def ExtractBitsFromBFloat16(x):
return np.asscalar(
np.asarray(x, dtype=dtypes.bfloat16.as_numpy_dtype).view(np.uint16))
_NP_TO_APPEND_FN = {
dtypes.bfloat16.as_numpy_dtype:
SlowAppendBFloat16ArrayToTensorProto,
- # TODO(sesse): We should have a
- # fast_tensor_util.AppendFloat16ArrayToTensorProto,
- # but it seems np.float16_t doesn't exist?
np.float16:
- SlowAppendFloat16ArrayToTensorProto,
+ _MediumAppendFloat16ArrayToTensorProto,
np.float32:
fast_tensor_util.AppendFloat32ArrayToTensorProto,
np.float64: