Example #1
0
 def build(self, input_shape):
     if self.kernel_initializer == 'glorot':
         initializer = t3f.glorot_initializer(self.tt_shape,
                                              tt_rank=self.tt_rank)
     elif self.kernel_initializer == 'he':
         initializer = t3f.he_initializer(self.tt_shape,
                                          tt_rank=self.tt_rank)
     elif self.kernel_initializer == 'lecun':
         initializer = t3f.lecun_initializer(self.tt_shape,
                                             tt_rank=self.tt_rank)
     else:
         raise ValueError('Unknown kernel_initializer "%s", only "glorot",'
                          '"he", and "lecun"  are supported' %
                          self.kernel_initializer)
     name = 'tt_dense_{}'.format(self.counter)
     with tf.variable_scope(name):
         self.matrix = t3f.get_variable('matrix', initializer=initializer)
         self.b = None
         if self.use_bias:
             b_init = tf.constant_initializer(self.bias_initializer)
             self.b = tf.get_variable('bias',
                                      shape=self.output_dim,
                                      initializer=b_init)
     self._trainable_weights = list(self.matrix.tt_cores)
     if self.b is not None:
         self._trainable_weights.append(self.b)
Example #2
0
    def __init__(self,
                 input_dims,
                 output_dims,
                 tt_rank=2,
                 activation=None,
                 use_bias=True,
                 kernel_initializer='glorot',
                 bias_initializer=0.1,
                 **kwargs):
        """Creates a TT-Matrix based Dense Keras layer.

    Args:
      input_dims: an array, tensor shape of the matrix row index
      ouput_dims: an array, tensor shape of the matrix column index
      tt_rank: a number or an array, desired tt-rank of the TT-Matrix
      activation: [None] string or None, specifies the activation function.
      use_bias: bool, whether to use bias
      kernel_initializer: string specifying initializer for the TT-Matrix.
          Possible values are 'glorot', 'he', and 'lecun'.
      bias_initializer: a number, initialization value of the bias

    Returns:
      Layer object corresponding to multiplication by a TT-Matrix
          followed by addition of a bias and applying
          an elementwise activation

    Raises:
        ValueError if the provided activation or kernel_initializer is
        unknown.
    """
        self.counter = next(self._counter)
        self.tt_shape = [input_dims, output_dims]
        self.output_dim = np.prod(output_dims)
        self.tt_rank = tt_rank
        self.activation = activation
        self.use_bias = use_bias
        self.kernel_initializer = kernel_initializer
        self.bias_initializer = bias_initializer
        name = 'tt_dense_{}'.format(self.counter)

        if self.kernel_initializer == 'glorot':
            initializer = t3f.glorot_initializer(self.tt_shape,
                                                 tt_rank=self.tt_rank)
        elif self.kernel_initializer == 'he':
            initializer = t3f.he_initializer(self.tt_shape,
                                             tt_rank=self.tt_rank)
        elif self.kernel_initializer == 'lecun':
            initializer = t3f.lecun_initializer(self.tt_shape,
                                                tt_rank=self.tt_rank)
        else:
            raise ValueError('Unknown kernel_initializer "%s", only "glorot",'
                             '"he", and "lecun"  are supported' %
                             self.kernel_initializer)
        self.matrix = t3f.get_variable('matrix', initializer=initializer)
        self._tt_cores = self.matrix.tt_cores
        self.b = None
        if self.use_bias:
            self.b = tf.Variable(self.bias_initializer * tf.ones(
                (self.output_dim, )))
        super(KerasDense, self).__init__(name=name, **kwargs)
Example #3
0
 def build(self, input_shape):
     if self.init == 'glorot':
         initializer = t3f.glorot_initializer(self.tt_shape,
                                              tt_rank=self.tt_rank)
     elif self.init == 'he':
         initializer = t3f.he_initializer(self.tt_shape,
                                          tt_rank=self.tt_rank)
     elif self.init == 'lecun':
         initializer = t3f.lecun_initializer(self.tt_shape,
                                             tt_rank=self.tt_rank)
     else:
         raise ValueError('Unknown init "%s", only %s are supported' %
                          (self.init, inits))
     name = 'tt_dense_matrix_{}'.format(TTDense.counter)
     self.W = t3f.get_variable(name, initializer=initializer)
     self.b = None
     if self.bias:
         b_name = 'tt_dense_b_{}'.format(TTDense.counter)
         b_init = tf.constant_initializer(self.bias_init)
         self.b = tf.get_variable(b_name,
                                  shape=self.output_dim,
                                  initializer=b_init)
     TTDense.counter += 1
     self.trainable_weights = list(self.W.tt_cores)
     if self.b is not None:
         self.trainable_weights.append(self.b)
Example #4
0
    def __init__(self,
                 rank,
                 tt_shape,
                 shape_out,
                 bias_initializer=None,
                 regularizer=None,
                 use_bias=True):

        import t3f

        self.use_bias = use_bias
        self.tt_shape = tt_shape

        initializer = t3f.lecun_initializer(self.tt_shape, tt_rank=rank)
        # initializer = t3f.he_initializer(self.tt_shape, tt_rank=rank)
        # initializer = t3f.glorot_initializer(self.tt_shape, tt_rank=rank)
        self.weights = t3f.get_variable("tensor_train",
                                        initializer=initializer,
                                        regularizer=regularizer,
                                        trainable=True)

        if bias_initializer is None:
            bias_initializer = tf.constant_initializer(0.01)

        if use_bias:
            self.bias = tf.get_variable(name="bias",
                                        shape=[shape_out],
                                        initializer=bias_initializer,
                                        regularizer=regularizer)
Example #5
0
    def build(self, input_shape):
        if self.kernel_initializer == 'glorot':
            initializer = t3f.glorot_initializer(self.tt_shape,
                                                 tt_rank=self.tt_rank)
        elif self.kernel_initializer == 'he':
            initializer = t3f.he_initializer(self.tt_shape,
                                             tt_rank=self.tt_rank)
        elif self.kernel_initializer == 'lecun':
            initializer = t3f.lecun_initializer(self.tt_shape,
                                                tt_rank=self.tt_rank)
        else:
            raise ValueError('Unknown kernel_initializer "%s", only "glorot",'
                             '"he", and "lecun"  are supported' %
                             self.kernel_initializer)
        name = 'tt_dense_{}'.format(self.counter)
        with tf.variable_scope(name):
            self.matrix = t3f.get_variable('matrix', initializer=initializer)
            cores_ = []
            for i, v in enumerate(self.matrix.tt_cores):

                def _initializer(*args, **kwargs):
                    return v.initialized_value()

                cores_.append(
                    self.add_weight('%d' % i,
                                    shape=v.shape,
                                    trainable=True,
                                    dtype=tf.float32,
                                    initializer=_initializer))
            self.matrix = t3f.TensorTrain(cores_)
            self.b = None
            if self.use_bias:
                b_init = tf.constant_initializer(self.bias_initializer)
                self.b = self.add_weight('bias',
                                         shape=(self.output_dim, ),
                                         initializer=b_init)