【问题标题】:Train for a parameter in the weight matrix in Tensorflow在 Tensorflow 中训练权重矩阵中的参数
【发布时间】:2020-04-16 01:58:45
【问题描述】:

我有一个神经网络。为简单起见,只有 一个 层,权重矩阵的形状为 2-by-2。我需要网络的输出是输入的旋转版本,即矩阵应该是有效的旋转矩阵。我尝试了以下方法:

def rotate(val):
    w1 = tf.constant_initializer([[cos45, -sin45], [sin45, cos45]])
    return tf.layers.dense(inputs=val, units=2, kernel_initializer=w1, activation=tf.nn.tanh) 

在训练时,我不想丢失旋转矩阵的属性。换句话说,我需要这些层来仅估计矩阵中三角函数的角度(参数)。

我读到kernel_constraint 可以通过标准化值在这方面提供帮助。但是应用kernel_constraint 并不能保证对角线条目是相等的,并且非对角线条目是彼此的负数(在这种情况下)。一般来说,需要满足的两个属性是,行列式应该是1和R^T*R = I

还有其他方法可以实现吗?

【问题讨论】:

    标签: python-3.x tensorflow keras deep-learning rotational-matrices


    【解决方案1】:

    您可以定义您的custom Keras layer。大致如下:

    from tensorflow.keras.layers import Layer
    import tensorflow as tf
    
    class Rotate(Layer):
        def build(self, input_shape):
            sh = input_shape[0]
            shape = [sh, sh]
    
            # Initial weight matrix
            w = self.add_weight(shape=shape,
                                initializer='random_uniform')
    
            # Set upper diagonal elements to negative of lower diagonal elements
            mask = tf.cast(tf.linalg.band_part(tf.ones(shape), -1, 0), tf.float32)
            w = mask * w
            w -= tf.transpose(w)
    
            # Set the same weight to the diagonal
            diag_mask = 1 - tf.linalg.diag(tf.ones(sh))
            w = diag_mask * w
            diag_w = self.add_weight(shape=(1,),
                                     initializer='random_uniform')
            diagonal = tf.linalg.diag(tf.ones(sh)) * diag_w
            self.kernel = w + diagonal
    
        def call(self, inputs, **kwargs):
            return tf.matmul(inputs, self.kernel)
    

    请注意,可学习权重矩阵self.kernel 有这个方面:[[D, -L], [L, D]]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 2016-09-07
      • 2020-01-29
      • 2018-02-02
      • 2018-09-26
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多