(self)
| 89 | |
| 90 | @test_util.run_in_graph_and_eager_modes |
| 91 | def testAddWeight(self): |
| 92 | layer = base_layers.Layer(name='my_layer') |
| 93 | |
| 94 | # Test basic variable creation. |
| 95 | variable = layer.add_variable( |
| 96 | 'my_var', [2, 2], initializer=init_ops.zeros_initializer()) |
| 97 | self.assertEqual(variable.name, 'my_layer/my_var:0') |
| 98 | self.assertEqual(layer.variables, [variable]) |
| 99 | self.assertEqual(layer.trainable_variables, [variable]) |
| 100 | self.assertEqual(layer.non_trainable_variables, []) |
| 101 | if not context.executing_eagerly(): |
| 102 | self.assertEqual( |
| 103 | layer.variables, |
| 104 | ops.get_collection(ops.GraphKeys.TRAINABLE_VARIABLES)) |
| 105 | |
| 106 | # Test non-trainable variable creation. |
| 107 | # layer.add_variable should work even outside `build` and `call`. |
| 108 | variable_2 = layer.add_variable( |
| 109 | 'non_trainable_var', [2, 2], |
| 110 | initializer=init_ops.zeros_initializer(), |
| 111 | trainable=False) |
| 112 | self.assertEqual(layer.variables, [variable, variable_2]) |
| 113 | self.assertEqual(layer.trainable_variables, [variable]) |
| 114 | self.assertEqual(layer.non_trainable_variables, [variable_2]) |
| 115 | |
| 116 | if not context.executing_eagerly(): |
| 117 | self.assertEqual( |
| 118 | len(ops.get_collection(ops.GraphKeys.TRAINABLE_VARIABLES)), 1) |
| 119 | |
| 120 | regularizer = lambda x: math_ops.reduce_sum(x) * 1e-3 |
| 121 | _ = layer.add_variable( |
| 122 | 'reg_var', [2, 2], |
| 123 | initializer=init_ops.zeros_initializer(), |
| 124 | regularizer=regularizer) |
| 125 | self.assertEqual(len(layer.losses), 1) |
| 126 | |
| 127 | added_variable = [False] |
| 128 | |
| 129 | # Test that sync `ON_READ` variables are defaulted to be non-trainable. |
| 130 | variable_3 = layer.add_variable( |
| 131 | 'sync_on_read_var', [2, 2], |
| 132 | initializer=init_ops.zeros_initializer(), |
| 133 | synchronization=variable_scope.VariableSynchronization.ON_READ, |
| 134 | aggregation=variable_scope.VariableAggregation.SUM) |
| 135 | self.assertEqual(layer.non_trainable_variables, [variable_2, variable_3]) |
| 136 | |
| 137 | @def_function.function |
| 138 | def function_adds_weight(): |
| 139 | if not added_variable[0]: |
| 140 | layer.add_variable( |
| 141 | 'reg_var_from_function', [2, 2], |
| 142 | initializer=init_ops.zeros_initializer(), |
| 143 | regularizer=regularizer) |
| 144 | added_variable[0] = True |
| 145 | |
| 146 | function_adds_weight() |
| 147 | self.assertEqual(len(layer.losses), 2) |
| 148 |
nothing calls this directly
no test coverage detected