首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冻结图层的特定过滤器,以便在Keras中进行修剪

冻结图层的特定过滤器,以便在Keras中进行修剪
EN

Stack Overflow用户
提问于 2020-05-15 11:38:32
回答 1查看 198关注 0票数 0

在剪枝步骤中,我对深度卷积的一些滤波器进行了清零。这样做之后,我需要重新训练网络,但是那些已经清零的权重(我有索引列表)不应该在训练期间更新,它们的值需要保持为零。所以,如果我在深度层中有150个过滤器(我没有计算偏差),有没有办法只冻结其中的一个子集?

例如,过滤器的权重为x

代码语言:javascript
复制
x=model.layers[4].get_weights()[0]

x是150个数字的ndarray。理想情况下,如果我有一个清零的索引列表pruned_filters,我希望这样做:

代码语言:javascript
复制
x[pruned_filters].trainable = False # I know this is wrong, it's just an example

或将它们移动到non_trainable_weights

EN

回答 1

Stack Overflow用户

发布于 2020-05-15 15:08:22

您不能只冻结特定的过滤器。如果你保留了它的价值,你能做的就是将它们设置为0。但其他所有人都是不可训练的。下面是一个示例:

代码语言:javascript
复制
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(.....)

否则,您可以应用遮罩...掩码不考虑具有特定值的值来计算反向传播...在您的示例中,这将使零过滤器保持不变

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61811333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档