冻结Keras中修剪层的特定过滤器

冻结Keras中修剪层的特定过滤器,keras,pruning,Keras,Pruning,在修剪步骤中,我将深度卷积的一些过滤器归零。完成此操作后,我需要重新训练网络,但那些已归零的权重(我有索引列表)不应在训练期间更新,它们的值需要保持等于零。所以,如果我在深度层有150个过滤器,我不计算偏差,有没有办法冻结其中的一个子集 例如,过滤器的权重为x: x是一个由150个数字组成的数组。理想情况下,如果我有一个被调零的索引列表,我想做如下事情: x[pruned_filters].trainable = False # I know this is wrong, it's just a

在修剪步骤中,我将深度卷积的一些过滤器归零。完成此操作后,我需要重新训练网络,但那些已归零的权重(我有索引列表)不应在训练期间更新,它们的值需要保持等于零。所以,如果我在深度层有150个过滤器,我不计算偏差,有没有办法冻结其中的一个子集

例如,过滤器的权重为x:

x是一个由150个数字组成的数组。理想情况下,如果我有一个被调零的索引列表,我想做如下事情:

x[pruned_filters].trainable = False # I know this is wrong, it's just an example

或者将其移动到不可训练的权重

只能冻结特定的过滤器。如果您认为它有价值,您可以做的是将它们设置为0。但其他所有人都无法接受培训。这里有一个例子:

inp = Input((10,10,3))
c = Conv2D(32, kernel_size=(3, 3),
           activation='relu')
f = Flatten()
d = Dense(10, activation='softmax')

x = c(inp)
x = f(x)
out = d(x)
model = Model(inp, out)
print(model.summary())

# model.fit(.....)

pruned_filters = [1,5,9]
w,b = c.get_weights()
w[:,:,:,pruned_filters] = 0
c.set_weights([w,b])

model.layers[1].trainable = False

# model.fit(.....)
否则,您可以应用遮罩。。。掩模不考虑具有特定值的值来计算反向传播…在您的情况下,这将保持零过滤器不变

inp = Input((10,10,3))
c = Conv2D(32, kernel_size=(3, 3),
           activation='relu')
f = Flatten()
d = Dense(10)

x = c(inp)
x = f(x)
out = d(x)
model1 = Model(inp, out)
model1.compile('adam', 'mse')
model1.fit(np.random.uniform(0,1, (5,10,10,3)), np.random.uniform(0,1, (5,10)))

pruned_filters = [1,5,9]
w,b = c.get_weights()
w[:,:,:,pruned_filters] = 0
c.set_weights([w,b])
print(w)

mask = Masking(mask_value=0)
x = c(inp)
x = mask(x)
x = f(x)
out = d(x)
model2 = Model(inp, out)
model2.compile('adam', 'mse')
model2.fit(np.random.uniform(0,1, (5,10,10,3)), np.random.uniform(0,1, (5,10)))

w,b = c.get_weights()
print(w)

你好这实际上是我以前做的修剪步骤的一部分。我设置了我想归零的权重,而不是整个层,然后我需要重新训练网络,但我不能像建模那样冻结整个层。层[1]。trainable=False,因为层的剩余权重需要更新,修剪后的权重应该保持为0。掩蔽操作听起来非常好!我试试看。谢谢。不幸的是,虽然掩蔽函数听起来不错,但我找不到一种方法将其应用于DepthwiseConv2D,它根本不支持它。
inp = Input((10,10,3))
c = Conv2D(32, kernel_size=(3, 3),
           activation='relu')
f = Flatten()
d = Dense(10)

x = c(inp)
x = f(x)
out = d(x)
model1 = Model(inp, out)
model1.compile('adam', 'mse')
model1.fit(np.random.uniform(0,1, (5,10,10,3)), np.random.uniform(0,1, (5,10)))

pruned_filters = [1,5,9]
w,b = c.get_weights()
w[:,:,:,pruned_filters] = 0
c.set_weights([w,b])
print(w)

mask = Masking(mask_value=0)
x = c(inp)
x = mask(x)
x = f(x)
out = d(x)
model2 = Model(inp, out)
model2.compile('adam', 'mse')
model2.fit(np.random.uniform(0,1, (5,10,10,3)), np.random.uniform(0,1, (5,10)))

w,b = c.get_weights()
print(w)