|
| 1 | +import numpy as np |
1 | 2 | import unittest |
2 | 3 |
|
3 | 4 | import paddle.v2.framework.framework as framework |
@@ -116,5 +117,111 @@ def test_normal_initializer(self): |
116 | 117 | self.assertEqual(init_op.attr('seed'), 123) |
117 | 118 |
|
118 | 119 |
|
| 120 | +class TestXavierInitializer(unittest.TestCase): |
| 121 | + def test_uniform_xavier_initializer(self): |
| 122 | + """Test Xavier initializer with uniform distribution on |
| 123 | + for matrix multiply. |
| 124 | + """ |
| 125 | + program = framework.Program() |
| 126 | + block = program.global_block() |
| 127 | + param = block.create_parameter( |
| 128 | + dtype="float32", |
| 129 | + shape=[5, 10], |
| 130 | + lod_level=0, |
| 131 | + name="param", |
| 132 | + initializer=initializer.XavierInitializer()) |
| 133 | + self.assertEqual(len(block.ops), 1) |
| 134 | + init_op = block.ops[0] |
| 135 | + self.assertEqual(init_op.type, 'uniform_random') |
| 136 | + limit = np.sqrt(6.0 / (param.shape[0] + param.shape[1])) |
| 137 | + self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA) |
| 138 | + self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA) |
| 139 | + self.assertEqual(init_op.attr('seed'), 0) |
| 140 | + |
| 141 | + def test_uniform_xavier_initializer_conv(self): |
| 142 | + """Test Xavier initializer with uniform distribution on |
| 143 | + for convolutions. |
| 144 | + """ |
| 145 | + program = framework.Program() |
| 146 | + block = program.global_block() |
| 147 | + param = block.create_parameter( |
| 148 | + dtype="float32", |
| 149 | + shape=[5, 10, 15, 20], |
| 150 | + lod_level=0, |
| 151 | + name="param", |
| 152 | + initializer=initializer.XavierInitializer()) |
| 153 | + self.assertEqual(len(block.ops), 1) |
| 154 | + init_op = block.ops[0] |
| 155 | + self.assertEqual(init_op.type, 'uniform_random') |
| 156 | + receptive_field_size = float(15 * 20) |
| 157 | + limit = np.sqrt(6.0 / ( |
| 158 | + (param.shape[0] + param.shape[1]) * receptive_field_size)) |
| 159 | + self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA) |
| 160 | + self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA) |
| 161 | + self.assertEqual(init_op.attr('seed'), 0) |
| 162 | + |
| 163 | + def test_normal_xavier_initializer(self): |
| 164 | + """Test Xavier initializer with normal distribution on |
| 165 | + for matrix multiply. |
| 166 | + """ |
| 167 | + program = framework.Program() |
| 168 | + block = program.global_block() |
| 169 | + param = block.create_parameter( |
| 170 | + dtype="float32", |
| 171 | + shape=[5, 10], |
| 172 | + lod_level=0, |
| 173 | + name="param", |
| 174 | + initializer=initializer.XavierInitializer(uniform=False)) |
| 175 | + self.assertEqual(len(block.ops), 1) |
| 176 | + init_op = block.ops[0] |
| 177 | + self.assertEqual(init_op.type, 'gaussian_random') |
| 178 | + std = np.sqrt(2.0 / (param.shape[0] + param.shape[1])) |
| 179 | + self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA) |
| 180 | + self.assertAlmostEqual(init_op.attr('std'), std, delta=DELTA) |
| 181 | + self.assertEqual(init_op.attr('seed'), 0) |
| 182 | + |
| 183 | + def test_normal_xavier_initializer_conv(self): |
| 184 | + """Test Xavier initializer with normal distribution on |
| 185 | + for convolutions. |
| 186 | + """ |
| 187 | + program = framework.Program() |
| 188 | + block = program.global_block() |
| 189 | + param = block.create_parameter( |
| 190 | + dtype="float32", |
| 191 | + shape=[5, 10, 15, 20], |
| 192 | + lod_level=0, |
| 193 | + name="param", |
| 194 | + initializer=initializer.XavierInitializer(uniform=False)) |
| 195 | + self.assertEqual(len(block.ops), 1) |
| 196 | + init_op = block.ops[0] |
| 197 | + self.assertEqual(init_op.type, 'gaussian_random') |
| 198 | + receptive_field_size = float(15 * 20) |
| 199 | + std = np.sqrt(2.0 / ( |
| 200 | + (param.shape[0] + param.shape[1]) * receptive_field_size)) |
| 201 | + self.assertAlmostEqual(init_op.attr('mean'), 0.0, delta=DELTA) |
| 202 | + self.assertAlmostEqual(init_op.attr('std'), std, delta=DELTA) |
| 203 | + self.assertEqual(init_op.attr('seed'), 0) |
| 204 | + |
| 205 | + def test_xavier_initializer_supplied_arguments(self): |
| 206 | + """Test the Xavier initializer with supplied arguments |
| 207 | + """ |
| 208 | + program = framework.Program() |
| 209 | + block = program.global_block() |
| 210 | + block.create_parameter( |
| 211 | + dtype="float32", |
| 212 | + shape=[5, 10], |
| 213 | + lod_level=0, |
| 214 | + name="param", |
| 215 | + initializer=initializer.XavierInitializer( |
| 216 | + fan_in=12, fan_out=23, seed=134)) |
| 217 | + self.assertEqual(len(block.ops), 1) |
| 218 | + init_op = block.ops[0] |
| 219 | + self.assertEqual(init_op.type, 'uniform_random') |
| 220 | + limit = np.sqrt(6.0 / (12 + 23)) |
| 221 | + self.assertAlmostEqual(init_op.attr('min'), -limit, delta=DELTA) |
| 222 | + self.assertAlmostEqual(init_op.attr('max'), limit, delta=DELTA) |
| 223 | + self.assertEqual(init_op.attr('seed'), 134) |
| 224 | + |
| 225 | + |
119 | 226 | if __name__ == '__main__': |
120 | 227 | unittest.main() |
0 commit comments