Files
2026-07-13 12:40:42 +08:00

1366 lines
51 KiB
Python

# 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 math
import random
import unittest
import numpy as np
from op_test import get_devices, is_custom_device
from scipy import stats
from utils import dygraph_guard, static_guard
import paddle
from paddle import nn
from paddle.base import Program
DELTA = 0.00001
def _create_random_nd_tensor(dims, size_min, size_max, random_value=False):
size = [random.randint(size_min, size_max) for _ in range(dims)]
if random_value:
tensor = paddle.randn(size)
else:
tensor = paddle.zeros(size)
return tensor
def _random_float(a, b):
return (b - a) * random.random() + a
def _calculate_gain(nonlinearity, param):
recommended_gain = {
'sigmoid': 1,
'linear': 1,
'conv1d': 1,
'conv2d': 1,
'conv3d': 1,
'conv1d_transpose': 1,
'conv_transpose1d': 1,
'conv2d_transpose': 1,
'conv_transpose2d': 1,
'conv3d_transpose': 1,
'conv_transpose3d': 1,
'tanh': 5.0 / 3,
'relu': math.sqrt(2.0),
'leaky_relu': math.sqrt(2.0 / (1 + param**2)),
'selu': 3.0 / 4,
}
return recommended_gain[nonlinearity]
class Test_calculate_gain(unittest.TestCase):
def test(self):
for nonlinearity in [
"linear",
"conv1d",
"conv2d",
"conv3d",
'conv1d_transpose',
"conv_transpose1d",
"conv2d_transpose",
"conv_transpose2d",
"conv3d_transpose",
"conv_transpose3d",
'sigmoid',
'tanh',
"relu",
"leaky_relu",
"selu",
]:
self.assertEqual(
_calculate_gain(nonlinearity, 0),
paddle.nn.init.calculate_gain(nonlinearity, 0),
)
class TestCAlFanINOUT(unittest.TestCase):
def test_cal_fan_in_and_out(self):
x = paddle.tensor.randn([10])
x_expected = (10, 10)
self.assertEqual(
x_expected,
paddle.nn.init._calculate_fan_in_and_fan_out(x),
)
y = paddle.tensor.randn([10, 10])
y_expected = (10, 10)
self.assertEqual(
y_expected,
paddle.nn.init._calculate_fan_in_and_fan_out(y),
)
z = paddle.randn([10, 10, 10])
z_expected = (100, 100)
self.assertEqual(
z_expected,
paddle.nn.init._calculate_fan_in_and_fan_out(z),
)
class Test_kaiming_uniform_(unittest.TestCase):
def check_kaiming_uniform(
self, tensor, a=0, mode='fan_in', nonlinearity='leaky_relu'
):
if len(tensor.shape) == 2:
# This is the case for simple matrix multiply
fan_in = tensor.shape[0]
fan_out = tensor.shape[1]
else:
fan_in = tensor.shape[1]
fan_out = tensor.shape[0]
if len(tensor.shape) > 2:
receptive_field_size = np.prod(tensor.shape[2:])
fan_in *= receptive_field_size
fan_out *= receptive_field_size
if mode == "fan_in":
n = fan_in
else:
n = fan_out
expected_std = _calculate_gain(nonlinearity=nonlinearity, param=a)
bounds = expected_std * math.sqrt(3.0 / float(n))
samples = tensor.flatten().tolist()
p_value = stats.kstest(samples, "uniform", args=(-bounds, bounds * 2))[
1
]
self.assertGreater(p_value, 0.0001)
def test_nonlinearity_dygraph(self):
with dygraph_guard():
for nonlinearity in [
'conv_transpose1d',
'conv_transpose2d',
'conv_transpose3d',
'relu',
'leaky_relu',
]:
input_tensor = paddle.zeros([1024, 512])
paddle.nn.init.kaiming_uniform_(
input_tensor, nonlinearity=nonlinearity
)
self.check_kaiming_uniform(
input_tensor, nonlinearity=nonlinearity
)
def test_dygraph(self):
with dygraph_guard():
for use_a in [True, False]:
for dims in [2, 3, 4]:
for mode in ["fan_in", "fan_out"]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
if use_a:
a = _random_float(0.1, 2)
else:
a = 0
output = paddle.nn.init.kaiming_uniform_(
input_tensor, a=a, mode=mode
)
self.assertIs(output, input_tensor)
self.check_kaiming_uniform(input_tensor, a=a, mode=mode)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.kaiming_uniform_
init(linear.weight, a=0, mode="fan_in", nonlinearity="leaky_relu")
self.check_kaiming_uniform(
linear.weight, a=0, mode="fan_in", nonlinearity="leaky_relu"
)
init(
linear.weight, a=-0.2, mode="fan_out", nonlinearity="leaky_relu"
)
self.check_kaiming_uniform(
linear.weight, a=-0.2, mode="fan_out", nonlinearity="leaky_relu"
)
init(linear.weight, a=0, mode="fan_in", nonlinearity="relu")
self.check_kaiming_uniform(
linear.weight, a=0, mode="fan_in", nonlinearity="relu"
)
init(linear.weight, a=0, mode="fan_out", nonlinearity="relu")
self.check_kaiming_uniform(
linear.weight, a=0, mode="fan_out", nonlinearity="relu"
)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_kaiming_uniform_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.kaiming_uniform_(input_tensor)
self.check_kaiming_uniform(input_tensor)
assert input_tensor.dtype == paddle.float16
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.kaiming_uniform_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check_kaiming_uniform(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.kaiming_uniform_(
x, a=0.1, mode='fan_out'
)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check_kaiming_uniform(pd_res, a=0.1, mode='fan_out')
class Test_kaiming_normal_(unittest.TestCase):
def check_kaiming_normal(
self, tensor, a=0, mode='fan_in', nonlinearity='leaky_relu'
):
if len(tensor.shape) == 2:
# This is the case for simple matrix multiply
fan_in = tensor.shape[0]
fan_out = tensor.shape[1]
else:
fan_in = tensor.shape[1]
fan_out = tensor.shape[0]
if len(tensor.shape) > 2:
receptive_field_size = np.prod(tensor.shape[2:])
fan_in *= receptive_field_size
fan_out *= receptive_field_size
if mode == "fan_in":
n = fan_in
else:
n = fan_out
expected_std = _calculate_gain(nonlinearity=nonlinearity, param=a)
std = expected_std / math.sqrt(float(n))
samples = tensor.flatten().tolist()
p_value = stats.kstest(samples, "norm", args=(0.0, std))[1]
self.assertGreater(p_value, 0.0001)
def test_nonlinearity_dygraph(self):
with dygraph_guard():
for nonlinearity in [
'conv_transpose1d',
'conv_transpose2d',
'conv_transpose3d',
'relu',
'leaky_relu',
]:
input_tensor = paddle.zeros([1024, 512])
paddle.nn.init.kaiming_normal_(
input_tensor, nonlinearity=nonlinearity
)
self.check_kaiming_normal(
input_tensor, nonlinearity=nonlinearity
)
def test_dygraph(self):
with dygraph_guard():
for use_a in [True, False]:
for dims in [2, 3, 4]:
for mode in ["fan_in", "fan_out"]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
if use_a:
a = _random_float(0.1, 2)
else:
a = 0
output = paddle.nn.init.kaiming_normal_(
input_tensor, a=a, mode=mode
)
self.assertIs(output, input_tensor)
self.check_kaiming_normal(input_tensor, a=a, mode=mode)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.kaiming_normal_
init(linear.weight, a=0, mode="fan_in", nonlinearity="leaky_relu")
self.check_kaiming_normal(
linear.weight, a=0, mode="fan_in", nonlinearity="leaky_relu"
)
init(
linear.weight, a=-0.2, mode="fan_out", nonlinearity="leaky_relu"
)
self.check_kaiming_normal(
linear.weight, a=-0.2, mode="fan_out", nonlinearity="leaky_relu"
)
init(linear.weight, a=0, mode="fan_in", nonlinearity="relu")
self.check_kaiming_normal(
linear.weight, a=0, mode="fan_in", nonlinearity="relu"
)
init(linear.weight, a=0, mode="fan_out", nonlinearity="relu")
self.check_kaiming_normal(
linear.weight, a=0, mode="fan_out", nonlinearity="relu"
)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.kaiming_normal_(input_tensor)
self.check_kaiming_normal(input_tensor)
assert input_tensor.dtype == paddle.float16
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.kaiming_normal_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check_kaiming_normal(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.kaiming_normal_(
x, a=0.1, mode='fan_out'
)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check_kaiming_normal(pd_res, a=0.1, mode='fan_out')
class Test_xavier_uniform_(unittest.TestCase):
def check(self, tensor, gain=1.0):
if len(tensor.shape) == 2:
# This is the case for simple matrix multiply
fan_in = tensor.shape[0]
fan_out = tensor.shape[1]
else:
fan_in = tensor.shape[1]
fan_out = tensor.shape[0]
if len(tensor.shape) > 2:
receptive_field_size = np.prod(tensor.shape[2:])
fan_in *= receptive_field_size
fan_out *= receptive_field_size
bounds = gain * math.sqrt(6.0 / float(fan_in + fan_out))
samples = tensor.flatten().tolist()
p_value = stats.kstest(samples, "uniform", args=(-bounds, bounds * 2))[
1
]
self.assertGreater(p_value, 0.0001)
def test_dygraph(self):
with dygraph_guard():
for use_gain in [True, False]:
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
if use_gain:
gain = _random_float(0.1, 3.0)
else:
gain = 1.0
output = paddle.nn.init.xavier_uniform_(
input_tensor, gain=gain
)
self.assertIs(output, input_tensor)
self.check(input_tensor, gain=gain)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.xavier_uniform_
init(linear.weight, gain=0.2)
self.check(linear.weight, gain=0.2)
init(linear.weight, gain=0.25)
self.check(linear.weight, gain=0.25)
init(linear.weight, gain=1.0)
self.check(linear.weight, gain=1.0)
init(linear.weight, gain=2.0)
self.check(linear.weight, gain=2.0)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.xavier_uniform_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.xavier_uniform_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.xavier_uniform_(x, gain=0.5)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, gain=0.5)
class Test_xavier_normal_(unittest.TestCase):
def check(self, tensor, gain=1.0):
if len(tensor.shape) == 2:
# This is the case for simple matrix multiply
fan_in = tensor.shape[0]
fan_out = tensor.shape[1]
else:
fan_in = tensor.shape[1]
fan_out = tensor.shape[0]
if len(tensor.shape) > 2:
receptive_field_size = np.prod(tensor.shape[2:])
fan_in *= receptive_field_size
fan_out *= receptive_field_size
std = gain * math.sqrt(2.0 / float(fan_in + fan_out))
samples = tensor.flatten().tolist()
p_value = stats.kstest(samples, "norm", args=(0.0, std))[1]
self.assertGreater(p_value, 0.0001)
def test_dygraph(self):
with dygraph_guard():
for use_gain in [True, False]:
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
if use_gain:
gain = _random_float(0.1, 3.0)
else:
gain = 1.0
output = paddle.nn.init.xavier_normal_(
input_tensor, gain=gain
)
self.assertIs(output, input_tensor)
self.check(input_tensor, gain=gain)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.xavier_normal_
init(linear.weight, gain=1.0)
self.check(linear.weight, gain=1.0)
init(linear.weight, gain=2.6)
self.check(linear.weight, gain=2.6)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.xavier_normal_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.xavier_normal_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.xavier_normal_(x, gain=0.3)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, gain=0.3)
class Test_uniform_(unittest.TestCase):
def check(self, tensor, a=0.0, b=1.0):
samples = tensor.flatten().tolist()
p_value = stats.kstest(samples, "uniform", args=(a, (b - a)))[1]
self.assertGreater(p_value, 0.0001)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.uniform_
init(linear.weight, a=0.2, b=1.3)
self.check(linear.weight, a=0.2, b=1.3)
init(linear.weight, a=2.2, b=4.3)
self.check(linear.weight, a=2.2, b=4.3)
init(linear.weight, a=-0.2, b=0.2)
self.check(linear.weight, a=-0.2, b=0.2)
init(linear.weight, a=-1.5, b=1.5)
self.check(linear.weight, a=-1.5, b=1.5)
def test_dygraph(self):
with dygraph_guard():
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
output = paddle.nn.init.uniform_(input_tensor, a=-3.0, b=2.0)
self.assertIs(output, input_tensor)
self.check(input_tensor, -3.0, 2.0)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.uniform_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.uniform_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.uniform_(x, a=0.4, b=1.9)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, a=0.4, b=1.9)
class Test_normal_(unittest.TestCase):
def check(self, tensor, mean=0.0, std=1.0):
samples = tensor.flatten().tolist()
p_value = stats.kstest(samples, "norm", args=(mean, std))[1]
self.assertGreater(p_value, 0.0001)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.normal_
init(linear.weight, mean=0.2, std=1.3)
self.check(linear.weight, mean=0.2, std=1.3)
init(linear.weight, mean=2.2, std=4.3)
self.check(linear.weight, mean=2.2, std=4.3)
init(linear.weight, mean=-0.2, std=0.2)
self.check(linear.weight, mean=-0.2, std=0.2)
init(linear.weight, mean=-1.5, std=1.5)
self.check(linear.weight, mean=-1.5, std=1.5)
def test_dygraph(self):
with dygraph_guard():
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
mean = _random_float(-3.0, 3.0)
std = _random_float(0.5, 3.0)
output = paddle.nn.init.normal_(input_tensor, mean, std)
self.assertIs(output, input_tensor)
self.check(input_tensor, mean, std)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.normal_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.normal_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.normal_(x, mean=0.4, std=1.9)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, mean=0.4, std=1.9)
class Test_trunc_normal_(unittest.TestCase):
def check(self, tensor, mean=0.0, std=1.0, a=-2.0, b=2.0):
samples = ((tensor.flatten() - mean) / std).tolist()
a0 = (a - mean) / std
b0 = (b - mean) / std
p_value = stats.kstest(samples, "truncnorm", args=(a0, b0))[1]
self.assertGreater(p_value, 0.0001)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.trunc_normal_
init(linear.weight, mean=0.2, std=1.3, a=1.0, b=2.0)
self.check(linear.weight, mean=0.2, std=1.3, a=1.0, b=2.0)
init(linear.weight, mean=2.2, std=4.3, a=1.3, b=2.0)
self.check(linear.weight, mean=2.2, std=4.3, a=1.3, b=2.0)
init(linear.weight, mean=-0.2, std=0.2, a=-1.0, b=2.9)
self.check(linear.weight, mean=-0.2, std=0.2, a=-1.0, b=2.9)
init(linear.weight, mean=-1.5, std=1.5, a=-1.4, b=2.9)
self.check(linear.weight, mean=-1.5, std=1.5, a=-1.4, b=2.9)
def test_dygraph(self):
with dygraph_guard():
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
mean = _random_float(-3.0, 3.0)
std = _random_float(0.5, 3.0)
bound = _random_float(0.5, 10)
a = mean - bound
b = mean + bound
output = paddle.nn.init.trunc_normal_(
input_tensor, mean, std, a, b
)
self.assertIs(output, input_tensor)
self.check(input_tensor, mean, std, a, b)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.trunc_normal_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.trunc_normal_(
x, mean=0.4, std=1.9, a=-1.9, b=6
)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, mean=0.4, std=1.9, a=-1.9, b=6)
class Test_constant_(unittest.TestCase):
def check(self, tensor, val):
if isinstance(tensor, paddle.Tensor):
diff = (tensor - val).abs().max().item()
elif isinstance(tensor, np.ndarray):
diff = np.max(np.abs(tensor - val))
self.assertLess(diff, 0.000001)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.constant_
init(linear.weight, val=1.0)
self.check(linear.weight, val=1.0)
init(linear.weight, val=0.8)
self.check(linear.weight, val=0.8)
init(linear.weight, val=0.0)
self.check(linear.weight, val=0.0)
init(linear.weight, val=1.9)
self.check(linear.weight, val=1.9)
def test_dygraph(self):
with dygraph_guard():
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
val = _random_float(-1024.0, 1024.0)
output = paddle.nn.init.constant_(input_tensor, val)
self.assertIs(output, input_tensor)
self.check(input_tensor, val)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.constant_(x, val=-0.4)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, val=-0.4)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.constant_(x, val=8.4)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, val=8.4)
class Test_ones_(unittest.TestCase):
def check(self, tensor, eps=1e-6):
if isinstance(tensor, paddle.Tensor):
diff = (tensor - 1.0).abs().max().item()
elif isinstance(tensor, np.ndarray):
diff = np.max(np.abs(tensor - 1.0))
self.assertLess(diff, eps)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.ones_
init(linear.weight)
self.check(linear.weight)
init(linear.weight)
self.check(linear.weight)
init(linear.weight)
self.check(linear.weight)
init(linear.weight)
self.check(linear.weight)
def test_dygraph(self):
with dygraph_guard():
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
output = paddle.nn.init.ones_(input_tensor)
self.assertIs(output, input_tensor)
self.check(input_tensor)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.ones_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.ones_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.ones_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
class Test_zeros_(unittest.TestCase):
def check(self, tensor, eps=1e-6):
if isinstance(tensor, paddle.Tensor):
diff = tensor.abs().max().item()
elif isinstance(tensor, np.ndarray):
diff = np.max(np.abs(tensor))
self.assertLess(diff, eps)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.zeros_
init(linear.weight)
self.check(linear.weight)
init(linear.weight)
self.check(linear.weight)
init(linear.weight)
self.check(linear.weight)
init(linear.weight)
self.check(linear.weight)
def test_dygraph(self):
with dygraph_guard():
for dims in [2, 3, 4]:
input_tensor = _create_random_nd_tensor(
dims, size_min=20, size_max=108
)
output = paddle.nn.init.zeros_(input_tensor)
self.assertIs(output, input_tensor)
self.check(input_tensor)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.zeros_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
def test_static_graph_case2(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([100, 52, 3, 4]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 52, 3, 4], dtype='float32'
)
out = paddle.nn.init.zeros_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([1024, 512], dtype='float16')
paddle.nn.init.zeros_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
class Test_eye_(unittest.TestCase):
def check(self, tensor):
if not isinstance(tensor, np.ndarray):
tensor = tensor.numpy()
row, col = tensor.shape
expected = np.eye(row, col)
self.assertEqual((tensor == expected).all(), True)
@unittest.skipIf(
paddle.base.is_compiled_with_rocm(), "ROCM does not support this API"
)
def test_linear_dygraph(self):
with dygraph_guard():
linear = nn.Linear(40, 20)
init = paddle.nn.init.eye_
init(linear.weight)
self.check(linear.weight)
@unittest.skipIf(
paddle.base.is_compiled_with_rocm(), "ROCM does not support this API"
)
def test_dygraph(self):
with dygraph_guard():
input_tensor = _create_random_nd_tensor(
2, size_min=20, size_max=108
)
output = paddle.nn.init.eye_(input_tensor)
self.assertIs(output, input_tensor)
self.check(input_tensor)
@unittest.skipIf(
paddle.base.is_compiled_with_rocm(), "ROCM does not support this API"
)
def test_dims_error(self):
with dygraph_guard():
with self.assertRaises(AssertionError):
input_tensor = paddle.zeros([5, 5, 1024, 512, 10, 2])
paddle.nn.init.eye_(input_tensor)
with self.assertRaises(AssertionError):
input_tensor = paddle.zeros([5, 5, 4])
paddle.nn.init.eye_(input_tensor)
@unittest.skipIf(
paddle.base.is_compiled_with_rocm(), "ROCM does not support this API"
)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.eye_(x)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([128, 64], dtype='float16')
paddle.nn.init.eye_(input_tensor)
self.check(input_tensor)
assert input_tensor.dtype == paddle.float16
class Test_dirac_(unittest.TestCase):
def test_dygraph(self):
with dygraph_guard():
for dims in [3, 4, 5]:
for groups in [1, 2, 3]:
a, c, d, e = (random.randint(1, 5) for _ in range(4))
b = random.randint(1, 5 * groups)
input_tensor = paddle.randn((a * groups, b, c, d, e)[:dims])
output = paddle.nn.init.dirac_(input_tensor, groups)
self.assertIs(output, input_tensor)
c_out, c_in = (
input_tensor.shape[0] // groups,
input_tensor.shape[1],
)
min_d = min(c_out, c_in)
assert (
paddle.nonzero(input_tensor).shape[0] == min_d * groups
)
self.assertEqual(input_tensor.sum(), min_d * groups)
def test_dims_error(self):
with dygraph_guard():
with self.assertRaises(AssertionError):
input_tensor = paddle.zeros([5, 5, 1024, 512, 10, 2])
paddle.nn.init.dirac_(input_tensor)
with self.assertRaises(AssertionError):
input_tensor = paddle.zeros([5, 5])
paddle.nn.init.dirac_(input_tensor)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5, 20]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5, 20], dtype='float32'
)
out = paddle.nn.init.dirac_(x, groups=2)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
c_out, c_in = pd_res.shape[0] // 2, pd_res.shape[1]
min_d = min(c_out, c_in)
assert np.nonzero(pd_res)[0].shape[0] == min_d * 2
self.assertEqual(pd_res.sum(), min_d * 2)
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_fp16(self):
with dygraph_guard():
input_tensor = paddle.zeros([5, 5, 1024, 512], dtype='float16')
paddle.nn.init.dirac_(input_tensor)
assert input_tensor.dtype == paddle.float16
class Test_sparse_(unittest.TestCase):
def check(self, tensor, sparsity, std):
if isinstance(tensor, paddle.Tensor):
tensor_np = tensor.numpy()
else:
tensor_np = tensor
total_elements = tensor_np.size
zero_count = np.count_nonzero(tensor_np == 0)
actual_sparsity = zero_count / total_elements
self.assertGreaterEqual(actual_sparsity, sparsity - 0.01)
self.assertLessEqual(actual_sparsity, sparsity + 0.01)
# Check non-zero elements follow normal distribution
non_zero_elements = tensor_np[tensor_np != 0]
if len(non_zero_elements) > 0:
p_value = stats.kstest(non_zero_elements, "norm", args=(0.0, std))[
1
]
self.assertGreater(p_value, 0.0001)
def test_error(self):
input_tensor = paddle.randn([100, 50, 3])
with self.assertRaises(ValueError):
paddle.nn.init.sparse_(input_tensor, sparsity=0.2, std=0.01)
def test_dygraph(self):
if paddle.is_compiled_with_xpu():
self.skipTest("sparsity is not supported on XPU")
with dygraph_guard():
for sparsity in [0.1, 0.5, 0.9]:
input_tensor = paddle.randn([100, 50])
output = paddle.nn.init.sparse_(
input_tensor, sparsity=sparsity, std=0.01
)
self.assertIs(output, input_tensor)
self.check(input_tensor, sparsity, std=0.01)
def test_alias(self):
if paddle.is_compiled_with_xpu():
self.skipTest("sparsity is not supported on XPU")
with dygraph_guard():
for sparsity in [0.1, 0.5, 0.9]:
input_tensor = paddle.randn([100, 50])
output = paddle.nn.init.sparse(
input_tensor, sparsity=sparsity, std=0.01
)
self.assertIs(output, input_tensor)
self.check(input_tensor, sparsity, std=0.01)
def test_static_graph_case(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.random.randn(100, 50).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[100, 50], dtype='float32'
)
out = paddle.nn.init.sparse_(x, sparsity=0.5, std=0.01)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, sparsity=0.5, std=0.01)
class Test_orthogonal_(unittest.TestCase):
def check(self, tensor, gain):
if isinstance(tensor, paddle.Tensor):
tensor = tensor.numpy()
tensor = tensor.reshape([tensor.shape[0], -1])
row, col = tensor.shape
if row > col:
np.testing.assert_allclose(
gain**2 * np.eye(col),
np.matmul(tensor.T, tensor),
rtol=1e-5,
atol=1e-6,
)
else:
np.testing.assert_allclose(
gain**2 * np.eye(row),
np.matmul(tensor, tensor.T),
rtol=1e-5,
atol=1e-6,
)
def test_dygraph(self):
with dygraph_guard():
for use_gain in [True, False]:
for tensor_size in [
[3, 4],
[4, 3],
[20, 2, 3, 4],
[2, 3, 4, 5],
]:
input_tensor = paddle.zeros(tensor_size)
gain = 1.0
if use_gain:
gain = _random_float(0.1, 2)
output = paddle.nn.init.orthogonal_(input_tensor, gain=gain)
self.assertIs(output, input_tensor)
self.check(input_tensor, gain=gain)
def test_dims_error(self):
with dygraph_guard(), self.assertRaises(AssertionError):
input_tensor = paddle.zeros(
[
5,
]
)
paddle.nn.init.orthogonal_(input_tensor)
def test_static_graph_case1(self):
self.place = get_devices()
with static_guard():
for place in self.place:
x_np = np.zeros([10, 5]).astype('float32')
with paddle.static.program_guard(Program()):
x = paddle.static.data(
name="x", shape=[10, 5], dtype='float32'
)
out = paddle.nn.init.orthogonal_(x, gain=0.4)
exe = paddle.static.Executor(place=place)
feed_list = {"x": x_np}
pd_res = exe.run(
paddle.static.default_main_program(),
feed=feed_list,
fetch_list=[out],
)[0]
self.check(pd_res, gain=0.4)
if __name__ == '__main__':
unittest.main()