def add_param(self, name, shape=None, dtype=numpy.float32, initializer=None): # type: (str, tp.Optional[types.ShapeSpec], types.DTypeSpec, tp.Optional[types.InitializerSpec]) -> None # NOQA """Registers a parameter to the link. Args: name (str): Name of the parameter. This name is also used as the attribute name. shape (int or tuple of ints): Shape of the parameter array. If it is omitted, the parameter variable is left uninitialized. dtype: Data type of the parameter array. initializer: If it is not ``None``, the data is initialized with the given initializer. If it is an array, the data is directly initialized by it. If it is callable, it is used as a weight initializer. Note that in these cases, ``dtype`` argument is ignored. """ if name in self.__dict__: raise AttributeError( 'cannot register a new parameter %s: attribute exists' % name) if initializer is None: initializer = initializers.NaN(dtype) param = variable.Parameter(initializer, shape) with self.init_scope(): setattr(self, name, param)
def test_addgrads(self): l = chainer.Link() with l.init_scope(): l.x = chainer.Parameter(shape=(2, 3), initializer=initializers.NaN('d')) l.y = chainer.Parameter(shape=2) l.u = chainer.Parameter(shape=(2, 3)) l.v = chainer.Parameter() l.x.grad.fill(1) l.y.grad.fill(2) l.u.grad.fill(3) self.link.x.grad.fill(-1) self.link.y.grad.fill(-2) self.link.u.cleargrad() self.link.addgrads(l) gx_expect = numpy.zeros_like(l.x.grad) gy_expect = numpy.zeros_like(l.y.grad) gu_expect = l.u.grad numpy.testing.assert_array_equal(self.link.x.grad, gx_expect) numpy.testing.assert_array_equal(self.link.y.grad, gy_expect) numpy.testing.assert_array_equal(self.link.u.grad, gu_expect) self.assertIsNone(self.link.v.grad, None)
def add_param(self, name, shape=None, dtype=numpy.float32, initializer=None): """Registers a parameter to the link. .. deprecated:: v2.0.0 Assign a :class:`~chainer.Parameter` object directly to an attribute within :meth:`~chainer.Link.init_scope` instead. For example, the following code .. code-block:: python link.add_param('W', shape=(5, 3)) can be replaced by the following assignment. .. code-block:: python with link.init_scope(): link.W = chainer.Parameter(None, (5, 3)) The latter is easier for IDEs to keep track of the attribute's type. Args: name (str): Name of the parameter. This name is also used as the attribute name. shape (int or tuple of ints): Shape of the parameter array. If it is omitted, the parameter variable is left uninitialized. dtype: Data type of the parameter array. initializer: If it is not ``None``, the data is initialized with the given initializer. If it is an array, the data is directly initialized by it. If it is callable, it is used as a weight initializer. Note that in these cases, ``dtype`` argument is ignored. """ warnings.warn( '''\ Parameter registeration via Link.__init__ and Link.add_param are deprecated. Assign a Parameter object directly to an attribute within a \ "with Link.init_scope():" block instead. ''', DeprecationWarning) if name in self.__dict__: raise AttributeError( 'cannot register a new parameter %s: attribute exists' % name) if initializer is None: initializer = initializers.NaN(dtype) param = variable.Parameter(initializer, shape) with self.init_scope(): setattr(self, name, param)