aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/contrib/lite/kernels
diff options
context:
space:
mode:
authorGravatar A. Unique TensorFlower <gardener@tensorflow.org>2018-09-24 20:39:41 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-09-24 20:43:58 -0700
commit626fef2af7d4bc49aeeef7ffd195dc30235bcd1e (patch)
treef81c1a5b95696897957619b5635537c73942b8fe /tensorflow/contrib/lite/kernels
parent6ba60e051409a5346c2aab21160c9c311de1cb03 (diff)
Update kernel evals to use new kernel signatures.
PiperOrigin-RevId: 214377809
Diffstat (limited to 'tensorflow/contrib/lite/kernels')
-rw-r--r--tensorflow/contrib/lite/kernels/conv.cc141
-rw-r--r--tensorflow/contrib/lite/kernels/fully_connected.cc66
-rw-r--r--tensorflow/contrib/lite/kernels/internal/optimized/cblas_conv.h19
-rw-r--r--tensorflow/contrib/lite/kernels/internal/optimized/multithreaded_conv.h4
-rw-r--r--tensorflow/contrib/lite/kernels/transpose_conv.cc21
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);