era*_*129 3 python neural-network deep-learning conv-neural-network keras
我对更新 Keras 中现有的图层参数感兴趣(不是删除图层并插入一个新图层,而只是修改现有参数)。
我将举一个我正在编写的函数的例子:
def add_filters(self, model):
conv_indices = [i for i, layer in enumerate(model.layers) if 'convolution' in layer.get_config()['name']]
random_conv_index = random.randint(0, len(conv_indices)-1)
factor = 2
conv_layer = model.layers[random_conv_index]
conv_layer.filters = conv_layer.filters * factor
print('new conv layer filters after transform is:', conv_layer.filters)
print('just to make sure, its:', model.layers[random_conv_index].filters)
return model
Run Code Online (Sandbox Code Playgroud)
所以这里基本上发生的事情是我从我的网络中随机抽取一个卷积层(我所有的卷积层的名称中都有“卷积”)并尝试将过滤器加倍。据我所知,在任何情况下,这都不会导致输入/输出大小兼容性的任何“编译问题”。
问题是,我的模型根本没有改变。我最后添加的 2 个打印输出打印了正确的数字(是之前过滤器数量的两倍)。但是当我编译模型并打印model.summary()时,我仍然看到了之前的过滤量。
顺便说一句,我并不局限于 Keras。如果有人知道如何使用 PyTorch 实现这一点,我也会购买它:D
好吧,如果您想基于现有模型创建新模型的架构,尽管进行一些修改,您可以使用to_json和model_from_json()功能。下面是一个例子:
model = Sequential()
model.add(Conv2D(10, (3,3), input_shape=(100,100,3)))
model.add(Conv2D(40, (3,3)))
model.summary()
Run Code Online (Sandbox Code Playgroud)
型号概要:
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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)
现在我们修改第一层的过滤器数量,并基于修改后的架构创建一个新模型:
from keras.models import model_from_json
model.layers[0].filters *= 2
new_model = model_from_json(model.to_json())
new_model.summary()
Run Code Online (Sandbox Code Playgroud)
新机型总结:
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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)
也可以model.to_json()直接修改输出而不修改模型实例。
您可以轻松地使用get_weights()方法来获取卷积层的当前权重。它将返回两个 numpy 数组的列表。第一个对应于过滤器权重,第二个对应于偏置参数。然后你可以使用set_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)
Run Code Online (Sandbox Code Playgroud)
作为旁注,filters您在代码中使用的卷积层的属性对应于该层中过滤器的数量,而不是它们的权重。
| 归档时间: |
|
| 查看次数: |
6970 次 |
| 最近记录: |