Skip to content

Commit

Permalink
[phi] transfer accuracy op and pass the unittests (#39982)
Browse files Browse the repository at this point in the history
* transfer accuracy op and pass the ci

* remove header file

* fix code

* fix code

* fix

* fix
  • Loading branch information
2742195759 authored Mar 8, 2022
1 parent 3c536f2 commit 13f2b1e
Show file tree
Hide file tree
Showing 9 changed files with 228 additions and 193 deletions.
9 changes: 3 additions & 6 deletions paddle/fluid/operators/metrics/accuracy_op.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

#include "paddle/fluid/operators/metrics/accuracy_op.h"
#include "paddle/fluid/framework/op_registry.h"

namespace paddle {
namespace operators {
Expand Down Expand Up @@ -123,13 +123,10 @@ with the input Out(Inference).
} // namespace operators
} // namespace paddle

// FIXME(typhoonzero): types of T is for infernece data.
// label data is always int.
namespace ops = paddle::operators;
REGISTER_OPERATOR(
accuracy, ops::AccuracyOp, ops::AccuracyOpMaker,
paddle::framework::EmptyGradOpMaker<paddle::framework::OpDesc>,
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>);
// FIXME(typhoonzero): types of T is for infernece data.
// label data is always int.
REGISTER_OP_CPU_KERNEL(accuracy,
ops::AccuracyKernel<paddle::platform::CPUPlace, float>,
ops::AccuracyKernel<paddle::platform::CPUPlace, double>);
110 changes: 0 additions & 110 deletions paddle/fluid/operators/metrics/accuracy_op.cu

This file was deleted.

74 changes: 0 additions & 74 deletions paddle/fluid/operators/metrics/accuracy_op.h

This file was deleted.

3 changes: 2 additions & 1 deletion paddle/fluid/operators/metrics/accuracy_op_mlu.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. */

#include "paddle/fluid/operators/metrics/accuracy_op.h"
#include "paddle/fluid/framework/op_registry.h"
#include "paddle/fluid/framework/tensor.h"
#include "paddle/fluid/operators/mlu/mlu_baseop.h"

namespace paddle {
Expand Down
2 changes: 1 addition & 1 deletion paddle/fluid/operators/metrics/accuracy_op_npu.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ limitations under the License. */
#include <string>

#include "paddle/fluid/framework/op_registry.h"
#include "paddle/fluid/operators/metrics/accuracy_op.h"
#include "paddle/fluid/framework/tensor.h"
#include "paddle/fluid/platform/device/npu/npu_op_runner.h"

namespace paddle {
Expand Down
4 changes: 3 additions & 1 deletion paddle/fluid/operators/metrics/accuracy_op_xpu.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ limitations under the License. */

#ifdef PADDLE_WITH_XPU

#include "paddle/fluid/operators/metrics/accuracy_op.h"
#include "paddle/fluid/framework/op_registry.h"
#include "paddle/fluid/framework/tensor.h"
#include "paddle/fluid/platform/device/xpu/xpu_header.h"

namespace paddle {
namespace operators {

using Tensor = paddle::framework::Tensor;
template <typename DeviceContext, typename T>
class AccuracyXPUKernel : public framework::OpKernel<T> {
public:
Expand Down
30 changes: 30 additions & 0 deletions paddle/phi/kernels/accuracy_kernel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include "paddle/phi/core/dense_tensor.h"

namespace phi {

template <typename T, typename Context>
void AccuracyRawKernel(const Context& dev_ctx,
const DenseTensor& out,
const DenseTensor& indices,
const DenseTensor& label,
DenseTensor* accuracy,
DenseTensor* correct,
DenseTensor* total);
} // namespace phi
72 changes: 72 additions & 0 deletions paddle/phi/kernels/cpu/accuracy_kernel.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "paddle/phi/kernels/accuracy_kernel.h"

#include <algorithm>
#include "paddle/phi/backends/cpu/cpu_context.h"
#include "paddle/phi/core/kernel_registry.h"

namespace phi {
template <typename T, typename Context>
void AccuracyRawKernel(const Context& dev_ctx,
const DenseTensor& inference,
const DenseTensor& indices,
const DenseTensor& label,
DenseTensor* accuracy,
DenseTensor* correct,
DenseTensor* total) {
int* correct_data = dev_ctx.template Alloc<int>(correct);
int* total_data = dev_ctx.template Alloc<int>(total);
float* accuracy_data = dev_ctx.template Alloc<float>(accuracy);

const int64_t* indices_data = indices.data<int64_t>();
const int64_t* label_data = label.data<int64_t>();

size_t num_samples = inference.dims()[0];
size_t class_dim = inference.dims()[1];
*accuracy_data = 0.0f;

if (num_samples == 0) {
return;
}

int num_correct = 0;
// assume inference is already the topk of the output
for (size_t i = 0; i < num_samples; ++i) {
PADDLE_ENFORCE_GE(
label_data[i],
0,
phi::errors::InvalidArgument(
"label of AccuracyOp must >= 0, But received label[%d] is %d",
i,
label_data[i]));
for (size_t j = 0; j < class_dim; ++j) {
if (indices_data[i * class_dim + j] == label_data[i]) {
++num_correct;
break;
}
}
}

*correct_data = num_correct;
*total_data = num_samples;
*accuracy_data =
static_cast<float>(num_correct) / static_cast<float>(num_samples);
}
} // namespace phi

// TODO(add supported dtype.)
PD_REGISTER_KERNEL(
accuracy, CPU, ALL_LAYOUT, phi::AccuracyRawKernel, float, double) {}
Loading

0 comments on commit 13f2b1e

Please sign in to comment.