【问题标题】:How can I create a learnable parameter or weight vector whose values are either 1 or -1如何创建值为 1 或 -1 的可学习参数或权重向量
【发布时间】:2023-02-26 07:13:39
【问题描述】:

我需要构建一个称为可学习参数或权重向量的神经网络。这样,只会生成一个向量并与数据相乘。我创建如下:

from tensorflow.keras.layers import Layer
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model

class LearnableMultiplier(Layer):
    def __init__(self, **kwargs):
        super(LearnableMultiplier, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(name='kernel',
                                      shape=(input_shape[-1],),
                                      initializer='glorot_uniform',
                                      trainable=True)

        super(LearnableMultiplier, self).build(input_shape)

    def call(self, inputs):
        return inputs * self.kernel

inputs = Input(shape=(64,))
multiplier = LearnableMultiplier()(inputs)  
model = Model(inputs=inputs, outputs=multiplier )

我需要从 1 或 -1 的值中选择上面定义的矢量可学习参数。我的意思是与我的数据相乘的那个向量的每个值只能是 1 或 -1。那可行吗?我该怎么做?

【问题讨论】:

  • 神经网络是用反向传播训练的,所以值必须是连续的,所以中间没有任何东西的 1 和 -1 应该是不可能的
  • @Caridorc 好的,如果我希望可学习参数的每个值都为零,那该怎么办?
  • 这取决于你如何定义与零不同,0.0000001 与零不同吗?
  • 不,例如,我认为 0.1 不同于零 @Caridorc
  • 您可以尝试使用一个函数,给定从 0 到 1 的输入将给出接近 1 或 -1 的输出

标签: python deep-learning neural-network conv-neural-network tf.keras


【解决方案1】:

是的,将可学习的权重向量限制为 1 或 -1 是可行的。实现此目的的一种方法是使用符号函数将权重转换为 1 或 -1。您可以修改调用函数以将符号函数应用于权重,如下所示:

import tensorflow as tf
from tensorflow.keras.layers import Layer
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model

class LearnableMultiplier(Layer):
    def __init__(self, **kwargs):
        super(LearnableMultiplier, self).__init__(**kwargs)

    def build(self, input_shape):
        self.kernel = self.add_weight(name='kernel',
                                      shape=(input_shape[-1],),
                                      initializer='glorot_uniform',
                                      trainable=True)

        super(LearnableMultiplier, self).build(input_shape)

    def call(self, inputs):
        return inputs * tf.math.sign(self.kernel)

tf.math.sign 函数会将权重向量的每个元素转换为 1 或 -1,具体取决于它是正数还是负数。这将确保在乘法期间只有 1 或 -1 用作权重向量的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    相关资源
    最近更新 更多