在Keras训练期间,我如何控制非零重量的数量?

在Keras训练期间,我如何控制非零重量的数量?,keras,Keras,在优化和训练期间,我如何控制非零权重的数量,以便我们有一个固定数量的非零权重N?有点像正交匹配追踪。这可以通过向成本函数添加约束来实现。可以通过使用in-Keras来控制模型的权重。它的工作原理是根据权重向损失函数中添加一个惩罚。我在某种程度上将其用于稀疏自动编码器,如文档中所述: from keras import backend as K def l1_reg(weight_matrix): return 0.01 * K.sum(K.abs(weight_matrix)) mo

在优化和训练期间,我如何控制非零权重的数量,以便我们有一个固定数量的非零权重
N
?有点像正交匹配追踪。这可以通过向成本函数添加约束来实现。

可以通过使用in-Keras来控制模型的权重。它的工作原理是根据权重向损失函数中添加一个惩罚。我在某种程度上将其用于稀疏自动编码器,如文档中所述:

from keras import backend as K

def l1_reg(weight_matrix):
    return 0.01 * K.sum(K.abs(weight_matrix))

model.add(Dense(64, input_dim=64,
                kernel_regularizer=l1_reg)
然而,不仅可以限制权重之和,还可以限制零权重的计数。例如,限制可以是
M=weight_matrix.size-N
,惩罚取决于
M
和零权重数之间的增量的绝对值,因此
非零权重数最接近
N
的网络的惩罚最小

附加信息

根据我在训练过程中的经验,重量很少等于零,主要是它们保持在非常小但仍然非零值。在这种状态下,它们几乎对网络的工作并没有影响,所以我建议使用阈值来考虑它们,就像零权重一样

代码示例:


你的意思是这样的吗。。。def reg1(weight_matrix):返回0.01*(M-len(K.where(weight_matrix==0))@shaifaliGupta:几乎,我们需要正值作为惩罚,所以它就像def reg1(weight_matrix):在伪代码中返回0.01*abs(M-len(K.where(weight_matrix==0))。看起来您的伪代码将使用len(K.where(weight_matrix!=0)>K来奖励网络,而不是惩罚,但是如果您希望网络的非零权重甚至小于N,这是有意义的。此外,您必须调整模型/数据的0.01常量,以达到最佳结果Class reg_me(正则化器):def_调用__(self,x):正则化=0。正则化+=0.01*(102 len(sess.run(K.tf.where(x==0)))返回我这样实现的正则化..但它给出了错误InvalidArgumentError:WhereOp:Unhandled input dimensions:0@shaifaliGupta:在没有看到整个代码的情况下,很难找到此错误的原因,您能分享它以便我检查吗?class reg_me(正则化器):def__调用(self,x):正则化=0.正则化+=0.01*K.abs((1331 len(sess.run)(K.tf.where(x==0 Kаа))返回正则化模型1=Sequential()模型1.添加(LSTM(64,批处理输入形状=(10,回望,dm),W_正则化器=reg_me(),激活=sigmoid'))模型1.添加(密集(dm))模型1.添加(激活(“线性”)模型1.编译(loss='mean_squared_error',optimizer='rmsprop')
import numpy as np
from keras import backend as K
from keras.layers import Dense, LSTM, Activation
from keras.models import Sequential
from  keras.regularizers import Regularizer

class ZeroWeights(Regularizer):
    def __init__(self, l1=0., N = 0):
        self.l1 = K.cast_to_floatx(l1)
        self.N = int(N)

    def __call__(self, x):
        regularization = 0.
        if self.l1 and self.N:
            regularization += self.l1 * np.abs((self.N - np.count_nonzero(x))) 
        return regularization

    def get_config(self):
        return {'l1': float(self.l1),
                'N': int(self.N)}

model1 = Sequential() 

look_back = 10
dm = 5

model1.add(
    LSTM(64, input_shape = (look_back,dm), W_regularizer=ZeroWeights(0.1, 1331), 
         activation='sigmoid'))
model1.add(Dense(dm)) 
model1.add(Activation("linear")) 
model1.compile(loss='mean_squared_error', optimizer='rmsprop') 
model1.summary();