如何更改 Keras 中深度学习层的名称?

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 张量流
2021-10-06 14:30:32

我正在使用vgg16创建深度学习模型。我想知道如何在 Keras 中更改深度学习各层的名称?

我试过这个

for layer in vgg_model.layers:
    layer.name = layer.name + str("_")

但是当我更改图层的名称时,模型精度会变低

3个回答

我做了一个小例子,基本上和你的代码一样,我证明得到了预期的结果:

进口

In [1]: from keras.models import Sequential
In [2]: from keras.layers import Dense

建立模型

注意name参数:

In [3]: model = Sequential()
In [4]: model.add(Dense(50, input_shape=(20, 20), name='dense1'))
In [5]: model.add(Dense(30, name='dense2'))
In [6]: model.add(Dense(1, name='dense3'))
In [7]: model.compile('rmsprop', 'mse')
In [8]: model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense1 (Dense)               (None, 20, 50)            1050      
_________________________________________________________________
dense2 (Dense)               (None, 20, 30)            1530      
_________________________________________________________________
dense3 (Dense)               (None, 20, 1)             31        
=================================================================

重命名图层

编辑:似乎较新版本的 Keras 和tf.kerasAPI 现在不允许通过layer.name = "new_name". 相反,您必须将新名称分配给私有属性layer._name.

In [9]: for i, layer in enumerate(model.layers):
    ...:     # layer.name = 'layer_' + str(i)    <-- old way
    ...:     layer._name = 'layer_' + str(i)
In [10]: model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
layer_0 (Dense)              (None, 20, 50)            1050      
_________________________________________________________________
layer_1 (Dense)              (None, 20, 30)            1530      
_________________________________________________________________
layer_2 (Dense)              (None, 20, 1)             31        
=================================================================

所以我们看到图层现在有了新名称!

进一步检查

我可以看到图层本身的内部标识符没有改变我展示了第一层的权重,因为我们看到原始标签仍然存在:

In [11]: a = model.layers[0]
In [12]: a.weights
Out[12]: 
[<tf.Variable 'dense1/kernel:0' shape=(20, 50) dtype=float32_ref>,
 <tf.Variable 'dense1/bias:0' shape=(50,) dtype=float32_ref>]

我们看到该dense1名称在图层容器中仍然可见,并且其形状和数据类型未更改。

我还通过运行初始化模型权重model.get_weights(),然后像以前一样将层重命名为新名称,编译模型并看到层的名称像以前一样被更改,并且权重本身没有改变,即重新初始化。包含完全相同的值。这意味着重命名图层不会导致准确性下降。

可能是由于未正确加载预训练的权重造成的。检查你是否model.load_weights使用by_name=True

看到这个

你需要使用: layer._name = layer.name + str('asdf')