def get_tensors_diff(self, tensor_name, shape, tolerance=0): """ Get tensor comparisons data for given name, detail, shape and tolerance. Args: tensor_name (str): The name of tensor for cache. shape (tuple): Specify concrete dimensions of shape. tolerance (str): Specify tolerance of difference between current step tensor and previous step tensor. Default value is 0. Its is a percentage. The boundary value is equal to max(abs(min),abs(max)) * tolerance. The function of min and max is being used to calculate the min value and max value of the result of the current step tensor subtract the previous step tensor. If the absolute value of result is less than or equal to boundary value, the result will set to be zero. Raises: DebuggerParamValueError, If get current step node and previous step node failed or the type of tensor value is not numpy.ndarray." Returns: dict, the retrieved data. """ curr_tensor = self.get_valid_tensor_by_name(tensor_name) prev_tensor = self.get_valid_tensor_by_name(tensor_name, prev=True) if not (curr_tensor and prev_tensor): log.error("Get current step and previous step for this tensor name %s failed.", tensor_name) raise DebuggerParamValueError(f"Get current step and previous step for this tensor name " f"{tensor_name} failed.") curr_tensor_slice = curr_tensor.get_tensor_value_by_shape(shape) prev_tensor_slice = prev_tensor.get_tensor_value_by_shape(shape) # get tensor comparison basic info tensor_info = curr_tensor.get_basic_info() tensor_info.pop('has_prev_step') tensor_info.pop('value') # calculate tensor comparision object tensor_comparison = curr_tensor.tensor_comparison if not tensor_comparison or tensor_comparison.tolerance != tolerance: if curr_tensor.value.shape != prev_tensor.value.shape: raise DebuggerParamValueError("The shape of these two step tensors is not the same.") tensor_diff = TensorUtils.calc_diff_between_two_tensor(curr_tensor.value, prev_tensor.value, tolerance) stats = TensorUtils.get_statistics_from_tensor(tensor_diff) tensor_comparison = TensorComparison(tolerance, stats, tensor_diff) curr_tensor.update_tensor_comparisons(tensor_comparison) # calculate diff value # the type of curr_tensor_slice is one of np.ndarray or str if isinstance(curr_tensor_slice, np.ndarray) and isinstance(prev_tensor_slice, np.ndarray): if not shape: tensor_diff_slice = tensor_comparison.value else: tensor_diff_slice = tensor_comparison.value[shape] result = np.stack([prev_tensor_slice, curr_tensor_slice, tensor_diff_slice], axis=-1) tensor_info['diff'] = result.tolist() elif isinstance(curr_tensor_slice, str): tensor_info['diff'] = curr_tensor_slice # add comparision statistics tensor_info.update(self._get_comparison_statistics(curr_tensor, prev_tensor)) reply = {'tensor_value': tensor_info} return reply
def get_tensors_diff(self, tensor_name, shape, tolerance=0): """ Get tensor comparisons data for given name, detail, shape and tolerance. Args: tensor_name (str): The name of tensor for cache. shape (tuple): Specify concrete dimensions of shape. tolerance (str): Specify tolerance of difference between current step tensor and previous step tensor. Default value is 0. Its is a percentage. The boundary value is equal to max(abs(min),abs(max)) * tolerance. The function of min and max is being used to calculate the min value and max value of the result of the current step tensor subtract the previous step tensor. If the absolute value of result is less than or equal to boundary value, the result will set to be zero. Raises: DebuggerParamValueError, If get current step node and previous step node failed. Returns: dict, the retrieved data. """ curr_tensor = self.get_tensor_value_by_name(tensor_name) prev_tensor = self.get_tensor_value_by_name(tensor_name, prev=True) if not (curr_tensor and prev_tensor): log.error( "Get current step and previous step for this tensor name %s failed.", tensor_name) raise DebuggerParamValueError( f"Get current step and previous step for this tensor name " f"{tensor_name} failed.") curr_tensor_slice = curr_tensor.get_tensor_value_by_shape(shape) prev_tensor_slice = prev_tensor.get_tensor_value_by_shape(shape) tensor_info = curr_tensor.get_basic_info() if isinstance(tensor_info, dict): del tensor_info['has_prev_step'] del tensor_info['value'] # the type of curr_tensor_slice is one of None, np.ndarray or str if isinstance(curr_tensor_slice, np.ndarray) and isinstance( prev_tensor_slice, np.ndarray): diff_tensor = TensorUtils.calc_diff_between_two_tensor( curr_tensor_slice, prev_tensor_slice, tolerance) result = np.stack( [prev_tensor_slice, curr_tensor_slice, diff_tensor], axis=-1) tensor_info['diff'] = result.tolist() stats = TensorUtils.get_statistics_from_tensor(diff_tensor) tensor_info['statistics'] = TensorUtils.get_statistics_dict(stats) elif isinstance(curr_tensor_slice, str): tensor_info['diff'] = curr_tensor_slice reply = {'tensor_value': tensor_info} return reply