在剪枝步骤中,我对深度卷积的一些滤波器进行了清零。这样做之后,我需要重新训练网络,但是那些已经清零的权重(我有索引列表)不应该在训练期间更新,它们的值需要保持为零。所以,如果我在深度层中有150个过滤器(我没有计算偏差),有没有办法只冻结其中的一个子集?
例如,过滤器的权重为x
x=model.layers[4].get_weights()[0]而x是150个数字的ndarray。理想情况下,如果我有一个清零的索引列表pruned_filters,我希望这样做:
x[pruned_filters].trainable = False # I know this is wrong, it's just an example或将它们移动到non_trainable_weights
发布于 2020-05-15 15:08:22
您不能只冻结特定的过滤器。如果你保留了它的价值,你能做的就是将它们设置为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)https://stackoverflow.com/questions/61811333
复制相似问题