且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在 Keras 中修改图层参数

更新时间:2023-12-01 22:11:16

好吧,如果您想基于现有模型创建新模型的架构,尽管进行一些修改,您可以使用 to_jsonmodel_from_json() 函数.下面是一个例子:

Well, if you would like to create the architecture of a new model based on an existing model, though with some modifications, you can use to_json and model_from_json() functions. Here is an example:

model = Sequential()
model.add(Conv2D(10, (3,3), input_shape=(100,100,3)))
model.add(Conv2D(40, (3,3)))

model.summary()

模型摘要:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_12 (Conv2D)           (None, 98, 98, 10)        280       
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 96, 96, 40)        3640      
=================================================================
Total params: 3,920
Trainable params: 3,920
Non-trainable params: 0
_________________________________________________________________

现在我们修改第一层的过滤器数量,并基于修改后的架构创建一个新模型:

Now we modify the number of filters of the first layer and create a new model based on the modified architecture:

from keras.models import model_from_json

model.layers[0].filters *= 2
new_model = model_from_json(model.to_json())
new_model.summary()

新模型摘要:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_12 (Conv2D)           (None, 98, 98, 20)        560       
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 96, 96, 40)        7240      
=================================================================
Total params: 7,800
Trainable params: 7,800
Non-trainable params: 0
_________________________________________________________________

也可以直接修改model.to_json()的输出,无需修改模型实例.

You can also modify the output of model.to_json() directly without modifying the model instance.

您可以轻松地使用 get_weights() 方法来获取卷积层的当前权重.它将返回两个 numpy 数组的列表.第一个对应于过滤器权重,第二个对应于偏置参数.然后你可以使用 set_weights() 方法来设置新的权重:

You can easily use get_weights() method to get the current weights of the convolution layer. It would return a list of two numpy arrays. The first one corresponds to filter weights and the second one corresponds to bias parameters. Then you can use set_weights() method to set the new weights:

conv_layer = model.layers[random_conv_index]
weights = conv_layer.get_weights()
weights[0] *= factor  # multiply filter weights by `factor`
conv_layer.set_weights(weights)

作为旁注,您在代码中使用的卷积层的 filters 属性对应于该层中过滤器的数量,而不是它们的权重.

As a side note, the filters attribute of a convolution layer which you have used in your code corresponds to the number of filters in this layer and not their weights.