如何从Keras的神经网络层(密集层或卷积层)中删除/删除低于阈值的比重?

时间:2018-12-17 13:07:59

标签: keras

我在Keras中有一个神经网络模型,该模型在数据集上训练。现在,我想从“密集”层和“卷积”层中删除/删除一些特定的权重。在Keras中有办法做到这一点吗?请帮忙。谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用get_weightsset_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()进行验证。