diff options
author | A. Unique TensorFlower <gardener@tensorflow.org> | 2018-09-24 20:39:41 -0700 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2018-09-24 20:43:58 -0700 |
commit | 626fef2af7d4bc49aeeef7ffd195dc30235bcd1e (patch) | |
tree | f81c1a5b95696897957619b5635537c73942b8fe /tensorflow/contrib/lite/kernels | |
parent | 6ba60e051409a5346c2aab21160c9c311de1cb03 (diff) |
Update kernel evals to use new kernel signatures.
PiperOrigin-RevId: 214377809
Diffstat (limited to 'tensorflow/contrib/lite/kernels')
5 files changed, 165 insertions, 86 deletions
diff --git a/tensorflow/contrib/lite/kernels/conv.cc b/tensorflow/contrib/lite/kernels/conv.cc index ab6bdaecaa..101b4fc961 100644 --- a/tensorflow/contrib/lite/kernels/conv.cc +++ b/tensorflow/contrib/lite/kernels/conv.cc @@ -414,35 +414,57 @@ void EvalQuantized(TfLiteContext* context, TfLiteNode* node, } switch (effective_kernel_type) { - case kReference: + case kReference: { + ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = data->padding.width; + op_params.padding_values.height = data->padding.height; + op_params.stride_width = params->stride_width; + op_params.stride_height = params->stride_height; + op_params.dilation_width_factor = params->dilation_width_factor; + op_params.dilation_height_factor = params->dilation_height_factor; + op_params.input_offset = input_offset; + op_params.weights_offset = filter_offset; + op_params.output_offset = output_offset; + op_params.output_multiplier = data->output_multiplier; + op_params.output_shift = -data->output_shift; + op_params.quantized_activation_min = data->output_activation_min; + op_params.quantized_activation_max = data->output_activation_max; reference_ops::Conv( - GetTensorData<uint8_t>(input), GetTensorDims(input), input_offset, - GetTensorData<uint8_t>(filter), GetTensorDims(filter), filter_offset, - GetTensorData<int32_t>(bias), GetTensorDims(bias), - params->stride_width, params->stride_height, - params->dilation_width_factor, params->dilation_height_factor, - data->padding.width, data->padding.height, output_offset, - data->output_multiplier, data->output_shift, - data->output_activation_min, data->output_activation_max, - GetTensorData<uint8_t>(output), GetTensorDims(output), - GetTensorData<uint8_t>(im2col), GetTensorDims(im2col), gemm_context); + op_params, GetTensorShape(input), GetTensorData<uint8_t>(input), + GetTensorShape(filter), GetTensorData<uint8_t>(filter), + GetTensorShape(bias), GetTensorData<int32_t>(bias), + GetTensorShape(output), GetTensorData<uint8_t>(output), + GetTensorShape(im2col), GetTensorData<uint8_t>(im2col), gemm_context); break; + } case kGenericOptimized: case kMultithreadOptimized: - case kCblasOptimized: + case kCblasOptimized: { // There is only one optimized implementation for Quantized Conv. + ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = data->padding.width; + op_params.padding_values.height = data->padding.height; + op_params.stride_width = params->stride_width; + op_params.stride_height = params->stride_height; + op_params.dilation_width_factor = params->dilation_width_factor; + op_params.dilation_height_factor = params->dilation_height_factor; + op_params.input_offset = input_offset; + op_params.weights_offset = filter_offset; + op_params.output_offset = output_offset; + op_params.output_multiplier = data->output_multiplier; + op_params.output_shift = -data->output_shift; + op_params.quantized_activation_min = data->output_activation_min; + op_params.quantized_activation_max = data->output_activation_max; optimized_ops::Conv( - GetTensorData<uint8_t>(input), GetTensorDims(input), input_offset, - GetTensorData<uint8_t>(filter), GetTensorDims(filter), filter_offset, - GetTensorData<int32_t>(bias), GetTensorDims(bias), - params->stride_width, params->stride_height, - params->dilation_width_factor, params->dilation_height_factor, - data->padding.width, data->padding.height, output_offset, - data->output_multiplier, data->output_shift, - data->output_activation_min, data->output_activation_max, - GetTensorData<uint8_t>(output), GetTensorDims(output), - GetTensorData<uint8_t>(im2col), GetTensorDims(im2col), gemm_context); + op_params, GetTensorShape(input), GetTensorData<uint8_t>(input), + GetTensorShape(filter), GetTensorData<uint8_t>(filter), + GetTensorShape(bias), GetTensorData<int32_t>(bias), + GetTensorShape(output), GetTensorData<uint8_t>(output), + GetTensorShape(im2col), GetTensorData<uint8_t>(im2col), gemm_context); break; + } } } @@ -467,27 +489,41 @@ void EvalFloat(TfLiteContext* context, TfLiteNode* node, } switch (effective_kernel_type) { case kReference: { - reference_ops::Conv( - GetTensorData<float>(input), GetTensorDims(input), - GetTensorData<float>(filter), GetTensorDims(filter), - GetTensorData<float>(bias), GetTensorDims(bias), params->stride_width, - params->stride_height, params->dilation_width_factor, - params->dilation_height_factor, data->padding.width, - data->padding.height, output_activation_min, output_activation_max, - GetTensorData<float>(output), GetTensorDims(output), - GetTensorData<float>(im2col), GetTensorDims(im2col)); + ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = data->padding.width; + op_params.padding_values.height = data->padding.height; + op_params.stride_width = params->stride_width; + op_params.stride_height = params->stride_height; + op_params.dilation_width_factor = params->dilation_width_factor; + op_params.dilation_height_factor = params->dilation_height_factor; + op_params.float_activation_min = output_activation_min; + op_params.float_activation_max = output_activation_max; + reference_ops::Conv(op_params, GetTensorShape(input), + GetTensorData<float>(input), GetTensorShape(filter), + GetTensorData<float>(filter), GetTensorShape(bias), + GetTensorData<float>(bias), GetTensorShape(output), + GetTensorData<float>(output), GetTensorShape(im2col), + GetTensorData<float>(im2col)); break; } case kGenericOptimized: { - optimized_ops::Conv( - GetTensorData<float>(input), GetTensorDims(input), - GetTensorData<float>(filter), GetTensorDims(filter), - GetTensorData<float>(bias), GetTensorDims(bias), params->stride_width, - params->stride_height, params->dilation_width_factor, - params->dilation_height_factor, data->padding.width, - data->padding.height, output_activation_min, output_activation_max, - GetTensorData<float>(output), GetTensorDims(output), - GetTensorData<float>(im2col), GetTensorDims(im2col)); + ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = data->padding.width; + op_params.padding_values.height = data->padding.height; + op_params.stride_width = params->stride_width; + op_params.stride_height = params->stride_height; + op_params.dilation_width_factor = params->dilation_width_factor; + op_params.dilation_height_factor = params->dilation_height_factor; + op_params.float_activation_min = output_activation_min; + op_params.float_activation_max = output_activation_max; + optimized_ops::Conv(op_params, GetTensorShape(input), + GetTensorData<float>(input), GetTensorShape(filter), + GetTensorData<float>(filter), GetTensorShape(bias), + GetTensorData<float>(bias), GetTensorShape(output), + GetTensorData<float>(output), GetTensorShape(im2col), + GetTensorData<float>(im2col)); break; } case kMultithreadOptimized: { @@ -561,18 +597,27 @@ void EvalHybrid(TfLiteContext* context, TfLiteNode* node, case kReference: case kGenericOptimized: case kMultithreadOptimized: - case kCblasOptimized: + case kCblasOptimized: { // There is only one implementation for hybrid kernel. Note // this does not make use of gemmlowp nor supports multithreading. + ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = data->padding.width; + op_params.padding_values.height = data->padding.height; + op_params.stride_width = params->stride_width; + op_params.stride_height = params->stride_height; + op_params.dilation_width_factor = 1; + op_params.dilation_height_factor = 1; + op_params.float_activation_min = output_activation_min; + op_params.float_activation_max = output_activation_max; optimized_ops::HybridConv( - quantized_input_ptr_batch, GetTensorDims(input), filter_ptr, - GetTensorDims(filter), GetTensorData<float>(bias), - GetTensorDims(bias), params->stride_width, params->stride_height, - data->padding.width, data->padding.height, scaling_factors_ptr, - output_activation_min, output_activation_max, - GetTensorData<float>(output), GetTensorDims(output), im2col_ptr, - GetTensorDims(im2col)); + op_params, scaling_factors_ptr, GetTensorShape(input), + quantized_input_ptr_batch, GetTensorShape(filter), filter_ptr, + GetTensorShape(bias), GetTensorData<float>(bias), + GetTensorShape(output), GetTensorData<float>(output), + GetTensorShape(im2col), im2col_ptr); break; + } } } diff --git a/tensorflow/contrib/lite/kernels/fully_connected.cc b/tensorflow/contrib/lite/kernels/fully_connected.cc index 7a71fcc219..f6d2f76dbe 100644 --- a/tensorflow/contrib/lite/kernels/fully_connected.cc +++ b/tensorflow/contrib/lite/kernels/fully_connected.cc @@ -281,15 +281,23 @@ TfLiteStatus EvalQuantized(TfLiteContext* context, TfLiteNode* node, int32_t input_offset = -input->params.zero_point; int32_t filter_offset = -filter->params.zero_point; int32_t output_offset = output->params.zero_point; -#define TF_LITE_FULLY_CONNECTED(type, output_data_type) \ - type::FullyConnected( \ - GetTensorData<uint8_t>(input), GetTensorDims(input), input_offset, \ - GetTensorData<uint8_t>(filter), GetTensorDims(filter), filter_offset, \ - GetTensorData<int32_t>(bias), GetTensorDims(bias), output_offset, \ - data->output_multiplier, data->output_shift, \ - data->output_activation_min, data->output_activation_max, \ - GetTensorData<output_data_type>(output), GetTensorDims(output), \ - gemm_context) +#define TF_LITE_FULLY_CONNECTED(type, output_data_type) \ + { \ + FullyConnectedParams op_params; \ + op_params.input_offset = input_offset; \ + op_params.weights_offset = filter_offset; \ + op_params.output_offset = output_offset; \ + op_params.output_multiplier = data->output_multiplier; \ + op_params.output_shift = -data->output_shift; \ + op_params.quantized_activation_min = data->output_activation_min; \ + op_params.quantized_activation_max = data->output_activation_max; \ + type::FullyConnected( \ + op_params, GetTensorShape(input), GetTensorData<uint8_t>(input), \ + GetTensorShape(filter), GetTensorData<uint8_t>(filter), \ + GetTensorShape(bias), GetTensorData<int32_t>(bias), \ + GetTensorShape(output), GetTensorData<output_data_type>(output), \ + gemm_context); \ + } if (kernel_type == kReference) { switch (output->type) { case kTfLiteUInt8: @@ -349,15 +357,20 @@ TfLiteStatus EvalShuffledQuantized(TfLiteContext* context, TfLiteNode* node, return kTfLiteError; } -#define TF_LITE_SHUFFLED_FULLY_CONNECTED(type) \ - type::ShuffledFullyConnected( \ - GetTensorData<uint8_t>(input), GetTensorDims(input), \ - GetTensorData<uint8_t>(filter), GetTensorDims(filter), \ - GetTensorData<int32_t>(bias), GetTensorDims(bias), \ - data->output_multiplier, data->output_shift, \ - data->output_activation_min, data->output_activation_max, \ - GetTensorData<int16_t>(output), GetTensorDims(output), \ - GetTensorData<uint8_t>(shuffled_input_workspace), gemm_context) +#define TF_LITE_SHUFFLED_FULLY_CONNECTED(type) \ + { \ + FullyConnectedParams op_params; \ + op_params.output_multiplier = data->output_multiplier; \ + op_params.output_shift = -data->output_shift; \ + op_params.quantized_activation_min = data->output_activation_min; \ + op_params.quantized_activation_max = data->output_activation_max; \ + type::ShuffledFullyConnected( \ + op_params, GetTensorShape(input), GetTensorData<uint8_t>(input), \ + GetTensorShape(filter), GetTensorData<uint8_t>(filter), \ + GetTensorShape(bias), GetTensorData<int32_t>(bias), \ + GetTensorShape(output), GetTensorData<int16_t>(output), \ + GetTensorData<uint8_t>(shuffled_input_workspace), gemm_context); \ + } if (kernel_type == kReference) { TF_LITE_SHUFFLED_FULLY_CONNECTED(reference_ops); } else { @@ -376,12 +389,17 @@ TfLiteStatus EvalFloat(TfLiteContext* context, TfLiteNode* node, float output_activation_min, output_activation_max; CalculateActivationRange(params->activation, &output_activation_min, &output_activation_max); -#define TF_LITE_FULLY_CONNECTED(type) \ - type::FullyConnected(GetTensorData<float>(input), GetTensorDims(input), \ - GetTensorData<float>(filter), GetTensorDims(filter), \ - GetTensorData<float>(bias), GetTensorDims(bias), \ - output_activation_min, output_activation_max, \ - GetTensorData<float>(output), GetTensorDims(output)) +#define TF_LITE_FULLY_CONNECTED(type) \ + { \ + FullyConnectedParams op_params; \ + op_params.float_activation_min = output_activation_min; \ + op_params.float_activation_max = output_activation_max; \ + type::FullyConnected(op_params, GetTensorShape(input), \ + GetTensorData<float>(input), GetTensorShape(filter), \ + GetTensorData<float>(filter), GetTensorShape(bias), \ + GetTensorData<float>(bias), GetTensorShape(output), \ + GetTensorData<float>(output)); \ + } if (kernel_type == kReference) { TF_LITE_FULLY_CONNECTED(reference_ops); } else if (kernel_type == kPie) { diff --git a/tensorflow/contrib/lite/kernels/internal/optimized/cblas_conv.h b/tensorflow/contrib/lite/kernels/internal/optimized/cblas_conv.h index 4a90e7e640..40d42bbae9 100644 --- a/tensorflow/contrib/lite/kernels/internal/optimized/cblas_conv.h +++ b/tensorflow/contrib/lite/kernels/internal/optimized/cblas_conv.h @@ -49,9 +49,18 @@ inline void Conv(const float* input_data, const Dims<4>& input_dims, filter_width != 1 || filter_height != 1; if (need_im2col) { TFLITE_DCHECK(im2col_data); - optimized_ops::Im2col(input_data, input_dims, stride_width, stride_height, - pad_width, pad_height, filter_height, filter_width, 0, - im2col_data, im2col_dims); + ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = pad_width; + op_params.padding_values.height = pad_height; + op_params.stride_width = stride_width; + op_params.stride_height = stride_height; + op_params.dilation_width_factor = 1; + op_params.dilation_height_factor = 1; + optimized_ops::Im2col(op_params, filter_height, filter_width, 0, + DimsToShape(input_dims), input_data, + DimsToShape(im2col_dims), im2col_data); + gemm_input_data = im2col_data; gemm_input_dims = &im2col_dims; } else { @@ -82,8 +91,8 @@ inline void Conv(const float* input_data, const Dims<4>& input_dims, stride_a, b, stride_b, 0.0f, c, stride_c); optimized_ops::AddBiasAndEvalActivationFunction( - bias_data, bias_dims, output_data, output_dims, output_activation_min, - output_activation_max); + output_activation_min, output_activation_max, DimsToShape(bias_dims), + bias_data, DimsToShape(output_dims), output_data); } } // namespace cblas_ops diff --git a/tensorflow/contrib/lite/kernels/internal/optimized/multithreaded_conv.h b/tensorflow/contrib/lite/kernels/internal/optimized/multithreaded_conv.h index 59f0e3c927..b5d001cc9e 100644 --- a/tensorflow/contrib/lite/kernels/internal/optimized/multithreaded_conv.h +++ b/tensorflow/contrib/lite/kernels/internal/optimized/multithreaded_conv.h @@ -157,8 +157,8 @@ inline void Conv(const Eigen::ThreadPoolDevice& device, const float* input_data, output_width); optimized_ops::AddBiasAndEvalActivationFunction( - bias_data, bias_dims, output_data, output_dims, output_activation_min, - output_activation_max); + output_activation_min, output_activation_max, DimsToShape(bias_dims), + bias_data, DimsToShape(output_dims), output_data); } } // namespace multithreaded_ops diff --git a/tensorflow/contrib/lite/kernels/transpose_conv.cc b/tensorflow/contrib/lite/kernels/transpose_conv.cc index 6f2d98ede8..1c4a5ee91d 100644 --- a/tensorflow/contrib/lite/kernels/transpose_conv.cc +++ b/tensorflow/contrib/lite/kernels/transpose_conv.cc @@ -69,7 +69,7 @@ TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node) { TF_LITE_ENSURE_EQ(context, NumDimensions(input), 4); TF_LITE_ENSURE_EQ(context, NumDimensions(weights), 4); - // Currenlty only supports float32. + // Currently only supports float32. const TfLiteType data_type = input->type; TF_LITE_ENSURE(context, data_type == kTfLiteFloat32); TF_LITE_ENSURE_EQ(context, output->type, data_type); @@ -117,19 +117,26 @@ TfLiteStatus Eval(TfLiteContext* context, TfLiteNode* node) { // Currently only support float32. switch (input->type) { - case kTfLiteFloat32: + case kTfLiteFloat32: { + tflite::ConvParams op_params; + op_params.padding_type = PaddingType::kSame; + op_params.padding_values.width = padding_size.width; + op_params.padding_values.height = padding_size.height; + op_params.stride_width = stride_width; + op_params.stride_height = stride_height; + reference_ops::TransposeConv( - GetTensorData<float>(input), GetTensorDims(input), - GetTensorData<float>(weights), GetTensorDims(weights), stride_width, - stride_height, padding_size.width, padding_size.height, - GetTensorData<float>(output), GetTensorDims(output), + op_params, GetTensorShape(input), GetTensorData<float>(input), + GetTensorShape(weights), GetTensorData<float>(weights), + GetTensorShape(output), GetTensorData<float>(output), // Last two args specify im2col which reference_ops ignores. // (Note this does not lead to a performance regression, as the // previous optimized version was just a copy of the reference code.) // TODO(b/110208176): Allocate im2col tensors and switch to // optimized_ops. - GetTensorData<float>(output), GetTensorDims(output)); + GetTensorShape(output), GetTensorData<float>(output)); break; + } default: context->ReportError(context, "Type %d, not currently supported.", input->type); |