diff --git a/mindspore/train/summary/_summary_adapter.py b/mindspore/train/summary/_summary_adapter.py index 1cfde39b83..b90704174e 100644 --- a/mindspore/train/summary/_summary_adapter.py +++ b/mindspore/train/summary/_summary_adapter.py @@ -117,19 +117,19 @@ def package_summary_event(data_list, step): summary_value.tag = tag # get the summary type and parse the tag if summary_type == 'Scalar': - summary_value.scalar_value = _get_scalar_summary(tag, data) + if not _fill_scalar_summary(tag, data, summary_value): + del summary.value[-1] elif summary_type == 'Tensor': - summary_tensor = summary_value.tensor - _get_tensor_summary(tag, data, summary_tensor) + _fill_tensor_summary(tag, data, summary_value.tensor) elif summary_type == 'Image': - summary_image = summary_value.image - _get_image_summary(tag, data, summary_image, MS_IMAGE_TENSOR_FORMAT) + if not _fill_image_summary(tag, data, summary_value.image, MS_IMAGE_TENSOR_FORMAT): + del summary.value[-1] elif summary_type == 'Histogram': - summary_histogram = summary_value.histogram - _fill_histogram_summary(tag, data, summary_histogram) + _fill_histogram_summary(tag, data, summary_value.histogram) else: # The data is invalid ,jump the data logger.error("Summary type(%r) is error, tag = %r", summary_type, tag) + del summary.value[-1] return summary_event @@ -173,7 +173,7 @@ def _nptype_to_prototype(np_value): return proto -def _get_scalar_summary(tag: str, np_value): +def _fill_scalar_summary(tag: str, np_value, summary): """ Package the scalar summary. @@ -185,25 +185,20 @@ def _get_scalar_summary(tag: str, np_value): Summary, return scalar summary content. """ logger.debug("Set(%r) the scalar summary value", tag) - if np_value.ndim == 0: + if np_value.size == 1: # is scalar - scalar_value = np_value.item() - elif np_value.ndim == 1: - # Because now GE can't providesumm the real shape info to convert the Tensor - # So consider the dim = 1, shape = (1,) tensor is scalar - scalar_value = np_value[0] - if np_value.shape != (1,): - logger.error("The tensor is not Scalar, tag = %r, Shape = %r", tag, np_value.shape) - else: - np_list = np_value.reshape(-1).tolist() - scalar_value = np_list[0] - logger.error("The value is not Scalar, tag = %r, ndim = %r", tag, np_value.ndim) - - logger.debug("The tag(%r) value is: %r", tag, scalar_value) - return scalar_value - - -def _get_tensor_summary(tag: str, np_value, summary_tensor): + summary.scalar_value = np_value.item() + return True + if np_value.size > 1: + logger.warning("The tensor is not a single scalar, tag = %r, ndim = %r, shape = %r", tag, np_value.ndim, + np_value.shape) + summary.scalar_value = next(np_value.flat).item() + return True + logger.error("There no values inside tensor, tag = %r, size = %r", tag, np_value.size) + return False + + +def _fill_tensor_summary(tag: str, np_value, summary_tensor): """ Package the tensor summary. @@ -287,12 +282,18 @@ def _fill_histogram_summary(tag: str, np_value: np.ndarray, summary) -> None: logger.warning('There are no valid values in the ndarray(size=%d, shape=%d)', total, np_value.shape) # summary.{min, max, sum} are 0s by default, no need to explicitly set else: - summary.min = ma_value.min() - summary.max = ma_value.max() - summary.sum = ma_value.sum() + # BUG: max of a masked array with dtype np.float16 returns inf + # See numpy issue#15077 + if issubclass(np_value.dtype.type, np.floating): + summary.min = ma_value.min(fill_value=np.PINF) + summary.max = ma_value.max(fill_value=np.NINF) + else: + summary.min = ma_value.min() + summary.max = ma_value.max() + summary.sum = ma_value.sum(dtype=np.float64) bins = _calc_histogram_bins(valid) - range_ = summary.min, summary.max - hists, edges = np.histogram(np_value, bins=bins, range=range_) + bins = np.linspace(summary.min, summary.max, bins + 1, dtype=np_value.dtype) + hists, edges = np.histogram(np_value, bins=bins) for hist, edge1, edge2 in zip(hists, edges, edges[1:]): bucket = summary.buckets.add() @@ -301,7 +302,7 @@ def _fill_histogram_summary(tag: str, np_value: np.ndarray, summary) -> None: bucket.left = edge1 -def _get_image_summary(tag: str, np_value, summary_image, input_format='NCHW'): +def _fill_image_summary(tag: str, np_value, summary_image, input_format='NCHW'): """ Package the image summary. @@ -315,8 +316,14 @@ def _get_image_summary(tag: str, np_value, summary_image, input_format='NCHW'): Summary, return image summary content. """ logger.debug("Set(%r) the image summary value", tag) - if np_value.ndim != 4: - logger.error("The value is not Image, tag = %r, ndim = %r", tag, np_value.ndim) + if np_value.ndim != 4 or np_value.shape[1] not in (1, 3): + logger.error("The value is not Image, tag = %r, ndim = %r, shape=%r", tag, np_value.ndim, np_value.shape) + return False + + if np_value.ndim != len(input_format): + logger.error("The tensor with dim(%r) can't convert the format(%r) because dim not same", np_value.ndim, + input_format) + return False # convert the tensor format tensor = _convert_image_format(np_value, input_format) @@ -337,7 +344,7 @@ def _get_image_summary(tag: str, np_value, summary_image, input_format='NCHW'): summary_image.width = width summary_image.colorspace = channel summary_image.encoded_image = image_string - return summary_image + return True def _make_image(tensor, rescale=1): @@ -376,30 +383,21 @@ def _convert_image_format(np_tensor, input_format, out_format='HWC'): Returns: Tensor, return format image. """ - out_tensor = None - if np_tensor.ndim != len(input_format): - logger.error("The tensor with dim(%r) can't convert the format(%r) because dim not same", np_tensor.ndim, - input_format) - return out_tensor - input_format = input_format.upper() - if len(input_format) == 4: - # convert the NCHW - if input_format != 'NCHW': - index = [input_format.find(c) for c in 'NCHW'] - tensor_nchw = np_tensor.transpose(index) - else: - tensor_nchw = np_tensor + # convert the NCHW + if input_format != 'NCHW': + index = [input_format.find(c) for c in 'NCHW'] + tensor_nchw = np_tensor.transpose(index) + else: + tensor_nchw = np_tensor - # make grid to expand N - tensor_chw = _make_canvas_for_imgs(tensor_nchw) + # make grid to expand N + tensor_chw = _make_canvas_for_imgs(tensor_nchw) - # convert to out format - out_index = ['CHW'.find(c) for c in out_format] - out_tensor = tensor_chw.transpose(out_index) - else: - logger.error("Don't support the format(%r) convert", input_format) + # convert to out format + out_index = ['CHW'.find(c) for c in out_format] + out_tensor = tensor_chw.transpose(out_index) return out_tensor @@ -415,15 +413,9 @@ def _make_canvas_for_imgs(tensor, col_imgs=8): Tensor, retrun canvas of image. """ # expand the N1HW to N3HW - out_canvas = None if tensor.shape[1] == 1: tensor = np.concatenate([tensor, tensor, tensor], 1) - # check the tensor format - if tensor.ndim != 4 or tensor.shape[1] != 3: - logger.error("The image tensor with ndim(%r) and shape(%r) is not 'NCHW' format", tensor.ndim, tensor.shape) - return out_canvas - # expand the N n = tensor.shape[0] h = tensor.shape[2]