Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用L1正则化鼓励张量的稀疏性_Python_Tensorflow_Keras_Tensorflow2.0 - Fatal编程技术网

Python 如何使用L1正则化鼓励张量的稀疏性

Python 如何使用L1正则化鼓励张量的稀疏性,python,tensorflow,keras,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow2.0,从中,我发现有几种方法可以应用L1正则化。第一个对我来说是最直观的。该示例的行为与预期一样,d1具有所有3个,总计48个,按0.1缩放,我们得到4.8作为损失 d1 = tf.ones(shape=(2,2,4))*3 regularizer = tf.keras.regularizers.l1(0.1) regularizer(d1) tf.Tensor:shape=(),dtype=float32,numpy=4.8 在第二种方法中,我们对核使用正则化。所以我猜它鼓励了模型权重的稀疏性。我

从中,我发现有几种方法可以应用L1正则化。第一个对我来说是最直观的。该示例的行为与预期一样,d1具有所有3个,总计48个,按0.1缩放,我们得到4.8作为损失

d1 = tf.ones(shape=(2,2,4))*3
regularizer = tf.keras.regularizers.l1(0.1)
regularizer(d1)
tf.Tensor:shape=(),dtype=float32,numpy=4.8

在第二种方法中,我们对核使用正则化。所以我猜它鼓励了模型权重的稀疏性。我不能确切地说损失是0.54747146

layer = tf.keras.layers.Dense(3,input_dim=(2,2,4),kernel_regularizer=tf.keras.regularizers.l1(0.1))
out = layer(d1)
layer.losses
tf.Tensor:shape=(),dtype=float32,numpy=0.54747146

我认为第三种方法应该得到与第一种方法相同的结果,即直接将正则化应用于层。这里我们使用
活动\u正则化器
:正则化器对层的输出应用惩罚

layer2 = tf.keras.layers.Dense(3,input_dim=(2,2,4),activity_regularizer=tf.keras.regularizers.l1(0.1))
out2=layer2(d1)
layer2.losses
tf.Tensor:shape=(),dtype=float32,numpy=1.4821562

**
活动正则化器返回的值除以输入
批量大小

为什么损失是1.4821562?每次我重复的时候似乎都不一样。第三种方法和第一种方法有何不同


如果我想鼓励d1的稀疏性,我应该使用哪一种?

密集层计算的是矩阵积
y=wx+b
。应用L1计算的三种不同方法:

  • l1(x)
  • l1(W)
  • l1(Wx+b)

  • 由于权重和偏差是随机生成的,除非您指定固定的种子,否则每次运行的权重和偏差都会不同。

    如果我想要x中的稀疏性,我选择1,不是吗?在您的示例中,x是
    d1=tf.ones(shape=(2,2,4))*3
    ,这是一个常量,所以我不确定您想要在这里实现什么。还要注意的是,示例1)没有将l1正则化损耗添加到模型中,因此,例如,
    keras.model.fit
    没有意识到这种损耗。当然,在本例中没有,但通常在更实际的网络中,如果我添加损耗等,它应该是正确的使用方法吗?只是不太确定。我想一个实际的例子通常会让你得出2)或3)。如果
    x
    是前一层的结果,则对该层应用3)与对下一层使用1)相同,但还有一个额外的好处,即keras将负责损失跟踪。如果没有具体的例子,很难说得更多。
    Dense
    glorot\u uniform
    初始化权重(因此为随机l1)。尝试使用
    kernel\u initializer='ones'