我在Keras中有一个神经网络模型,该模型在数据集上训练。现在,我想从“密集”层和“卷积”层中删除/删除一些特定的权重。在Keras中有办法做到这一点吗?请帮忙。谢谢。
答案 0 :(得分:1)
您可以使用get_weights
和set_weights
图层方法。我将说明具有一个密集层的玩具模型的原理:
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
x = np.random.rand(10,10)
y = np.random.rand(10,1)
model = Sequential()
model.add(Dense(units=1, input_shape=(10, )))
model.compile(loss='mse', optimizer='sgd')
model.fit(x, y)
我们图层的权重由两个numpy数组组成,分别用于权重和偏差:
weights = model.get_layer(index=-1).get_weights()
weights
[array([[ 0.51373583],
[-0.64512885],
[ 0.41436252],
[-0.5230512 ],
[-0.7272273 ],
[ 0.17996567],
[-0.63398594],
[ 0.3416807 ],
[ 0.66054064],
[-0.11221145]], dtype=float32), array([0.01157765], dtype=float32)]
要“删除”低于特定阈值的权重,可以修改权重数组。例如,将所有负权重设置为零:
sparsified_weights = []
threshold = 0.
for w in weights:
bool_mask = (w > threshold).astype(int)
sparsified_weights.append(w*bool_mask)
然后您可以使用set_weights()
在图层上设置这些权重:
model.get_layer(index=-1).set_weights(sparsified_weights)
再次调用get_weights()
进行验证。