New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【PaddlePaddle Hackathon 2】23、为 Paddle 新增 Softmax2D 组网API #40910
Changes from all commits
7c642fa
4a34616
03852ce
3a809f7
8afb8c6
294046c
548f9d1
48be37d
bd38188
59cab23
d0484ba
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
# 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. | ||
|
||
import unittest | ||
import numpy as np | ||
import paddle | ||
import paddle.fluid as fluid | ||
import paddle.fluid.core as core | ||
from test_softmax_op import ref_softmax | ||
|
||
|
||
class TestSoftmax2DAPI(unittest.TestCase): | ||
def setUp(self): | ||
self.shape = [2, 6, 5, 4] | ||
self.x_np = np.random.uniform(-1, 1, self.shape).astype('float64') | ||
self.axis = -3 | ||
self.place = paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \ | ||
else paddle.CPUPlace() | ||
|
||
def test_static_api(self): | ||
paddle.enable_static() | ||
with paddle.static.program_guard(paddle.static.Program()): | ||
x = paddle.fluid.data('X', self.x_np.shape, self.x_np.dtype) | ||
m = paddle.nn.Softmax2D() | ||
out = m(x) | ||
exe = paddle.static.Executor(self.place) | ||
res = exe.run(feed={'X': self.x_np}, fetch_list=[out]) | ||
out_ref = ref_softmax(self.x_np, self.axis) | ||
self.assertTrue(np.allclose(out_ref, res)) | ||
|
||
def test_dygraph_api(self): | ||
paddle.disable_static(self.place) | ||
x = paddle.to_tensor(self.x_np) | ||
m = paddle.nn.Softmax2D() | ||
out = m(x) | ||
out_ref = ref_softmax(self.x_np, self.axis) | ||
self.assertTrue(np.allclose(out_ref, out.numpy())) | ||
paddle.enable_static() | ||
|
||
|
||
class TestSoftmax2DShape(TestSoftmax2DAPI): | ||
def setUp(self): | ||
self.shape = [2, 6, 4] | ||
self.x_np = np.random.uniform(-1, 1, self.shape).astype('float64') | ||
self.axis = -3 | ||
self.place = paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \ | ||
else paddle.CPUPlace() | ||
|
||
|
||
class TestSoftmax2DFloat32(TestSoftmax2DAPI): | ||
def setUp(self): | ||
self.shape = [2, 3, 4] | ||
self.x_np = np.random.uniform(-1, 1, self.shape).astype('float32') | ||
self.axis = -3 | ||
self.place = paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \ | ||
else paddle.CPUPlace() | ||
|
||
|
||
class TestSoftmax2DCPU(TestSoftmax2DAPI): | ||
def setUp(self): | ||
self.shape = [2, 6, 4] | ||
self.x_np = np.random.uniform(-1, 1, self.shape).astype('float64') | ||
self.axis = -3 | ||
self.place = paddle.CPUPlace() | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 增加GPU上单独测试、shape不是3或4维度的错误测试(可以使用assertRaises(error, func,input)) |
||
|
||
class TestSoftmax2DRepr(unittest.TestCase): | ||
def setUp(self): | ||
self.place = paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \ | ||
else paddle.CPUPlace() | ||
|
||
def test_extra_repr(self): | ||
paddle.disable_static(self.place) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 这里相应修改 |
||
m = paddle.nn.Softmax2D(name='test') | ||
self.assertTrue(m.extra_repr() == 'name=test') | ||
paddle.enable_static() | ||
|
||
|
||
class TestSoftmax2DError(unittest.TestCase): | ||
def setUp(self): | ||
self.place = paddle.CUDAPlace(0) if core.is_compiled_with_cuda() \ | ||
else paddle.CPUPlace() | ||
|
||
def test_static_error(self): | ||
paddle.enable_static() | ||
with paddle.static.program_guard(paddle.static.Program()): | ||
x = paddle.fluid.data('X', [5, 5], 'float32') | ||
m = paddle.nn.Softmax2D() | ||
self.assertRaises(AssertionError, m, x) | ||
|
||
def test_dygraph_error(self): | ||
paddle.disable_static(self.place) | ||
x_np = np.random.randn(2, 3, 4, 2, 3) | ||
x = paddle.to_tensor(x_np, dtype='float64') | ||
m = paddle.nn.Softmax2D() | ||
self.assertRaises(AssertionError, m, x) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 这里为什么是个AssertionError? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 因为代码中使用了assert
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 开发者在python层面实现避免输入维度不符合期望使用了assert,因此维度不匹配会触发AssertionError。 |
||
|
||
|
||
if __name__ == '__main__': | ||
unittest.main() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
axis可以覆盖不同的值,不需要都是-3,比如0, 正数
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
对于softmax2d来说,需要将softmax的axis固定为-3,这里只是显式的写出来了,实际上不需要变动
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里主要因为 softmax2D 的功能需求是固定了axis=-3的,如果不设置成-3,numpy的实现ref_softmax的就不是实现softmax2D的功能了。那么不能用于和softmax2D的对比测试了。