def __init__(self, left_size, right_size, out_size, nobias=False,
initialW=None, initial_bias=None):
super(Bilinear, self).__init__(W=(left_size, right_size, out_size))
self.in_sizes = (left_size, right_size)
self.nobias = nobias
# TODO(Kenta OONO): I do not know appropriate way of
# initializing weights in tensor network.
# This initialization is a modification of
# that of Linear function.
if isinstance(initialW, (numpy.ndarray, cuda.ndarray)):
assert initialW.shape == self.W.data.shape
initializers.init_weight(self.W.data, initialW)
if not self.nobias:
self.add_param('V1', (left_size, out_size))
self.add_param('V2', (right_size, out_size))
self.add_param('b', out_size)
if isinstance(initial_bias, tuple):
V1, V2, b = initial_bias
elif initial_bias is None:
V1 = V2 = None
b = 0
else:
raise ValueError('initial_bias must be tuple or None')
if isinstance(V1, (numpy.ndarray, cuda.ndarray)):
assert V1.shape == self.V1.data.shape
if isinstance(V2, (numpy.ndarray, cuda.ndarray)):
assert V2.shape == self.V2.data.shape
if isinstance(b, (numpy.ndarray, cuda.ndarray)):
assert b.shape == self.b.data.shape
initializers.init_weight(self.V1.data, V1)
initializers.init_weight(self.V2.data, V2)
initializers.init_weight(self.b.data, b)
评论列表
文章目录