python - 修改Keras中的图层参数

标签 python neural-network keras deep-learning conv-neural-network

我有兴趣更新 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

所以这里基本上发生的是我从我的网络中取出一个随机卷积层(我的所有卷积层的名称中都有“卷积”)并尝试将过滤器加倍。据我所知,在任何情况下这都不会导致任何输入/输出大小兼容性的“编译问题”。

问题是,我的模型根本没有改变。我最后添加的 2 个打印输出打印了正确的数字(是之前过滤器数量的两倍)。但是当我编译模型并打印 model.summary() 时,我仍然看到之前的过滤器数量。

顺便说一句,我并不局限于 Keras。例如,如果有人知道如何使用 PyTorch 实现这一点,我也会购买它:D

最佳答案

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

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
_________________________________________________________________

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

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()的输出,而不修改模型实例。

<小时/>

您可以轻松地使用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)

顺便说一句,您在代码中使用的卷积层的 filters 属性对应于该层中的过滤器数量,而不是它们的权重。

关于python - 修改Keras中的图层参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52810702/

相关文章:

python - 使用 MLP 和 Tensorflow 预测时间序列值

javascript - 如何提高前馈神经网络的准确性?

python - 以最小的 acc_loss 回退到之前的权重ReduceLROnPlateau

python - tensorflow Triplet_semihard_loss 在多个纪元后不会改变

python - 使用 jinja 生成 python 类

python - 如何从另一个数组的值中获取一个 numpy 数组 (Python)

machine-learning - 如何训练神经网络来打乒乓球游戏?

validation - 评估 CNN 训练效果的最佳指标是什么?验证错误或训练损失?

python - 使用 python 对文件进行操作

python - 如何使用 beautifulsoup 提取段落标签中的完整文本