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

2455 lines
91 KiB
Python

# 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.
import math
import unittest
import numpy as np
from op_test import get_device_place, is_custom_device
from scipy import special
from utils import dygraph_guard, static_guard
import paddle
from paddle.base import framework
from paddle.base.core import VarDesc
from paddle.regularizer import L2Decay
DELTA = 0.00001
def check_cast_op(op):
return (
op.type == 'cast'
and op.attr('in_dtype') == VarDesc.VarType.FP32
and op.attr('out_dtype') in [VarDesc.VarType.FP16, VarDesc.VarType.BF16]
)
def check_cast_op_pir(op):
return (
op.name() == 'pd_op.cast'
and op.attrs()['dtype']
in (
paddle.base.libpaddle.DataType.FLOAT16,
paddle.base.libpaddle.DataType.BFLOAT16,
)
and op.operand_source(0).dtype == paddle.base.libpaddle.DataType.FLOAT32
)
def output_hist(out):
hist, _ = np.histogram(out, range=(-1, 1))
hist = hist.astype("float32")
hist /= float(out.size)
prob = 0.1 * np.ones(10)
return hist, prob
class TestConstantInitializer(unittest.TestCase):
def test_calculate_gain(self):
self.assertEqual(paddle.nn.initializer.calculate_gain('sigmoid'), 1)
self.assertEqual(paddle.nn.initializer.calculate_gain('linear'), 1)
self.assertEqual(paddle.nn.initializer.calculate_gain('conv2d'), 1)
self.assertEqual(paddle.nn.initializer.calculate_gain('tanh'), 5.0 / 3)
self.assertEqual(
paddle.nn.initializer.calculate_gain('relu'), math.sqrt(2.0)
)
self.assertEqual(
paddle.nn.initializer.calculate_gain('leaky_relu', 1), 1
)
self.assertEqual(paddle.nn.initializer.calculate_gain('selu'), 3.0 / 4)
def test_constant_initializer_default_value(self, dtype="float32"):
"""Test the constant initializer with default value"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.Constant(),
)
num_ops = 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'fill_constant')
self.assertAlmostEqual(init_op.attr('value'), 0.0, delta=DELTA)
return block
def test_constant_initializer(self, dtype="float32"):
"""Test constant initializer with supplied value"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.Constant(2.3),
)
num_ops = 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'fill_constant')
self.assertAlmostEqual(init_op.attr('value'), 2.3, delta=DELTA)
return block
def test_constant_initializer_fp16(self):
"""Test constant initializer with float16"""
self.test_constant_initializer_default_value("float16")
self.test_constant_initializer("float16")
def test_constant_initializer_bf16(self):
"""Test constant initializer with bfloat16
No cast operator has been added here
"""
self.test_constant_initializer_default_value("uint16")
self.test_constant_initializer("uint16")
class TestUniformInitializer(unittest.TestCase):
def test_uniform_initializer_default_value(self, dtype="float32"):
"""Test the uniform initializer with default value"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.Uniform(),
)
num_ops = 2 if dtype == "float16" else 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
self.assertAlmostEqual(init_op.attr('min'), -1.0, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), 1.0, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
return block
def test_uniform_initializer_random_seed(self):
"""Test the uniform initializer with manually setting seed"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
program.random_seed = 123
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param1",
initializer=paddle.nn.initializer.Uniform(),
)
block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param2",
initializer=paddle.nn.initializer.UniformInitializer(
seed=456
),
)
init_op = block.ops[1]
self.assertEqual(init_op.attr("seed"), 456)
init_op1 = block.ops[0]
self.assertEqual(init_op1.attr("seed"), 123)
def test_uniform_initializer(self, dtype="float32"):
"""Test uniform initializer with supplied attributes"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.UniformInitializer(
-4.2, 3.1, 123
),
)
num_ops = 2 if dtype == "float16" else 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
self.assertAlmostEqual(init_op.attr('min'), -4.2, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), 3.1, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 123)
return block
def test_uniform_initializer_two_op(self, dtype="float32"):
"""Test uniform initializer with supplied attributes"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for i in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.UniformInitializer(
-4.2, float(i), 123
),
)
num_ops = 2 if dtype == "float16" else 1
self.assertEqual(len(block.ops), num_ops)
init_op0 = block.ops[0]
self.assertEqual(init_op0.type, 'uniform_random')
self.assertAlmostEqual(init_op0.attr('min'), -4.2, delta=DELTA)
self.assertAlmostEqual(init_op0.attr('max'), 0.0, delta=DELTA)
self.assertEqual(init_op0.attr('seed'), 123)
return block
def test_uniform_initializer_fp16(self):
"""Test uniform initializer with float16"""
block = self.test_uniform_initializer_default_value("float16")
self.assertTrue(check_cast_op(block.ops[1]))
block = self.test_uniform_initializer(dtype="float16")
self.assertTrue(check_cast_op(block.ops[1]))
block = self.test_uniform_initializer_two_op("float16")
self.assertTrue(check_cast_op(block.ops[1]))
def test_uniform_initializer_bf16(self):
"""Test uniform initializer with bfloat16
No cast operator has been added here
"""
block = self.test_uniform_initializer_default_value("uint16")
block = self.test_uniform_initializer(dtype="uint16")
block = self.test_uniform_initializer_two_op("uint16")
class TestUniformInitializerPir(unittest.TestCase):
def setUp(self):
self.init_op_name = 'pd_op.uniform'
self.set_parameter_op_name = 'builtin.set_parameter'
def get_operand_definition_op_attrs(self, cur_op, operand_name, attr_name):
input_names = cur_op.get_input_names()
self.assertIn(operand_name, input_names)
attr = (
cur_op.operand(input_names.index(operand_name))
.source()
.get_defining_op()
.attrs()[attr_name]
)
return attr
def test_uniform_initializer_default_value(self, dtype="float32"):
"""Test the uniform initializer with default value"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.Uniform(),
)
block = startup.global_block()
for op in block.ops:
# get init op
if self.init_op_name == op.name():
min = self.get_operand_definition_op_attrs(
op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
op, "max", "value"
)
self.assertAlmostEqual(min, -1.0, delta=DELTA)
self.assertAlmostEqual(max, 1.0, delta=DELTA)
self.assertEqual(op.attrs()['seed'], 0)
def test_uniform_initializer_random_seed(self):
"""Test the uniform initializer with manually setting seed"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
startup.random_seed = 123
with paddle.static.program_guard(main, startup):
param1 = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10],
name="param1",
initializer=paddle.nn.initializer.Uniform(),
)
param2 = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10],
name="param2",
initializer=paddle.nn.initializer.UniformInitializer(
seed=456
),
)
block = startup.global_block()
checked_parameter_names = []
for op in block.ops:
if self.set_parameter_op_name != op.name():
continue
parameter_name = op.attrs()["parameter_name"]
if parameter_name == "param1":
# get "param1"
checked_parameter_names.append(parameter_name)
seed = (
op.operand(0)
.source()
.get_defining_op()
.attrs()['seed']
)
self.assertEqual(seed, 123)
elif parameter_name == "param2":
# get "param2"
checked_parameter_names.append(parameter_name)
seed = (
op.operand(0)
.source()
.get_defining_op()
.attrs()['seed']
)
self.assertEqual(seed, 456)
self.assertIn("param1", checked_parameter_names)
self.assertIn("param2", checked_parameter_names)
def test_uniform_initializer(self, dtype="float32"):
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
initializer = paddle.nn.initializer.UniformInitializer(
low=-0.5,
high=0.5,
seed=10,
diag_num=16,
diag_step=16,
diag_val=1.0,
)
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=initializer,
)
block = startup.global_block()
for op in block.ops:
# get init op
if self.init_op_name == op.name():
self.assertEqual(op.attrs()["seed"], 10)
input_names = op.get_input_names()
self.assertIn('shape', input_names)
self.assertIn('min', input_names)
self.assertIn('max', input_names)
shape = self.get_operand_definition_op_attrs(
op, "shape", "value"
)
min = self.get_operand_definition_op_attrs(
op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
op, "max", "value"
)
self.assertEqual(shape, [5, 10])
self.assertAlmostEqual(min, -0.5, DELTA)
self.assertAlmostEqual(max, 0.5, DELTA)
def test_uniform_initializer_fp16(self):
"""Test uniform initializer with float16"""
self.test_uniform_initializer_default_value(dtype="float16")
self.test_uniform_initializer(dtype="float16")
def test_uniform_initializer_bf16(self):
"""Test uniform initializer with float16"""
self.test_uniform_initializer_default_value(dtype="uint16")
self.test_uniform_initializer(dtype="uint16")
class TestNormalInitializer(unittest.TestCase):
def test_normal_initializer_default_value(self):
"""Test the normal initializer with default value"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.Normal(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), 1.0, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_normal_initializer(self, dtype="float32"):
"""Test normal initializer with supplied attributes"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.NormalInitializer(
2.3, 1.9, 123
),
)
num_ops = 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
self.assertAlmostEqual(init_op.attr('mean'), 2.3, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), 1.9, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 123)
return block
def test_normal_initializer_complex(self, dtype="complex64"):
"""Test normal initializer with complex dtype"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.NormalInitializer(
2.2 + 2.2j, 1.9, 123
),
)
num_ops = 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
self.assertAlmostEqual(init_op.attr('mean'), 2.2, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), 1.9, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 123)
return block
def test_normal_initializer_fp16(self):
"""Test normal initializer with float16"""
self.test_normal_initializer("float16")
def test_normal_initializer_bf16(self):
"""Test normal initializer with bfloat16"""
self.test_normal_initializer("uint16")
def test_normal_initializer_complex64(self):
"""Test normal initializer with complex64"""
self.test_normal_initializer_complex("complex64")
def test_normal_initializer_complex128(self):
"""Test normal initializer with complex128"""
self.test_normal_initializer_complex("complex128")
class TestXavierInitializer(unittest.TestCase):
def test_uniform_xavier_initializer(self):
"""Test Xavier initializer with uniform distribution on
for matrix multiply.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.XavierUniform(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
limit = np.sqrt(6.0 / (param.shape[0] + param.shape[1]))
self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_uniform_xavier_initializer_conv(self):
"""Test Xavier initializer with uniform distribution on
for convolutions.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.XavierUniform(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
receptive_field_size = float(15 * 20)
limit = np.sqrt(
6.0 / ((param.shape[0] + param.shape[1]) * receptive_field_size)
)
self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_normal_xavier_initializer(self):
"""Test Xavier initializer with normal distribution on
for matrix multiply.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.XavierNormal(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
std = np.sqrt(2.0 / (param.shape[0] + param.shape[1]))
self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), std, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_normal_xavier_initializer_conv(self):
"""Test Xavier initializer with normal distribution on
for convolutions.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.XavierNormal(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
receptive_field_size = float(15 * 20)
std = np.sqrt(
2.0 / ((param.shape[0] + param.shape[1]) * receptive_field_size)
)
self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), std, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_xavier_initializer_supplied_arguments(
self, dtype="float32", uniform=True
):
"""Test the Xavier initializer with supplied arguments"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.XavierInitializer(
uniform=uniform,
fan_in=12,
fan_out=23,
seed=134,
gain=0.2,
),
)
num_ops = (
2
if (dtype == "float16" or (dtype == "uint16" and not uniform))
else 1
)
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
if uniform:
self.assertEqual(init_op.type, 'uniform_random')
limit = 0.2 * np.sqrt(6.0 / (12 + 23))
self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA)
else:
self.assertEqual(init_op.type, 'gaussian_random')
self.assertEqual(init_op.attr('seed'), 134)
return block
def test_xavier_initializer_fp16(self):
"""Test the Xavier initializer with float16"""
block = self.test_xavier_initializer_supplied_arguments("float16")
def test_xavier_initializer_bf16(self):
"""Test the Xavier initializer with bfloat16"""
block_uniform = self.test_xavier_initializer_supplied_arguments(
"uint16"
)
self.assertEqual(len(block_uniform.ops), 1)
block_gaussian = self.test_xavier_initializer_supplied_arguments(
"uint16", False
)
class TestXavierInitializerPir(unittest.TestCase):
def setUp(self):
self.init_uniform_op_name = 'pd_op.uniform'
self.init_normal_op_name = 'pd_op.gaussian'
self.set_parameter_op_name = 'builtin.set_parameter'
def get_operand_definition_op_attrs(self, cur_op, operand_name, attr_name):
input_names = cur_op.get_input_names()
self.assertIn(operand_name, input_names)
attr = (
cur_op.operand(input_names.index(operand_name))
.source()
.get_defining_op()
.attrs()[attr_name]
)
return attr
def get_init_ops_by_op_name(self, block, op_name):
checked_ops = []
for op in block.ops:
# get init op
if op_name == op.name():
checked_ops.append(op)
return checked_ops
def test_uniform_xavier_initializer(self):
"""Test Xavier initializer with uniform distribution on
for matrix multiply.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.XavierUniform(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_uniform_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
limit = np.sqrt(6.0 / (param.shape[0] + param.shape[1]))
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_uniform_xavier_initializer_zero_size(self):
"""Test Xavier initializer with uniform distribution on
for matrix multiply.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[0, 0],
name="param",
initializer=paddle.nn.initializer.XavierUniform(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_uniform_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
limit = 0.0
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_uniform_xavier_initializer_conv(self):
"""Test Xavier initializer with uniform distribution on
for convolutions.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.XavierUniform(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_uniform_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
receptive_field_size = float(15 * 20)
limit = np.sqrt(
6.0
/ ((param.shape[0] + param.shape[1]) * receptive_field_size)
)
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_normal_xavier_initializer(self):
"""Test Xavier initializer with normal distribution on
for matrix multiply.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.XavierNormal(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_normal_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
std = np.sqrt(2.0 / (param.shape[0] + param.shape[1]))
self.assertAlmostEqual(
init_op.attrs()["mean"], 0.0, delta=DELTA
)
self.assertAlmostEqual(init_op.attrs()["std"], std, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_normal_xavier_initializer_zero_size(self):
"""Test Xavier initializer with normal distribution on
for matrix multiply.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[0, 0],
name="param",
initializer=paddle.nn.initializer.XavierNormal(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_normal_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
std = 0.0
self.assertAlmostEqual(
init_op.attrs()["mean"], 0.0, delta=DELTA
)
self.assertAlmostEqual(init_op.attrs()["std"], std, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_normal_xavier_initializer_conv(self):
"""Test Xavier initializer with normal distribution on
for convolutions.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.XavierNormal(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_normal_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
receptive_field_size = float(15 * 20)
std = np.sqrt(
2.0
/ ((param.shape[0] + param.shape[1]) * receptive_field_size)
)
self.assertAlmostEqual(
init_op.attrs()['mean'], 0.0, delta=DELTA
)
self.assertAlmostEqual(init_op.attrs()['std'], std, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_xavier_initializer_supplied_arguments(
self, dtype="float32", uniform=True
):
"""Test the Xavier initializer with supplied arguments"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.XavierInitializer(
uniform=uniform,
fan_in=12,
fan_out=23,
seed=134,
gain=0.2,
),
)
block = startup.global_block()
init_op_name = (
self.init_uniform_op_name
if uniform
else self.init_normal_op_name
)
checked_ops = self.get_init_ops_by_op_name(block, init_op_name)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
if uniform:
limit = 0.2 * np.sqrt(6.0 / (12 + 23))
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 134)
return main, startup
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_xavier_initializer_fp16(self):
"""Test the Xavier initializer with float16"""
main_1, startup_1 = self.test_xavier_initializer_supplied_arguments(
"float16"
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_1)
exe.run(main_1)
main_2, startup_2 = self.test_xavier_initializer_supplied_arguments(
"float16", uniform=False
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_2)
exe.run(main_2)
@unittest.skipIf(
not (paddle.base.core.is_compiled_with_cuda() or is_custom_device())
or not paddle.base.core.is_bfloat16_supported(get_device_place()),
"core is not compiled with CUDA and do not support bfloat16",
)
def test_xavier_initializer_bf16(self):
"""Test the Xavier initializer with bfloat16"""
main_1, startup_1 = self.test_xavier_initializer_supplied_arguments(
"uint16"
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_1)
exe.run(main_1)
main_2, startup_2 = self.test_xavier_initializer_supplied_arguments(
"uint16", False
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_2)
exe.run(main_2)
class TestMSRAInitializer(unittest.TestCase):
def test_uniform_msra_initializer(self):
"""Test MSRA initializer with uniform distribution on
for matrix multiply.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.KaimingUniform(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
limit = np.sqrt(6.0 / param.shape[0])
self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_uniform_msra_initializer_conv(self):
"""Test MSRA initializer with uniform distribution on
for convolutions.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.KaimingUniform(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
receptive_field_size = float(15 * 20)
limit = np.sqrt(6.0 / (param.shape[1] * receptive_field_size))
self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_normal_msra_initializer(self):
"""Test MSRA initializer with normal distribution on
for matrix multiply.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.KaimingNormal(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
std = np.sqrt(2.0 / param.shape[0])
self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), std, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_normal_msra_initializer_conv(self):
"""Test MSRA initializer with normal distribution on
for convolutions.
"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
param = block.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.KaimingNormal(),
)
self.assertEqual(len(block.ops), 1)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'gaussian_random')
receptive_field_size = float(15 * 20)
std = np.sqrt(2.0 / (param.shape[1] * receptive_field_size))
self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA)
self.assertAlmostEqual(init_op.attr('std'), std, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 0)
def test_msra_initializer_supplied_arguments(self, dtype="float32"):
"""Test the MSRA initializer with supplied arguments"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.MSRAInitializer(
fan_in=12, seed=134
),
)
num_ops = 2 if dtype == "float16" else 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'uniform_random')
limit = np.sqrt(6.0 / 12)
self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA)
self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA)
self.assertEqual(init_op.attr('seed'), 134)
return block
def test_msra_initializer_fp16(self):
"""Test the MSRA initializer with float16"""
block = self.test_msra_initializer_supplied_arguments("float16")
self.assertTrue(check_cast_op(block.ops[1]))
def test_msra_initializer_bf16(self):
"""Test the MSRA initializer with bfloat16"""
block = self.test_msra_initializer_supplied_arguments("uint16")
class TestMSRAInitializerPir(unittest.TestCase):
def setUp(self):
self.init_uniform_op_name = 'pd_op.uniform'
self.init_normal_op_name = 'pd_op.gaussian'
self.set_parameter_op_name = 'builtin.set_parameter'
def get_operand_definition_op_attrs(self, cur_op, operand_name, attr_name):
input_names = cur_op.get_input_names()
self.assertIn(operand_name, input_names)
attr = (
cur_op.operand(input_names.index(operand_name))
.source()
.get_defining_op()
.attrs()[attr_name]
)
return attr
def get_init_ops_by_op_name(self, block, op_name):
checked_ops = []
for op in block.ops:
# get init op
if op_name == op.name():
checked_ops.append(op)
return checked_ops
def test_uniform_msra_initializer(self):
"""Test MSRA initializer with uniform distribution on
for matrix multiply.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.KaimingUniform(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_uniform_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
limit = np.sqrt(6.0 / param.shape[0])
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_uniform_msra_initializer_conv(self):
"""Test MSRA initializer with uniform distribution on
for convolutions.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.KaimingUniform(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_uniform_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
receptive_field_size = float(15 * 20)
limit = np.sqrt(6.0 / (param.shape[1] * receptive_field_size))
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_normal_msra_initializer(self):
"""Test MSRA initializer with normal distribution on
for matrix multiply.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.KaimingNormal(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_normal_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
std = np.sqrt(2.0 / param.shape[0])
self.assertAlmostEqual(
init_op.attrs()['mean'], 0.0, delta=DELTA
)
self.assertAlmostEqual(init_op.attrs()['std'], std, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_normal_msra_initializer_conv(self):
"""Test MSRA initializer with normal distribution on
for convolutions.
"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype="float32",
shape=[5, 10, 15, 20],
name="param",
initializer=paddle.nn.initializer.KaimingNormal(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_normal_op_name
)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
receptive_field_size = float(15 * 20)
std = np.sqrt(2.0 / (param.shape[1] * receptive_field_size))
self.assertAlmostEqual(
init_op.attrs()['mean'], 0.0, delta=DELTA
)
self.assertAlmostEqual(init_op.attrs()['std'], std, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 0)
def test_msra_initializer_supplied_arguments(
self, dtype="float32", uniform=True
):
"""Test the MSRA initializer with supplied arguments"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=[5, 10],
name="param",
initializer=paddle.nn.initializer.MSRAInitializer(
fan_in=12, seed=134, uniform=uniform
),
)
block = startup.global_block()
init_op_name = (
self.init_uniform_op_name
if uniform
else self.init_normal_op_name
)
checked_ops = self.get_init_ops_by_op_name(block, init_op_name)
self.assertEqual(len(checked_ops), 1)
init_op = checked_ops[0]
if uniform:
limit = np.sqrt(6.0 / 12)
min = self.get_operand_definition_op_attrs(
init_op, "min", "value"
)
max = self.get_operand_definition_op_attrs(
init_op, "max", "value"
)
self.assertAlmostEqual(min, -limit, delta=DELTA)
self.assertAlmostEqual(max, limit, delta=DELTA)
self.assertEqual(init_op.attrs()['seed'], 134)
return main, startup
@unittest.skipIf(
not (paddle.is_compiled_with_cuda() or is_custom_device()),
"core is not compiled with CUDA",
)
def test_msra_initializer_fp16(self):
"""Test the MSRA initializer with float16"""
main_1, startup_1 = self.test_msra_initializer_supplied_arguments(
"float16"
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_1)
exe.run(main_1)
main_2, startup_2 = self.test_msra_initializer_supplied_arguments(
"float16", uniform=False
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_2)
exe.run(main_2)
@unittest.skipIf(
not (paddle.base.core.is_compiled_with_cuda() or is_custom_device())
or not paddle.base.core.is_bfloat16_supported(get_device_place()),
"core is not compiled with CUDA and do not support bfloat16",
)
def test_msra_initializer_bf16(self):
"""Test the MSRA initializer with bfloat16"""
main_1, startup_1 = self.test_msra_initializer_supplied_arguments(
"uint16"
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_1)
exe.run(main_1)
main_2, startup_2 = self.test_msra_initializer_supplied_arguments(
"uint16", uniform=False
)
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(get_device_place())
exe.run(startup_2)
exe.run(main_2)
class TestBilinearInitializer(unittest.TestCase):
def test_bilinear_initializer(self, dtype="float32"):
"""Test the bilinear initializer with supplied arguments"""
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
for _ in range(2):
block.create_parameter(
dtype=dtype,
shape=[8, 1, 3, 3],
name="param",
initializer=paddle.nn.initializer.Bilinear(),
)
num_ops = 2 if dtype in ["float16", "uint16", "float64"] else 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'assign_value')
return block
def test_bilinear_initializer_fp64(self):
self.test_bilinear_initializer(dtype='float64')
def test_bilinear_initializer_fp16(self):
"""Test the bilinear initializer with supplied arguments"""
block = self.test_bilinear_initializer("float16")
self.assertTrue(check_cast_op(block.ops[1]))
def test_bilinear_initializer_bf16(self):
"""Test the bilinear initializer with supplied arguments"""
block = self.test_bilinear_initializer("uint16")
self.assertTrue(check_cast_op(block.ops[1]))
def test_type_error(self):
self.assertRaises(TypeError, self.test_bilinear_initializer, 'int32')
class TestBilinearInitializerPir(unittest.TestCase):
def setUp(self):
self.set_parameter_op_name = 'builtin.set_parameter'
self.init_op_name = "pd_op.assign_value"
self.cast_op_name = "pd_op.cast"
def get_operand_definition_op_attrs(self, cur_op, operand_name, attr_name):
input_names = cur_op.get_input_names()
self.assertIn(operand_name, input_names)
attr = (
cur_op.operand(input_names.index(operand_name))
.source()
.get_defining_op()
.attrs()[attr_name]
)
return attr
def get_init_ops_by_op_name(self, block, op_name):
checked_ops = []
for op in block.ops:
# get init op
if op_name == op.name():
checked_ops.append(op)
return checked_ops
def test_bilinear_initializer(self, dtype="float32"):
"""Test the bilinear initializer with supplied arguments"""
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=[8, 1, 3, 3],
name="param",
initializer=paddle.nn.initializer.Bilinear(),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_op_name
)
self.assertEqual(len(checked_ops), 1)
checked_cast_ops = self.get_init_ops_by_op_name(
block, self.cast_op_name
)
num_cast_op = (
1 if dtype in ["float16", "uint16", "float64"] else 0
)
self.assertEqual(len(checked_cast_ops), num_cast_op)
return startup
def test_bilinear_initializer_fp64(self):
self.test_bilinear_initializer(dtype='float64')
def test_bilinear_initializer_fp16(self):
"""Test the bilinear initializer with supplied arguments"""
startup = self.test_bilinear_initializer("float16")
cast_ops = self.get_init_ops_by_op_name(
startup.global_block(), self.cast_op_name
)
self.assertGreater(len(cast_ops), 0)
cast_op = cast_ops[0]
self.assertTrue(check_cast_op_pir(cast_op))
def test_bilinear_initializer_bf16(self):
"""Test the bilinear initializer with supplied arguments"""
startup = self.test_bilinear_initializer("uint16")
cast_ops = self.get_init_ops_by_op_name(
startup.global_block(), self.cast_op_name
)
self.assertGreater(len(cast_ops), 0)
cast_op = cast_ops[0]
self.assertTrue(check_cast_op_pir(cast_op))
def test_type_error(self):
self.assertRaises(TypeError, self.test_bilinear_initializer, 'int32')
class TestBilinearInitializerDygraphAPI(unittest.TestCase):
def func_test_case(self):
factor = 2
C = 2
B = 8
H = W = 32
w_attr = paddle.ParamAttr(
learning_rate=0.0,
regularizer=L2Decay(0.0),
initializer=paddle.nn.initializer.Bilinear(),
)
data = paddle.rand([B, 3, H, W], dtype='float32')
conv_up = paddle.nn.Conv2DTranspose(
3,
out_channels=C,
kernel_size=2 * factor - factor % 2,
padding=int(math.ceil((factor - 1) / 2.0)),
stride=factor,
weight_attr=w_attr,
bias_attr=False,
)
x = conv_up(data)
return x
def func_test_case_fp16(self):
paddle.set_default_dtype("float16")
paddle.seed(1234)
w_attr = paddle.ParamAttr(
learning_rate=0.0,
regularizer=L2Decay(0.0),
initializer=paddle.nn.initializer.Bilinear(),
)
conv2d = paddle.nn.Conv2D(1, 2, 3, weight_attr=w_attr)
paddle.set_default_dtype("float32")
return conv2d.weight
def test_bilinear_initializer(self):
paddle.disable_static()
eager_x = self.func_test_case()
legacy_x = self.func_test_case()
self.assertEqual(eager_x.numpy().all(), legacy_x.numpy().all())
paddle.enable_static()
def test_bilinear_initializer_fp16(self):
paddle.disable_static()
eager_x = self.func_test_case_fp16()
legacy_x = self.func_test_case_fp16()
self.assertEqual(eager_x.numpy().all(), legacy_x.numpy().all())
paddle.enable_static()
class TestNumpyArrayInitializer(unittest.TestCase):
def test_numpy_array_initializer(self, dtype="float32"):
"""Test the numpy array initializer with supplied arguments"""
import numpy
with paddle.pir_utils.OldIrGuard():
program = framework.Program()
block = program.global_block()
np_array = numpy.random.random(10000).astype(dtype)
for _ in range(2):
block.create_parameter(
dtype=np_array.dtype,
shape=np_array.shape,
name="param",
initializer=paddle.nn.initializer.Assign(np_array),
)
num_ops = 2 if dtype in ["float16", "uint16"] else 1
self.assertEqual(len(block.ops), num_ops)
init_op = block.ops[0]
self.assertEqual(init_op.type, 'assign_value')
values = framework.extract_plain_list(init_op.attr('values'))
assert values == np_array.ravel().tolist()
return block
def test_numpy_array_initializer_fp16(self):
"""Test the numpy array initializer with float16"""
block = self.test_numpy_array_initializer("float16")
self.assertTrue(block.ops[1])
def test_numpy_array_initializer_bf16(self):
"""Test the numpy array initializer with bfloat16"""
block = self.test_numpy_array_initializer("uint16")
self.assertTrue(block.ops[1])
class TestNumpyArrayInitializerPir(unittest.TestCase):
def setUp(self):
self.set_parameter_op_name = 'builtin.set_parameter'
self.init_op_name = "pd_op.assign_value"
self.cast_op_name = "pd_op.cast"
def get_operand_definition_op_attrs(self, cur_op, operand_name, attr_name):
input_names = cur_op.get_input_names()
self.assertIn(operand_name, input_names)
attr = (
cur_op.operand(input_names.index(operand_name))
.source()
.get_defining_op()
.attrs()[attr_name]
)
return attr
def get_init_ops_by_op_name(self, block, op_name):
checked_ops = []
for op in block.ops:
# get init op
if op_name == op.name():
checked_ops.append(op)
return checked_ops
def test_numpy_array_initializer(self, dtype="float32"):
"""Test the numpy array initializer with supplied arguments"""
np_array = np.random.random(10000).astype(dtype)
with paddle.pir_utils.IrGuard():
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=np_array.dtype,
shape=np_array.shape,
name="param",
initializer=paddle.nn.initializer.Assign(np_array),
)
block = startup.global_block()
checked_ops = self.get_init_ops_by_op_name(
block, self.init_op_name
)
self.assertEqual(len(checked_ops), 1)
checked_cast_ops = self.get_init_ops_by_op_name(
block, self.cast_op_name
)
num_cast_op = 1 if dtype in ["float16", "uint16"] else 0
self.assertEqual(len(checked_cast_ops), num_cast_op)
init_op = checked_ops[0]
assert (init_op.attrs()['values'] == np_array).all()
return startup
def test_numpy_array_initializer_fp16(self):
"""Test the numpy array initializer with float16"""
startup = self.test_numpy_array_initializer("float16")
cast_ops = self.get_init_ops_by_op_name(
startup.global_block(), self.cast_op_name
)
self.assertGreater(len(cast_ops), 0)
cast_op = cast_ops[0]
self.assertTrue(check_cast_op_pir(cast_op))
def test_numpy_array_initializer_bf16(self):
"""Test the numpy array initializer with bfloat16"""
startup = self.test_numpy_array_initializer("uint16")
cast_ops = self.get_init_ops_by_op_name(
startup.global_block(), self.cast_op_name
)
self.assertGreater(len(cast_ops), 0)
cast_op = cast_ops[0]
self.assertTrue(check_cast_op_pir(cast_op))
class TestUniformInitializerDygraph(unittest.TestCase):
def test_uniform_initializer(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([1024, 1024, 16])
tensor.stop_gradient = False
np.testing.assert_allclose(
np.zeros((1024, 1024, 16)), tensor.numpy(), rtol=1e-05
)
uniform_ = paddle.nn.initializer.Uniform()
uniform_(tensor)
self.assertEqual(
tensor.stop_gradient, False
) # stop_gradient is not changed
hist, prob = output_hist(tensor.numpy())
np.testing.assert_allclose(hist, prob, rtol=0, atol=0.001)
paddle.enable_static()
class TestXavierInitializerDygraph(unittest.TestCase):
def test_xavier_initializer(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([1024, 1024, 16])
tensor.stop_gradient = False
xavier_ = paddle.nn.initializer.XavierNormal(fan_in=3, fan_out=5)
xavier_(tensor)
hist, _ = output_hist(tensor.numpy())
hist2, _ = output_hist(
np.random.normal(0, np.sqrt(2.0 / (3 + 5)), [1024, 1024, 16])
)
np.testing.assert_allclose(hist, hist2, rtol=0, atol=0.01)
paddle.enable_static()
def test_xavier_normal_initializer_zero_size(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([0, 0, 0])
tensor.stop_gradient = False
xavier_ = paddle.nn.initializer.XavierNormal(fan_in=0, fan_out=0)
xavier_(tensor)
self.assertEqual(tensor.stop_gradient, False)
self.assertEqual(tensor.shape, [0, 0, 0])
paddle.enable_static()
def test_xavier_uniform_initializer_zero_size(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([0, 0, 0])
tensor.stop_gradient = False
xavier_ = paddle.nn.initializer.XavierUniform(fan_in=0, fan_out=0)
xavier_(tensor)
self.assertEqual(tensor.stop_gradient, False)
self.assertEqual(tensor.shape, [0, 0, 0])
paddle.enable_static()
class TestXavierInitializerDygraph2(unittest.TestCase):
def test_xavier_initializer_with_gain(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([1024, 1024, 16])
tensor.stop_gradient = False
xavier_ = paddle.nn.initializer.XavierNormal(
fan_in=3, fan_out=5, gain=2.5
)
xavier_(tensor)
hist, _ = output_hist(tensor.numpy())
hist2, _ = output_hist(
np.random.normal(0, 2.5 * np.sqrt(2.0 / (3 + 5)), [1024, 1024, 16])
)
np.testing.assert_allclose(hist, hist2, rtol=0, atol=0.01)
paddle.enable_static()
class TestMSRAInitializerDygraph(unittest.TestCase):
def test_msra_initializer(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([1024, 1024, 16])
tensor.stop_gradient = False
msra_ = paddle.nn.initializer.KaimingNormal(fan_in=4)
msra_(tensor)
hist, _ = output_hist(tensor.numpy())
hist2, _ = output_hist(
np.random.normal(0, np.sqrt(2.0 / (4)), [1024, 1024, 16])
)
np.testing.assert_allclose(hist, hist2, rtol=0, atol=0.01)
paddle.enable_static()
class TestMSRAInitializerFanoutDygraph(unittest.TestCase):
def test_msra_fanout_initializer(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([16, 1024])
tensor.stop_gradient = False
msra_ = paddle.nn.initializer.KaimingNormal(mode='fan_out')
msra_(tensor)
hist, _ = output_hist(tensor.numpy())
hist2, _ = output_hist(
np.random.normal(0, np.sqrt(2.0 / (1024)), [16, 1024])
)
np.testing.assert_allclose(hist, hist2, rtol=0, atol=0.01)
paddle.enable_static()
def test_msra_invalid_fanout_initializer(self, dtype="float32"):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
paddle.disable_static()
tensor = paddle.zeros([16, 1024])
tensor.stop_gradient = False
with self.assertRaises(ValueError):
msra_ = paddle.nn.initializer.KaimingNormal(mode='fan')
msra_(tensor)
with self.assertRaises(ValueError):
msra_ = paddle.nn.initializer.KaimingNormal(
fan_in=1, mode='fan_out'
)
msra_(tensor)
def test_msra_uniform_fanout_initializer(self, dtype="float32"):
paddle.disable_static()
tensor = paddle.zeros([16, 1024])
tensor.stop_gradient = False
msra_ = paddle.nn.initializer.KaimingUniform(mode='fan_out')
msra_(tensor)
hist, _ = output_hist(tensor.numpy())
fan_out = tensor.shape[1]
limit = np.sqrt(6.0 / fan_out)
theory_data = np.random.uniform(-limit, limit, [16, 1024])
hist2, _ = output_hist(theory_data)
np.testing.assert_allclose(hist, hist2, rtol=0, atol=0.01)
paddle.enable_static()
class TestConsistencyOfDynamicAndStaticGraph(unittest.TestCase):
def test_order(self):
paddle.set_device('cpu')
SEED = 123
weight_attr = paddle.framework.ParamAttr(
name="linear_weight2",
learning_rate=1.0,
trainable=False,
regularizer=None,
initializer=paddle.nn.initializer.TruncatedNormal(
mean=0.0, std=2.0
),
)
bias_attr = paddle.framework.ParamAttr(
name="linear_bias2",
learning_rate=1.0,
trainable=False,
regularizer=None,
initializer=paddle.nn.initializer.TruncatedNormal(
mean=0.0, std=2.0
),
)
def run_dynamic_graph():
paddle.seed(SEED)
linear = paddle.nn.Linear(
1,
1,
weight_attr=paddle.framework.ParamAttr(
name="linear_weight1",
learning_rate=1.0,
trainable=False,
regularizer=None,
initializer=paddle.nn.initializer.TruncatedNormal(
mean=0.0, std=2.0
),
),
bias_attr=paddle.framework.ParamAttr(
name="linear_bias1",
learning_rate=1.0,
trainable=False,
regularizer=None,
initializer=paddle.nn.initializer.TruncatedNormal(
mean=0.0, std=2.0
),
),
)
return linear.weight.numpy(), linear.bias.numpy()
def run_static_graph():
exe = paddle.static.Executor(paddle.CPUPlace())
paddle.seed(SEED)
linear = paddle.nn.Linear(
1, 1, weight_attr=weight_attr, bias_attr=bias_attr
)
res = exe.run(
paddle.static.default_startup_program(),
fetch_list=[linear.weight, linear.bias],
)
return res[0], res[1]
with dygraph_guard():
dynamic_res = run_dynamic_graph()
with static_guard():
static_res = run_static_graph()
np.testing.assert_array_equal(dynamic_res[0], static_res[0])
np.testing.assert_array_equal(dynamic_res[1], static_res[1])
def test_assign_static_fp32(self):
random_value = np.random.randn(128, 128).astype("float32")
def run_dynamic_graph(dtype):
with dygraph_guard():
w = paddle.create_parameter(
random_value.shape,
dtype,
default_initializer=paddle.nn.initializer.Assign(
random_value
),
)
return w
def run_static_graph(dtype):
with static_guard():
exe = paddle.static.Executor(paddle.CPUPlace())
w = paddle.create_parameter(
random_value.shape,
dtype,
"w",
default_initializer=paddle.nn.initializer.Assign(
random_value
),
)
res = exe.run(
paddle.static.default_startup_program(),
fetch_list=w,
)
return res[0]
def run_pir_graph(dtype):
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(paddle.CPUPlace())
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=random_value.shape,
name="w",
initializer=paddle.nn.initializer.Assign(random_value),
)
exe.run(startup)
res = exe.run(main, fetch_list=[param])
return res[0]
dynamic_res = run_dynamic_graph("float32")
static_res = run_static_graph("float32")
pir_res = run_pir_graph("float32")
np.testing.assert_array_equal(dynamic_res.numpy(), static_res)
np.testing.assert_array_equal(dynamic_res.numpy(), pir_res)
def test_assign_static_fp64(self):
random_value = np.random.randn(128, 128).astype("float64")
def run_dynamic_graph(dtype):
with dygraph_guard():
w = paddle.create_parameter(
random_value.shape,
dtype,
"www",
default_initializer=paddle.nn.initializer.Assign(
random_value
),
)
return w
def run_static_graph(dtype):
with static_guard():
exe = paddle.static.Executor(paddle.CPUPlace())
w = paddle.create_parameter(
random_value.shape,
dtype,
"ww",
default_initializer=paddle.nn.initializer.Assign(
random_value
),
)
res = exe.run(
paddle.static.default_startup_program(),
fetch_list=w,
)
return res[0]
def run_pir_graph(dtype):
with paddle.pir_utils.IrGuard():
exe = paddle.static.Executor(paddle.CPUPlace())
main = paddle.static.Program()
startup = paddle.static.Program()
with paddle.static.program_guard(main, startup):
param = paddle.pir.core.create_parameter(
dtype=dtype,
shape=random_value.shape,
name="ww",
initializer=paddle.nn.initializer.Assign(random_value),
)
exe.run(startup)
res = exe.run(main, fetch_list=[param])
return res[0]
dynamic_res = run_dynamic_graph("float64")
static_res = run_static_graph("float64")
pir_res = run_pir_graph("float64")
np.testing.assert_array_equal(dynamic_res.numpy(), static_res)
np.testing.assert_array_equal(dynamic_res.numpy(), pir_res)
# 2-D Parameter with shape: [10, 15]
class TestOrthogonalInitializer1(unittest.TestCase):
"""
case 1
"""
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Orthogonal(gain=3.0)
)
self.dtype = "float64"
self.in_features = 10
self.out_features = 15
self.num_ops = 9
def check_result(self, a, b):
np.testing.assert_array_equal(a, b)
np.testing.assert_allclose(
np.matmul(a, a.T), 9 * np.eye(10), rtol=1e-5, atol=1e-8
)
def test_orthogonal(self):
self.config()
paddle.set_default_dtype(self.dtype)
paddle.disable_static()
paddle.seed(2021)
linear = paddle.nn.Linear(
self.in_features, self.out_features, weight_attr=self.weight_attr
)
res_dygraph = linear.weight.numpy()
paddle.enable_static()
paddle.seed(2021)
start_prog = paddle.static.Program()
main_prog = paddle.static.Program()
with paddle.static.program_guard(main_prog, start_prog):
linear = paddle.nn.Linear(
self.in_features,
self.out_features,
weight_attr=self.weight_attr,
)
block = start_prog.global_block()
if not paddle.framework.use_pir_api():
self.assertEqual(len(block.ops), self.num_ops)
self.assertEqual(block.ops[0].type, 'gaussian_random')
self.assertEqual(block.ops[1].type, 'qr')
self.assertEqual(block.ops[2].type, 'diag_v2')
self.assertEqual(block.ops[3].type, 'sign')
self.assertEqual(block.ops[4].type, 'elementwise_mul')
self.assertEqual(block.ops[-3].type, 'reshape2')
self.assertEqual(block.ops[-2].type, 'scale')
exe = paddle.static.Executor()
res_static = exe.run(start_prog, fetch_list=[linear.weight])[0]
self.check_result(res_dygraph, res_static)
def test_orthogonal_pir(self):
self.config()
paddle.set_default_dtype(self.dtype)
paddle.disable_static()
paddle.seed(2021)
linear = paddle.nn.Linear(
self.in_features, self.out_features, weight_attr=self.weight_attr
)
res_dygraph = linear.weight.numpy()
paddle.enable_static()
paddle.seed(2021)
start_prog = paddle.static.Program()
main_prog = paddle.static.Program()
with paddle.static.program_guard(main_prog, start_prog):
linear = paddle.nn.Linear(
self.in_features,
self.out_features,
weight_attr=self.weight_attr,
)
exe = paddle.static.Executor()
res_static = exe.run(start_prog, fetch_list=[linear.weight])[0]
self.check_result(res_dygraph, res_static)
# 2-D Parameter with shape: [15, 10]
class TestOrthogonalInitializer2(TestOrthogonalInitializer1):
"""
case 2
"""
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Orthogonal(gain=2.0)
)
self.dtype = "float64"
self.in_features = 15
self.out_features = 10
self.num_ops = 8
def check_result(self, a, b):
np.testing.assert_array_equal(a, b)
np.testing.assert_allclose(
np.matmul(a.T, a), 4 * np.eye(10), rtol=1e-5, atol=1e-8
)
# 2-D Parameter with shape: [10, 10]
class TestOrthogonalInitializer3(TestOrthogonalInitializer1):
"""
case 3
"""
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Orthogonal()
)
self.dtype = "float32"
self.in_features = 10
self.out_features = 10
self.num_ops = 8
def check_result(self, a, b):
np.testing.assert_array_equal(a, b)
np.testing.assert_allclose(
np.matmul(a.T, a), np.eye(10), rtol=1e-05, atol=1e-06
)
np.testing.assert_allclose(
np.matmul(a, a.T), np.eye(10), rtol=1e-05, atol=1e-06
)
def test_error(self):
self.config()
with self.assertRaises(AssertionError):
paddle.nn.Linear(10, 10, bias_attr=self.weight_attr)
# 4-D Parameter with shape: [6, 4, 3, 3]
class TestOrthogonalInitializer4(unittest.TestCase):
"""
case 4
"""
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Orthogonal(gain=3.0)
)
self.dtype = "float64"
self.in_features = 4
self.out_features = 6
self.kernel_size = (3, 3)
def check_result(self, a, b):
np.testing.assert_array_equal(a, b)
a = a.reshape(6, -1)
np.testing.assert_allclose(
np.matmul(a, a.T), 9 * np.eye(6), rtol=1e-5, atol=1e-8
)
def test_orthogonal(self):
self.config()
paddle.set_default_dtype(self.dtype)
paddle.disable_static()
paddle.seed(2021)
conv2d = paddle.nn.Conv2D(
self.in_features,
self.out_features,
self.kernel_size,
weight_attr=self.weight_attr,
)
res_dygraph = conv2d.weight.numpy()
paddle.enable_static()
paddle.seed(2021)
start_prog = paddle.static.Program()
main_prog = paddle.static.Program()
with paddle.static.program_guard(main_prog, start_prog):
inp = paddle.rand(shape=[8, self.in_features, 10, 10])
conv2d = paddle.nn.Conv2D(
self.in_features,
self.out_features,
self.kernel_size,
weight_attr=self.weight_attr,
)
output = conv2d(inp)
exe = paddle.static.Executor()
exe.run(start_prog)
res_static = exe.run(main_prog, fetch_list=[conv2d.weight])[0]
self.check_result(res_dygraph, res_static)
# 4-D Parameter with shape: [50, 4, 3, 3]
class TestOrthogonalInitializer5(TestOrthogonalInitializer4):
"""
case 5
"""
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Orthogonal(gain=2.0)
)
self.dtype = "float64"
self.in_features = 4
self.out_features = 50
self.kernel_size = (3, 3)
def check_result(self, a, b):
np.testing.assert_array_equal(a, b)
a = a.reshape(50, -1)
np.testing.assert_allclose(
np.matmul(a.T, a), 4 * np.eye(36), rtol=1e-5, atol=1e-8
)
# 4-D Parameter with shape: [36, 4, 3, 3]
class TestOrthogonalInitializer6(TestOrthogonalInitializer4):
"""
case 6
"""
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Orthogonal()
)
self.dtype = "float32"
self.in_features = 4
self.out_features = 36
self.kernel_size = (3, 3)
def check_result(self, a, b):
np.testing.assert_array_equal(a, b)
a = a.reshape(36, -1)
np.testing.assert_allclose(
np.matmul(a.T, a), np.eye(36), rtol=1e-05, atol=1e-06
)
np.testing.assert_allclose(
np.matmul(a, a.T), np.eye(36), rtol=1e-05, atol=1e-06
)
# initialize Conv1D weight
class TestDiracInitializer1(unittest.TestCase):
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Dirac()
)
self.dtype = "float64"
self.in_channels = 3
self.out_channels = 2
self.kernel_size = 3
self.input_shape = [8, self.in_channels, 10]
self.conv_layer = paddle.nn.Conv1D
self.num_ops = (
8 # fill_constant*2, reshape*2, assign_value*2, scatter, cast
)
def check_result(self, w_dygraph, w_static, conv_in, conv_out):
np.testing.assert_array_equal(w_dygraph, w_static)
np.testing.assert_array_equal(conv_out, conv_in[:, 0:2, 1:9])
def test_dirac(self):
self.config()
paddle.set_default_dtype(self.dtype)
paddle.disable_static()
conv = self.conv_layer(
self.in_channels,
self.out_channels,
self.kernel_size,
weight_attr=self.weight_attr,
)
weight_dygraph = conv.weight.numpy()
paddle.enable_static()
start_prog = paddle.static.Program()
main_prog = paddle.static.Program()
with paddle.static.program_guard(main_prog, start_prog):
inp = paddle.rand(self.input_shape)
conv = self.conv_layer(
self.in_channels,
self.out_channels,
self.kernel_size,
weight_attr=self.weight_attr,
)
output = conv(inp)
block = start_prog.global_block()
if not paddle.framework.use_pir_api():
self.assertEqual(len(block.ops), self.num_ops)
self.assertEqual(block.ops[0].type, 'fill_constant')
self.assertEqual(block.ops[1].type, 'reshape2')
self.assertEqual(block.ops[2].type, 'assign_value')
self.assertEqual(block.ops[3].type, 'assign_value')
self.assertEqual(block.ops[4].type, 'scatter')
self.assertEqual(block.ops[5].type, 'reshape2')
exe = paddle.static.Executor()
exe.run(start_prog)
fetch = exe.run(main_prog, fetch_list=[inp, output, conv.weight])
conv_input = fetch[0]
conv_output = fetch[1]
weight_static = fetch[2]
self.check_result(
weight_dygraph, weight_static, conv_input, conv_output
)
def test_dirac_pir(self):
self.config()
paddle.set_default_dtype(self.dtype)
paddle.disable_static()
conv = self.conv_layer(
self.in_channels,
self.out_channels,
self.kernel_size,
weight_attr=self.weight_attr,
)
weight_dygraph = conv.weight.numpy()
paddle.enable_static()
with paddle.pir_utils.IrGuard():
start_prog = paddle.static.Program()
main_prog = paddle.static.Program()
with paddle.static.program_guard(main_prog, start_prog):
inp = paddle.rand(self.input_shape)
conv = self.conv_layer(
self.in_channels,
self.out_channels,
self.kernel_size,
weight_attr=self.weight_attr,
)
output = conv(inp)
exe = paddle.static.Executor()
exe.run(start_prog)
fetch = exe.run(
main_prog, fetch_list=[inp, output, conv.weight]
)
conv_input = fetch[0]
conv_output = fetch[1]
weight_static = fetch[2]
self.check_result(
weight_dygraph, weight_static, conv_input, conv_output
)
# initialize Conv2D weight
class TestDiracInitializer2(TestDiracInitializer1):
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Dirac(groups=1)
)
self.dtype = "float64"
self.in_channels = 4
self.out_channels = 8
self.kernel_size = (3, 3)
self.input_shape = [8, self.in_channels, 10, 10]
self.conv_layer = paddle.nn.Conv2D
self.num_ops = 8
def check_result(self, w_dygraph, w_static, conv_in, conv_out):
np.testing.assert_array_equal(w_dygraph, w_static)
np.testing.assert_array_equal(
conv_out[:, 0:4, :, :], conv_in[:, :, 1:9, 1:9]
)
np.testing.assert_array_equal(
conv_out[:, 4:8, :, :], np.zeros([8, 4, 8, 8])
)
# initialize Conv3D weight
class TestDiracInitializer3(TestDiracInitializer1):
def config(self):
self.weight_attr = paddle.ParamAttr(
initializer=paddle.nn.initializer.Dirac(groups=2)
)
self.dtype = "float32"
self.in_channels = 5
self.out_channels = 10
self.kernel_size = (3, 3, 3)
self.input_shape = [8, self.in_channels, 10, 10, 10]
self.conv_layer = paddle.nn.Conv3D
self.num_ops = 7
def check_result(self, w_dygraph, w_static, conv_in, conv_out):
np.testing.assert_array_equal(w_dygraph, w_static)
np.testing.assert_array_equal(
conv_out[:, 0:5, :, :, :], conv_in[:, :, 1:9, 1:9, 1:9]
)
np.testing.assert_array_equal(
conv_out[:, 5:10, :, :, :], conv_in[:, :, 1:9, 1:9, 1:9]
)
def test_error(self):
self.config()
with self.assertRaises(AssertionError):
paddle.nn.Linear(10, 10, weight_attr=self.weight_attr)
with self.assertRaises(AssertionError):
paddle.nn.Conv2D(5, 9, (3, 3), weight_attr=self.weight_attr)
class TestTruncatedNormalInitializerDygraph(unittest.TestCase):
def _trunc_normal_numpy(self, tensor, mean=0.0, std=1.0, a=-2.0, b=2.0):
# Method based on https://people.sc.fsu.edu/~jburkardt/presentations/truncated_normal.pdf
def norm_cdf(x):
# Computes standard normal cumulative distribution function
return (1.0 + math.erf(x / math.sqrt(2.0))) / 2.0
# Values are generated by using a truncated uniform distribution and
# then using the inverse CDF for the normal distribution.
# Get upper and lower cdf values
l = norm_cdf((a - mean) / std)
u = norm_cdf((b - mean) / std)
# Uniformly fill tensor with values from [l, u], then translate to
# [2l-1, 2u-1].
_tensor = np.random.uniform(
low=2 * l - 1, high=2 * u - 1, size=tensor.shape
).astype(paddle.get_default_dtype())
# Use inverse cdf transform for normal distribution to get truncated
# standard normal
_tensor = special.erfinv(_tensor)
# Transform to proper mean, std
_tensor = np.multiply(_tensor, std * math.sqrt(2.0))
_tensor = np.add(_tensor, mean)
# Clamp to ensure it"s in the proper range
_tensor = np.clip(_tensor, a_min=a, a_max=b)
return _tensor
def test_truncated_normal_initializer_fp32(self):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
with dygraph_guard():
paddle.seed(42)
pre_dtype = paddle.get_default_dtype()
paddle.set_default_dtype("float32")
tensor = paddle.zeros([1024, 1024, 8])
tensor.stop_gradient = False
truncated_normal_ = paddle.nn.initializer.TruncatedNormal()
truncated_normal_(tensor)
array = self._trunc_normal_numpy(tensor)
np.testing.assert_allclose(
array.mean(), tensor.mean().item(), rtol=0.01, atol=0.01
)
np.testing.assert_allclose(
array.std(), tensor.std().item(), rtol=0.01, atol=0.01
)
paddle.set_default_dtype(pre_dtype)
def test_truncated_normal_initializer_fp64(self):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
with dygraph_guard():
paddle.seed(42)
pre_dtype = paddle.get_default_dtype()
paddle.set_default_dtype("float64")
tensor = paddle.zeros([1024, 1024, 8])
tensor.stop_gradient = False
truncated_normal_ = paddle.nn.initializer.TruncatedNormal()
truncated_normal_(tensor)
array = self._trunc_normal_numpy(tensor)
np.testing.assert_allclose(
array.mean(), tensor.mean().item(), rtol=0.01, atol=0.01
)
np.testing.assert_allclose(
array.std(), tensor.std().item(), rtol=0.01, atol=0.01
)
paddle.set_default_dtype(pre_dtype)
class TestAssignInitializerDygraph(unittest.TestCase):
def test_assign_initializer_fp32(self):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
with dygraph_guard():
pre_dtype = paddle.get_default_dtype()
paddle.set_default_dtype("float32")
tensor = paddle.zeros(
[1024, 1024, 8], dtype=paddle.get_default_dtype()
)
tensor.stop_gradient = False
array = np.random.randn(*tensor.shape).astype(
paddle.get_default_dtype()
)
assign_ = paddle.nn.initializer.Assign(array)
assign_(tensor)
np.testing.assert_allclose(array, tensor, rtol=1e-6, atol=1e-6)
paddle.set_default_dtype(pre_dtype)
def test_assign_initializer_fp64(self):
"""
In dygraph mode, we can use initializer directly to initialize a tensor.
"""
with dygraph_guard():
pre_dtype = paddle.get_default_dtype()
paddle.set_default_dtype("float64")
tensor = paddle.zeros(
[1024, 1024, 8], dtype=paddle.get_default_dtype()
)
tensor.stop_gradient = False
array = np.random.randn(*tensor.shape).astype(
paddle.get_default_dtype()
)
assign_ = paddle.nn.initializer.Assign(array)
assign_(tensor)
np.testing.assert_allclose(array, tensor, rtol=1e-6, atol=1e-6)
paddle.set_default_dtype(pre_dtype)
if __name__ == '__main__':
paddle.enable_static()
unittest.main()