Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
199b0c7c
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
199b0c7c
编写于
8月 24, 2020
作者:
J
Jack Zhou
提交者:
GitHub
8月 24, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add isfinite v2 op (#26344)
add the isnan, isfinite, isinf api for the paddle 2.0
上级
33cffdf3
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
588 addition
and
18 deletion
+588
-18
paddle/fluid/framework/tensor_util.cc
paddle/fluid/framework/tensor_util.cc
+104
-10
paddle/fluid/framework/tensor_util.h
paddle/fluid/framework/tensor_util.h
+7
-0
paddle/fluid/operators/isfinite_v2_op.cc
paddle/fluid/operators/isfinite_v2_op.cc
+122
-0
paddle/fluid/operators/isfinite_v2_op.cu
paddle/fluid/operators/isfinite_v2_op.cu
+36
-0
paddle/fluid/operators/isfinite_v2_op.h
paddle/fluid/operators/isfinite_v2_op.h
+47
-0
paddle/fluid/operators/nll_loss_op.cc
paddle/fluid/operators/nll_loss_op.cc
+2
-2
paddle/fluid/operators/nll_loss_op.h
paddle/fluid/operators/nll_loss_op.h
+2
-2
python/paddle/__init__.py
python/paddle/__init__.py
+4
-1
python/paddle/fluid/tests/unittests/test_isfinite_v2_op.py
python/paddle/fluid/tests/unittests/test_isfinite_v2_op.py
+161
-0
python/paddle/tensor/__init__.py
python/paddle/tensor/__init__.py
+4
-1
python/paddle/tensor/math.py
python/paddle/tensor/math.py
+99
-2
未找到文件。
paddle/fluid/framework/tensor_util.cc
浏览文件 @
199b0c7c
...
@@ -420,6 +420,61 @@ inline void Any(const framework::Tensor& tensor, Predicate predicate,
...
@@ -420,6 +420,61 @@ inline void Any(const framework::Tensor& tensor, Predicate predicate,
platform
::
VisitPlace
(
place
,
visitor
);
platform
::
VisitPlace
(
place
,
visitor
);
}
}
template
<
typename
Predicate
,
typename
DevCtx
>
struct
AllDTypeVisitor
{
Predicate
predicate_
;
const
Tensor
&
tensor_
;
const
DevCtx
&
ctx_
;
Tensor
*
out_
;
AllDTypeVisitor
(
Predicate
predicate
,
const
Tensor
&
tensor
,
const
DevCtx
&
ctx
,
Tensor
*
out
)
:
predicate_
(
predicate
),
tensor_
(
tensor
),
ctx_
(
ctx
),
out_
(
out
)
{}
template
<
typename
T
>
void
apply
()
const
{
auto
t
=
EigenVector
<
T
>::
Flatten
(
tensor_
);
auto
o
=
EigenVector
<
bool
>::
Flatten
(
*
out_
);
o
.
device
(
*
ctx_
.
eigen_device
())
=
predicate_
(
t
);
}
};
template
<
typename
Predicate
,
typename
DevCtx
>
inline
void
AllImpl
(
Predicate
predicate
,
const
framework
::
Tensor
&
tensor
,
const
DevCtx
&
ctx
,
framework
::
Tensor
*
out
)
{
VisitDataType
(
tensor
.
type
(),
AllDTypeVisitor
<
Predicate
,
DevCtx
>
(
predicate
,
tensor
,
ctx
,
out
));
}
template
<
typename
Predicate
>
class
AllOutVisitor
:
public
boost
::
static_visitor
<>
{
private:
const
framework
::
Tensor
&
tensor_
;
mutable
framework
::
Tensor
*
out_
;
Predicate
predicate_
;
public:
AllOutVisitor
(
const
framework
::
Tensor
&
tensor
,
Predicate
predicate
,
framework
::
Tensor
*
out
)
:
tensor_
(
tensor
),
out_
(
out
),
predicate_
(
predicate
)
{}
template
<
typename
Place
>
void
operator
()(
const
Place
&
place
)
const
{
auto
*
ctx
=
platform
::
DeviceContextPool
::
Instance
().
GetByPlace
(
place
);
out_
->
Resize
(
tensor_
.
dims
());
out_
->
mutable_data
<
bool
>
(
place
);
AllImpl
(
predicate_
,
tensor_
,
*
ctx
,
out_
);
}
};
template
<
typename
Predicate
>
inline
void
All
(
const
framework
::
Tensor
&
tensor
,
Predicate
predicate
,
framework
::
Tensor
*
out
)
{
AllOutVisitor
<
Predicate
>
visitor
(
tensor
,
predicate
,
out
);
auto
place
=
tensor
.
place
();
platform
::
VisitPlace
(
place
,
visitor
);
}
struct
ContainsNANPredicate
{
struct
ContainsNANPredicate
{
template
<
typename
T
>
template
<
typename
T
>
auto
operator
()(
const
T
&
eigen_vec
)
const
auto
operator
()(
const
T
&
eigen_vec
)
const
...
@@ -440,6 +495,12 @@ void TensorContainsNAN(const framework::Tensor& tensor,
...
@@ -440,6 +495,12 @@ void TensorContainsNAN(const framework::Tensor& tensor,
Any
(
tensor
,
predicate
,
out
);
Any
(
tensor
,
predicate
,
out
);
}
}
void
TensorContainsNANV2
(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
)
{
ContainsNANPredicate
predicate
;
All
(
tensor
,
predicate
,
out
);
}
struct
ContainsInfPredicate
{
struct
ContainsInfPredicate
{
template
<
typename
T
>
template
<
typename
T
>
auto
operator
()(
const
T
&
eigen_vec
)
const
auto
operator
()(
const
T
&
eigen_vec
)
const
...
@@ -460,6 +521,12 @@ void TensorContainsInf(const framework::Tensor& tensor,
...
@@ -460,6 +521,12 @@ void TensorContainsInf(const framework::Tensor& tensor,
Any
(
tensor
,
predicate
,
out
);
Any
(
tensor
,
predicate
,
out
);
}
}
void
TensorContainsInfV2
(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
)
{
ContainsInfPredicate
predicate
;
All
(
tensor
,
predicate
,
out
);
}
// NOTE(dzhwinter):
// NOTE(dzhwinter):
// Isfinite need a AllVisitor to loop through all the elements.
// Isfinite need a AllVisitor to loop through all the elements.
// We choose two cuda call instead of one allvisitor. The AllVisitor
// We choose two cuda call instead of one allvisitor. The AllVisitor
...
@@ -472,8 +539,8 @@ bool TensorIsfinite(const framework::Tensor& tensor) {
...
@@ -472,8 +539,8 @@ bool TensorIsfinite(const framework::Tensor& tensor) {
#ifdef PADDLE_WITH_CUDA
#ifdef PADDLE_WITH_CUDA
template
<
typename
T
>
template
<
typename
T
>
static
inline
void
__global__
BothFalse
(
const
T
*
cmp
,
T
*
out
)
{
static
inline
void
__global__
BothFalse
(
const
T
*
cmp
,
T
*
out
,
int
element_num
)
{
out
[
0
]
=
(
!
cmp
[
0
])
&&
(
!
out
[
0
]);
CUDA_KERNEL_LOOP
(
i
,
element_num
)
{
out
[
i
]
=
(
!
cmp
[
i
])
&&
(
!
out
[
i
]);
}
}
}
#endif
#endif
...
@@ -495,22 +562,40 @@ struct BothFalseVisitor : public boost::static_visitor<> {
...
@@ -495,22 +562,40 @@ struct BothFalseVisitor : public boost::static_visitor<> {
void
VisitorImpl
(
const
platform
::
CUDAPlace
&
gpu
)
const
{
void
VisitorImpl
(
const
platform
::
CUDAPlace
&
gpu
)
const
{
#ifdef PADDLE_WITH_CUDA
#ifdef PADDLE_WITH_CUDA
auto
*
ctx
=
platform
::
DeviceContextPool
::
Instance
().
GetByPlace
(
gpu
);
auto
*
ctx
=
platform
::
DeviceContextPool
::
Instance
().
GetByPlace
(
gpu
);
BothFalse
<
bool
><<<
1
,
1
,
0
,
ctx
->
stream
()
>>>
(
in_
.
data
<
bool
>
(),
constexpr
int
MAX_BLOCK_DIM
=
512
;
out_
->
mutable_data
<
bool
>
(
gpu
));
const
int
MAX_GRID_DIM
=
ctx
->
GetMaxPhysicalThreadCount
()
/
MAX_BLOCK_DIM
;
int
element_num
=
in_
.
numel
();
int
block_size
=
(
element_num
>=
MAX_BLOCK_DIM
)
?
MAX_BLOCK_DIM
:
(
1
<<
static_cast
<
int
>
(
std
::
log2
(
element_num
)));
int
grid_size
=
element_num
/
block_size
;
grid_size
=
(
grid_size
>=
MAX_GRID_DIM
)
?
MAX_GRID_DIM
:
grid_size
;
BothFalse
<
bool
><<<
grid_size
,
block_size
,
0
,
ctx
->
stream
()
>>>
(
in_
.
data
<
bool
>
(),
out_
->
mutable_data
<
bool
>
(
gpu
),
element_num
);
#endif
#endif
}
}
void
VisitorImpl
(
const
platform
::
CPUPlace
&
cpu
)
const
{
void
VisitorImpl
(
const
platform
::
CPUPlace
&
cpu
)
const
{
bool
lhs
=
!
in_
.
data
<
bool
>
()[
0
];
int
num
=
in_
.
numel
();
bool
rhs
=
!
out_
->
mutable_data
<
bool
>
(
cpu
)[
0
];
const
bool
*
in_ptr
=
in_
.
data
<
bool
>
();
out_
->
mutable_data
<
bool
>
(
cpu
)[
0
]
=
lhs
&&
rhs
;
bool
*
out_ptr
=
out_
->
data
<
bool
>
();
for
(
int
i
=
0
;
i
<
num
;
++
i
)
{
bool
lhs
=
!
in_ptr
[
i
];
bool
rhs
=
!
out_ptr
[
i
];
out_ptr
[
i
]
=
lhs
&&
rhs
;
}
}
}
void
VisitorImpl
(
void
VisitorImpl
(
const
platform
::
CUDAPinnedPlace
&
cpu
/* equals to cpu*/
)
const
{
const
platform
::
CUDAPinnedPlace
&
cpu
/* equals to cpu*/
)
const
{
bool
lhs
=
!
in_
.
data
<
bool
>
()[
0
];
int
num
=
in_
.
numel
();
bool
rhs
=
!
out_
->
mutable_data
<
bool
>
(
cpu
)[
0
];
const
bool
*
in_ptr
=
in_
.
data
<
bool
>
();
out_
->
mutable_data
<
bool
>
(
cpu
)[
0
]
=
lhs
&&
rhs
;
bool
*
out_ptr
=
out_
->
data
<
bool
>
();
for
(
int
i
=
0
;
i
<
num
;
++
i
)
{
bool
lhs
=
!
in_ptr
[
i
];
bool
rhs
=
!
out_ptr
[
i
];
out_ptr
[
i
]
=
lhs
&&
rhs
;
}
}
}
};
};
...
@@ -523,6 +608,15 @@ void TensorIsfinite(const framework::Tensor& tensor, framework::Tensor* out) {
...
@@ -523,6 +608,15 @@ void TensorIsfinite(const framework::Tensor& tensor, framework::Tensor* out) {
platform
::
VisitPlace
(
place
,
visitor
);
platform
::
VisitPlace
(
place
,
visitor
);
}
}
void
TensorIsfiniteV2
(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
)
{
framework
::
Tensor
tmp
;
TensorContainsInfV2
(
tensor
,
&
tmp
);
TensorContainsNANV2
(
tensor
,
out
);
BothFalseVisitor
visitor
(
tmp
,
out
);
auto
place
=
tensor
.
place
();
platform
::
VisitPlace
(
place
,
visitor
);
}
void
TensorToStream
(
std
::
ostream
&
os
,
const
Tensor
&
tensor
,
void
TensorToStream
(
std
::
ostream
&
os
,
const
Tensor
&
tensor
,
const
platform
::
DeviceContext
&
dev_ctx
)
{
const
platform
::
DeviceContext
&
dev_ctx
)
{
{
// the 1st field, uint32_t version
{
// the 1st field, uint32_t version
...
...
paddle/fluid/framework/tensor_util.h
浏览文件 @
199b0c7c
...
@@ -76,6 +76,13 @@ void TensorFromStream(std::istream& is, Tensor* tensor,
...
@@ -76,6 +76,13 @@ void TensorFromStream(std::istream& is, Tensor* tensor,
const
platform
::
DeviceContext
&
dev_ctx
,
const
platform
::
DeviceContext
&
dev_ctx
,
const
size_t
&
seek
,
const
std
::
vector
<
int64_t
>&
shape
);
const
size_t
&
seek
,
const
std
::
vector
<
int64_t
>&
shape
);
// store the bool result tensor in out tensor
void
TensorContainsNANV2
(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
);
void
TensorContainsInfV2
(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
);
void
TensorIsfiniteV2
(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
);
// convert dlpack's DLTensor to tensor
// convert dlpack's DLTensor to tensor
void
TensorFromDLPack
(
const
::
DLTensor
&
dl_tensor
,
framework
::
Tensor
*
dst
);
void
TensorFromDLPack
(
const
::
DLTensor
&
dl_tensor
,
framework
::
Tensor
*
dst
);
...
...
paddle/fluid/operators/isfinite_v2_op.cc
0 → 100644
浏览文件 @
199b0c7c
// Copyright (c) 2018 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/fluid/operators/isfinite_v2_op.h"
#include <string>
#include <vector>
#include "paddle/fluid/operators/common_infer_shape_functions.h"
#include "paddle/fluid/platform/float16.h"
namespace
plat
=
paddle
::
platform
;
namespace
paddle
{
namespace
operators
{
class
OverflowV2Op
:
public
framework
::
OperatorWithKernel
{
public:
OverflowV2Op
(
const
std
::
string
&
type
,
const
framework
::
VariableNameMap
&
inputs
,
const
framework
::
VariableNameMap
&
outputs
,
const
framework
::
AttributeMap
&
attrs
)
:
OperatorWithKernel
(
type
,
inputs
,
outputs
,
attrs
)
{}
void
InferShape
(
framework
::
InferShapeContext
*
ctx
)
const
override
{
OP_INOUT_CHECK
(
ctx
->
HasInput
(
"X"
),
"Input"
,
"X"
,
"isfinitev2"
);
OP_INOUT_CHECK
(
ctx
->
HasOutput
(
"Out"
),
"Output"
,
"Out"
,
"isfinitev2"
);
UnaryOpUnchangedInferShape
(
ctx
);
}
protected:
framework
::
OpKernelType
GetExpectedKernelType
(
const
framework
::
ExecutionContext
&
ctx
)
const
override
{
int
dtype
=
-
1
;
auto
*
x_var
=
ctx
.
InputVar
(
"X"
);
if
(
x_var
->
IsType
<
framework
::
LoDTensor
>
())
{
dtype
=
x_var
->
Get
<
framework
::
LoDTensor
>
().
type
();
}
else
if
(
x_var
->
IsType
<
framework
::
SelectedRows
>
())
{
dtype
=
x_var
->
Get
<
framework
::
SelectedRows
>
().
value
().
type
();
}
else
{
PADDLE_THROW
(
plat
::
errors
::
InvalidArgument
(
"Cannot find the input data type by all input data"
));
}
return
framework
::
OpKernelType
(
framework
::
proto
::
VarType
::
Type
(
dtype
),
ctx
.
GetPlace
());
}
};
class
OverflowV2OpMaker
:
public
framework
::
OpProtoAndCheckerMaker
{
public:
void
Make
()
override
{
AddInput
(
"X"
,
"(Tensor) The input tensors of overflowv2 operator."
);
AddOutput
(
"Out"
,
"(Tensor) The output tensor of overflowv2 operator. "
"Same size compare to input tensor"
);
AddComment
(
string
::
Sprintf
(
R"DOC(
Overflow %s operator.
$$Out = %s(X)$$
Check whether each element of X is Inf or Nan, return the bool result of each
element of X as a tensor.
%s
)DOC"
,
GetName
(),
GetComments
()));
}
protected:
virtual
std
::
string
GetName
()
const
=
0
;
virtual
std
::
string
GetComments
()
const
=
0
;
};
}
// namespace operators
}
// namespace paddle
namespace
ops
=
paddle
::
operators
;
#define REGISTER_V2OP_MAKER(op_type, comment) \
namespace paddle { \
namespace operators { \
class _##op_type##OverflowV2OpMaker \
: public ::paddle::operators::OverflowV2OpMaker { \
protected: \
std::string GetName() const { return #op_type; } \
std::string GetComments() const { return comment; } \
}; \
} \
} \
REGISTER_OPERATOR( \
op_type, ops::OverflowV2Op, ops::_##op_type##OverflowV2OpMaker, \
paddle::framework::EmptyGradOpMaker<paddle::framework::OpDesc>, \
paddle::framework::EmptyGradOpMaker<paddle::imperative::OpBase>)
#define REGISTER_OVERFLOW_CPU_KERNEL(op_type, functor) \
REGISTER_OP_CPU_KERNEL( \
op_type, ops::OverflowKernel<paddle::platform::CPUDeviceContext, int, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CPUDeviceContext, int64_t, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CPUDeviceContext, float, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CPUDeviceContext, double, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CPUDeviceContext, plat::float16, \
ops::functor>);
REGISTER_V2OP_MAKER
(
isinf_v2
,
"isinfv2(X)"
);
REGISTER_V2OP_MAKER
(
isnan_v2
,
"isnanv2(X)"
);
REGISTER_V2OP_MAKER
(
isfinite_v2
,
"isfinitev2(X)"
);
REGISTER_OVERFLOW_CPU_KERNEL
(
isinf_v2
,
InfinityV2Functor
);
REGISTER_OVERFLOW_CPU_KERNEL
(
isnan_v2
,
NANV2Functor
);
REGISTER_OVERFLOW_CPU_KERNEL
(
isfinite_v2
,
IsfiniteV2Functor
);
paddle/fluid/operators/isfinite_v2_op.cu
0 → 100644
浏览文件 @
199b0c7c
// Copyright (c) 2020 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/fluid/operators/isfinite_v2_op.h"
#include "paddle/fluid/platform/float16.h"
namespace
ops
=
paddle
::
operators
;
namespace
plat
=
paddle
::
platform
;
#define REGISTER_OVERFLOW_CUDA_KERNEL(op_type, functor) \
REGISTER_OP_CUDA_KERNEL( \
op_type, ops::OverflowKernel<paddle::platform::CUDADeviceContext, int, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CUDADeviceContext, int64_t, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CUDADeviceContext, float, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CUDADeviceContext, double, \
ops::functor>, \
ops::OverflowKernel<paddle::platform::CUDADeviceContext, plat::float16, \
ops::functor>);
REGISTER_OVERFLOW_CUDA_KERNEL
(
isinf_v2
,
InfinityV2Functor
);
REGISTER_OVERFLOW_CUDA_KERNEL
(
isnan_v2
,
NANV2Functor
);
REGISTER_OVERFLOW_CUDA_KERNEL
(
isfinite_v2
,
IsfiniteV2Functor
);
paddle/fluid/operators/isfinite_v2_op.h
0 → 100644
浏览文件 @
199b0c7c
// Copyright (c) 2018 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 <vector>
#include "paddle/fluid/framework/eigen.h"
#include "paddle/fluid/framework/op_registry.h"
#include "paddle/fluid/framework/tensor_util.h"
#include "paddle/fluid/operators/isfinite_op.h"
#include "paddle/fluid/platform/float16.h"
#include "paddle/fluid/platform/transform.h"
namespace
paddle
{
namespace
operators
{
struct
InfinityV2Functor
{
void
operator
()(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
)
{
framework
::
TensorContainsInfV2
(
tensor
,
out
);
}
};
struct
NANV2Functor
{
void
operator
()(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
)
{
framework
::
TensorContainsNANV2
(
tensor
,
out
);
}
};
struct
IsfiniteV2Functor
{
void
operator
()(
const
framework
::
Tensor
&
tensor
,
framework
::
Tensor
*
out
)
{
framework
::
TensorIsfiniteV2
(
tensor
,
out
);
}
};
}
// namespace operators
}
// namespace paddle
paddle/fluid/operators/nll_loss_op.cc
浏览文件 @
199b0c7c
...
@@ -55,8 +55,8 @@ class NLLLossOp : public framework::OperatorWithKernel {
...
@@ -55,8 +55,8 @@ class NLLLossOp : public framework::OperatorWithKernel {
"Input(Weight) should be a 1D tensor."
));
"Input(Weight) should be a 1D tensor."
));
PADDLE_ENFORCE_EQ
(
x_dims
[
1
],
w_dims
[
0
],
PADDLE_ENFORCE_EQ
(
x_dims
[
1
],
w_dims
[
0
],
platform
::
errors
::
InvalidArgument
(
platform
::
errors
::
InvalidArgument
(
"Input(Weight) Tensor's size should match"
"Input(Weight) Tensor's size should match
"
"to the
class numer
."
));
"to the
the total number of classes
."
));
}
}
}
}
if
(
x_dims
.
size
()
==
2
)
{
if
(
x_dims
.
size
()
==
2
)
{
...
...
paddle/fluid/operators/nll_loss_op.h
浏览文件 @
199b0c7c
...
@@ -91,7 +91,7 @@ static void nll_loss_2D(T* out_data, T* total_weight_data, const T* x_data,
...
@@ -91,7 +91,7 @@ static void nll_loss_2D(T* out_data, T* total_weight_data, const T* x_data,
}
}
PADDLE_ENFORCE_EQ
(
cur_label
>=
0
&&
cur_label
<
n_classes
,
true
,
PADDLE_ENFORCE_EQ
(
cur_label
>=
0
&&
cur_label
<
n_classes
,
true
,
platform
::
errors
::
InvalidArgument
(
platform
::
errors
::
InvalidArgument
(
"label should no
r
be out of bounds."
));
"label should no
t
be out of bounds."
));
const
auto
cur_weight
=
const
auto
cur_weight
=
weight_data
?
weight_data
[
cur_label
]
:
static_cast
<
T
>
(
1
);
weight_data
?
weight_data
[
cur_label
]
:
static_cast
<
T
>
(
1
);
out_data
[
index
]
=
-
x_data
[
i
*
sample_size
+
cur_label
*
map_size
+
out_data
[
index
]
=
-
x_data
[
i
*
sample_size
+
cur_label
*
map_size
+
...
@@ -117,7 +117,7 @@ static void nll_loss_2D(T* out_data, T* total_weight_data, const T* x_data,
...
@@ -117,7 +117,7 @@ static void nll_loss_2D(T* out_data, T* total_weight_data, const T* x_data,
}
}
PADDLE_ENFORCE_EQ
(
cur_label
>=
0
&&
cur_label
<
n_classes
,
true
,
PADDLE_ENFORCE_EQ
(
cur_label
>=
0
&&
cur_label
<
n_classes
,
true
,
platform
::
errors
::
InvalidArgument
(
platform
::
errors
::
InvalidArgument
(
"label should no
r
be out of bounds."
));
"label should no
t
be out of bounds."
));
const
auto
cur_weight
=
const
auto
cur_weight
=
weight_data
?
weight_data
[
cur_label
]
:
static_cast
<
T
>
(
1
);
weight_data
?
weight_data
[
cur_label
]
:
static_cast
<
T
>
(
1
);
total_weight_val
+=
cur_weight
;
total_weight_val
+=
cur_weight
;
...
...
python/paddle/__init__.py
浏览文件 @
199b0c7c
...
@@ -91,7 +91,7 @@ from .tensor.logic import equal #DEFINE_ALIAS
...
@@ -91,7 +91,7 @@ from .tensor.logic import equal #DEFINE_ALIAS
from
.tensor.logic
import
greater_equal
#DEFINE_ALIAS
from
.tensor.logic
import
greater_equal
#DEFINE_ALIAS
from
.tensor.logic
import
greater_than
#DEFINE_ALIAS
from
.tensor.logic
import
greater_than
#DEFINE_ALIAS
from
.tensor.logic
import
is_empty
#DEFINE_ALIAS
from
.tensor.logic
import
is_empty
#DEFINE_ALIAS
from
.tensor.logic
import
isfinite
#DEFINE_ALIAS
#
from .tensor.logic import isfinite #DEFINE_ALIAS
from
.tensor.logic
import
less_equal
#DEFINE_ALIAS
from
.tensor.logic
import
less_equal
#DEFINE_ALIAS
from
.tensor.logic
import
less_than
#DEFINE_ALIAS
from
.tensor.logic
import
less_than
#DEFINE_ALIAS
from
.tensor.logic
import
logical_and
#DEFINE_ALIAS
from
.tensor.logic
import
logical_and
#DEFINE_ALIAS
...
@@ -193,6 +193,9 @@ from .tensor.math import addmm #DEFINE_ALIAS
...
@@ -193,6 +193,9 @@ from .tensor.math import addmm #DEFINE_ALIAS
from
.tensor.math
import
clip
#DEFINE_ALIAS
from
.tensor.math
import
clip
#DEFINE_ALIAS
from
.tensor.math
import
trace
#DEFINE_ALIAS
from
.tensor.math
import
trace
#DEFINE_ALIAS
from
.tensor.math
import
kron
#DEFINE_ALIAS
from
.tensor.math
import
kron
#DEFINE_ALIAS
from
.tensor.math
import
isfinite
#DEFINE_ALIAS
from
.tensor.math
import
isinf
#DEFINE_ALIAS
from
.tensor.math
import
isnan
#DEFINE_ALIAS
from
.tensor.math
import
prod
#DEFINE_ALIAS
from
.tensor.math
import
prod
#DEFINE_ALIAS
from
.tensor.random
import
standard_normal
from
.tensor.random
import
standard_normal
from
.tensor.random
import
normal
from
.tensor.random
import
normal
...
...
python/paddle/fluid/tests/unittests/test_isfinite_v2_op.py
0 → 100644
浏览文件 @
199b0c7c
# Copyright (c) 2020 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.
import
paddle
import
paddle.fluid
as
fluid
import
unittest
import
numpy
as
np
def
run_static
(
x_np
,
dtype
,
op_str
,
use_gpu
=
False
):
paddle
.
enable_static
()
startup_program
=
fluid
.
Program
()
main_program
=
fluid
.
Program
()
place
=
paddle
.
CPUPlace
()
if
use_gpu
and
fluid
.
core
.
is_compiled_with_cuda
():
place
=
paddle
.
CUDAPlace
(
0
)
exe
=
fluid
.
Executor
(
place
)
with
fluid
.
program_guard
(
main_program
,
startup_program
):
x
=
paddle
.
data
(
name
=
'x'
,
shape
=
x_np
.
shape
,
dtype
=
dtype
)
res
=
getattr
(
paddle
.
tensor
,
op_str
)(
x
)
exe
.
run
(
startup_program
)
static_result
=
exe
.
run
(
main_program
,
feed
=
{
'x'
:
x_np
},
fetch_list
=
[
res
])
return
static_result
def
run_dygraph
(
x_np
,
op_str
,
use_gpu
=
True
):
place
=
paddle
.
CPUPlace
()
if
use_gpu
and
fluid
.
core
.
is_compiled_with_cuda
():
place
=
paddle
.
CUDAPlace
(
0
)
paddle
.
disable_static
(
place
)
x
=
paddle
.
to_variable
(
x_np
)
dygraph_result
=
getattr
(
paddle
.
tensor
,
op_str
)(
x
)
return
dygraph_result
def
np_data_generator
(
low
,
high
,
np_shape
,
type
,
sv_list
,
op_str
,
*
args
,
**
kwargs
):
x_np
=
np
.
random
.
uniform
(
low
,
high
,
np_shape
).
astype
(
getattr
(
np
,
type
))
# x_np.shape[0] >= len(sv_list)
if
type
in
[
'float16'
,
'float32'
,
'float64'
]:
for
i
,
v
in
enumerate
(
sv_list
):
x_np
[
i
]
=
v
ori_shape
=
x_np
.
shape
x_np
=
x_np
.
reshape
((
np
.
product
(
ori_shape
),
))
np
.
random
.
shuffle
(
x_np
)
x_np
=
x_np
.
reshape
(
ori_shape
)
result_np
=
getattr
(
np
,
op_str
)(
x_np
)
return
x_np
,
result_np
TEST_META_DATA
=
[
{
'low'
:
0.1
,
'high'
:
1
,
'np_shape'
:
[
8
,
17
,
5
,
6
,
7
],
'type'
:
'float16'
,
'sv_list'
:
[
np
.
inf
,
np
.
nan
]
},
{
'low'
:
0.1
,
'high'
:
1
,
'np_shape'
:
[
11
,
17
],
'type'
:
'float32'
,
'sv_list'
:
[
np
.
inf
,
np
.
nan
]
},
{
'low'
:
0.1
,
'high'
:
1
,
'np_shape'
:
[
2
,
3
,
4
,
5
],
'type'
:
'float64'
,
'sv_list'
:
[
np
.
inf
,
np
.
nan
]
},
{
'low'
:
0
,
'high'
:
100
,
'np_shape'
:
[
11
,
17
,
10
],
'type'
:
'int32'
,
'sv_list'
:
[
np
.
inf
,
np
.
nan
]
},
{
'low'
:
0
,
'high'
:
999
,
'np_shape'
:
[
132
],
'type'
:
'int64'
,
'sv_list'
:
[
np
.
inf
,
np
.
nan
]
},
]
def
test
(
test_case
,
op_str
,
use_gpu
=
False
):
for
meta_data
in
TEST_META_DATA
:
meta_data
=
dict
(
meta_data
)
meta_data
[
'op_str'
]
=
op_str
x_np
,
result_np
=
np_data_generator
(
**
meta_data
)
static_result
=
run_static
(
x_np
,
meta_data
[
'type'
],
op_str
,
use_gpu
)
dygraph_result
=
run_dygraph
(
x_np
,
op_str
,
use_gpu
)
test_case
.
assertTrue
((
static_result
==
result_np
).
all
())
test_case
.
assertTrue
((
dygraph_result
.
numpy
()
==
result_np
).
all
())
class
TestCPUNormal
(
unittest
.
TestCase
):
def
test_inf
(
self
):
test
(
self
,
'isinf'
)
def
test_nan
(
self
):
test
(
self
,
'isnan'
)
def
test_finite
(
self
):
test
(
self
,
'isfinite'
)
class
TestCUDANormal
(
unittest
.
TestCase
):
def
test_inf
(
self
):
test
(
self
,
'isinf'
,
True
)
def
test_nan
(
self
):
test
(
self
,
'isnan'
,
True
)
def
test_finite
(
self
):
test
(
self
,
'isfinite'
,
True
)
class
TestError
(
unittest
.
TestCase
):
def
test_bad_input
(
self
):
paddle
.
enable_static
()
with
fluid
.
program_guard
(
fluid
.
Program
()):
def
test_isinf_bad_x
():
x
=
[
1
,
2
,
3
]
result
=
paddle
.
tensor
.
isinf
(
x
)
self
.
assertRaises
(
TypeError
,
test_isinf_bad_x
)
def
test_isnan_bad_x
():
x
=
[
1
,
2
,
3
]
result
=
paddle
.
tensor
.
isnan
(
x
)
self
.
assertRaises
(
TypeError
,
test_isnan_bad_x
)
def
test_isfinite_bad_x
():
x
=
[
1
,
2
,
3
]
result
=
paddle
.
tensor
.
isfinite
(
x
)
self
.
assertRaises
(
TypeError
,
test_isfinite_bad_x
)
if
__name__
==
'__main__'
:
unittest
.
main
()
python/paddle/tensor/__init__.py
浏览文件 @
199b0c7c
...
@@ -58,7 +58,7 @@ from .logic import equal #DEFINE_ALIAS
...
@@ -58,7 +58,7 @@ from .logic import equal #DEFINE_ALIAS
from
.logic
import
greater_equal
#DEFINE_ALIAS
from
.logic
import
greater_equal
#DEFINE_ALIAS
from
.logic
import
greater_than
#DEFINE_ALIAS
from
.logic
import
greater_than
#DEFINE_ALIAS
from
.logic
import
is_empty
#DEFINE_ALIAS
from
.logic
import
is_empty
#DEFINE_ALIAS
from
.logic
import
isfinite
#DEFINE_ALIAS
#
from .logic import isfinite #DEFINE_ALIAS
from
.logic
import
less_equal
#DEFINE_ALIAS
from
.logic
import
less_equal
#DEFINE_ALIAS
from
.logic
import
less_than
#DEFINE_ALIAS
from
.logic
import
less_than
#DEFINE_ALIAS
from
.logic
import
logical_and
#DEFINE_ALIAS
from
.logic
import
logical_and
#DEFINE_ALIAS
...
@@ -161,6 +161,9 @@ from .math import addmm #DEFINE_ALIAS
...
@@ -161,6 +161,9 @@ from .math import addmm #DEFINE_ALIAS
from
.math
import
clip
#DEFINE_ALIAS
from
.math
import
clip
#DEFINE_ALIAS
from
.math
import
trace
#DEFINE_ALIAS
from
.math
import
trace
#DEFINE_ALIAS
from
.math
import
kron
#DEFINE_ALIAS
from
.math
import
kron
#DEFINE_ALIAS
from
.math
import
isfinite
#DEFINE_ALIAS
from
.math
import
isinf
#DEFINE_ALIAS
from
.math
import
isnan
#DEFINE_ALIAS
from
.math
import
prod
#DEFINE_ALIAS
from
.math
import
prod
#DEFINE_ALIAS
from
.random
import
standard_normal
from
.random
import
standard_normal
from
.random
import
normal
from
.random
import
normal
...
...
python/paddle/tensor/math.py
浏览文件 @
199b0c7c
...
@@ -126,7 +126,10 @@ __all__ = [
...
@@ -126,7 +126,10 @@ __all__ = [
'addmm'
,
'addmm'
,
'clip'
,
'clip'
,
'trace'
,
'trace'
,
'kron'
'kron'
,
'isfinite'
,
'isinf'
,
'isnan'
]
]
# yapf: enable.
# yapf: enable.
...
@@ -1669,6 +1672,100 @@ def cumsum(x, axis=None, dtype=None, name=None):
...
@@ -1669,6 +1672,100 @@ def cumsum(x, axis=None, dtype=None, name=None):
_cum_sum_
=
generate_layer_fn
(
'cumsum'
)
_cum_sum_
=
generate_layer_fn
(
'cumsum'
)
return
_cum_sum_
(
**
kwargs
)
return
_cum_sum_
(
**
kwargs
)
def
isfinite
(
x
,
name
=
None
):
"""
Return whether every element of input tensor is finite number or not.
Args:
x (Tensor): The input tensor, it's data type should be float16, float32, float64, int32, int64.
name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
Returns:
`Tensor`, the bool result which shows every element of `x` whether it is finite number or not.
Examples:
.. code-block:: python
import paddle
import numpy as np
paddle.disable_static()
x_np = np.array([float('-inf'), -2, 3.6, float('inf'), 0, float('-nan'), float('nan')])
x = paddle.to_tensor(x_np)
out = paddle.tensor.isfinite(x)
print(out.numpy()) # [False True True False True False False]
"""
if
in_dygraph_mode
():
return
core
.
ops
.
isfinite_v2
(
x
)
helper
=
LayerHelper
(
"isfinite_v2"
,
**
locals
())
check_variable_and_dtype
(
x
,
'x'
,
[
'float16'
,
'float32'
,
'float64'
,
'int32'
,
'int64'
],
'isfinite'
)
out
=
helper
.
create_variable_for_type_inference
(
'bool'
)
helper
.
append_op
(
type
=
"isfinite_v2"
,
inputs
=
{
"X"
:
x
},
outputs
=
{
"Out"
:
out
})
return
out
def
isinf
(
x
,
name
=
None
):
"""
Return whether every element of input tensor is `+/-INF` or not.
Args:
x (Tensor): The input tensor, it's data type should be float16, float32, float64, int32, int64.
name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
Returns:
`Tensor`, the bool result which shows every element of `x` whether it is `+/-INF` or not.
Examples:
.. code-block:: python
import paddle
import numpy as np
paddle.disable_static()
x_np = np.array([float('-inf'), -2, 3.6, float('inf'), 0, float('-nan'), float('nan')])
x = paddle.to_tensor(x_np)
out = paddle.tensor.isinf(x)
print(out.numpy()) # [ True False False True False False False]
"""
if
in_dygraph_mode
():
return
core
.
ops
.
isinf_v2
(
x
)
helper
=
LayerHelper
(
"isinf_v2"
,
**
locals
())
check_variable_and_dtype
(
x
,
'x'
,
[
'float16'
,
'float32'
,
'float64'
,
'int32'
,
'int64'
],
'isinf'
)
out
=
helper
.
create_variable_for_type_inference
(
dtype
=
'bool'
)
helper
.
append_op
(
type
=
"isinf_v2"
,
inputs
=
{
"X"
:
x
},
outputs
=
{
"Out"
:
out
})
return
out
def
isnan
(
x
,
name
=
None
):
"""
Return whether every element of input tensor is `NaN` or not.
Args:
x (Tensor): The input tensor, it's data type should be float16, float32, float64, int32, int64.
name (str, optional): Name for the operation (optional, default is None). For more information, please refer to :ref:`api_guide_Name`.
Returns:
`Tensor`, the bool result which shows every element of `x` whether it is `NaN` or not.
Examples:
.. code-block:: python
import paddle
import numpy as np
paddle.disable_static()
x_np = np.array([float('-inf'), -2, 3.6, float('inf'), 0, float('-nan'), float('nan')])
x = paddle.to_tensor(x_np)
out = paddle.tensor.isnan(x)
print(out.numpy()) # [False False False False False True True]
"""
if
in_dygraph_mode
():
return
core
.
ops
.
isnan_v2
(
x
)
helper
=
LayerHelper
(
"isnan_v2"
,
**
locals
())
check_variable_and_dtype
(
x
,
'x'
,
[
'float16'
,
'float32'
,
'float64'
,
'int32'
,
'int64'
],
'isnan'
)
out
=
helper
.
create_variable_for_type_inference
(
dtype
=
'bool'
)
helper
.
append_op
(
type
=
"isnan_v2"
,
inputs
=
{
"X"
:
x
},
outputs
=
{
"Out"
:
out
})
return
out
def
prod
(
x
,
axis
=
None
,
keepdim
=
False
,
dtype
=
None
,
name
=
None
):
def
prod
(
x
,
axis
=
None
,
keepdim
=
False
,
dtype
=
None
,
name
=
None
):
"""
"""
Compute the product of tensor elements over the given axis.
Compute the product of tensor elements over the given axis.
...
@@ -1694,7 +1791,7 @@ def prod(x, axis=None, keepdim=False, dtype=None, name=None):
...
@@ -1694,7 +1791,7 @@ def prod(x, axis=None, keepdim=False, dtype=None, name=None):
Raises:
Raises:
ValueError: The :attr:`dtype` must be float32, float64, int32 or int64.
ValueError: The :attr:`dtype` must be float32, float64, int32 or int64.
TypeError: The type of :attr:`axis` must be int, list or tuple.
TypeError: The type of :attr:`axis` must be int, list or tuple.
Examples:
Examples:
.. code-block:: python
.. code-block:: python
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录