我正在使用vgg16创建深度学习模型。我想知道如何在 Keras 中更改深度学习各层的名称?
我试过这个
for layer in vgg_model.layers:
layer.name = layer.name + str("_")
但是当我更改图层的名称时,模型精度会变低。
我正在使用vgg16创建深度学习模型。我想知道如何在 Keras 中更改深度学习各层的名称?
我试过这个
for layer in vgg_model.layers:
layer.name = layer.name + str("_")
但是当我更改图层的名称时,模型精度会变低。
我做了一个小例子,基本上和你的代码一样,我证明得到了预期的结果:
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.keras
API 现在不允许通过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')