首页 > 解决方案 > 为什么删除和重新创建模型后,keras 中的层号不是从 1 开始?

问题描述

我是 keras 的新手,我正在尝试创建一个 CNN 模型。我创建了一个顺序模型如下 -

model = models.Sequential()
model.add(layers.Conv2D(32, (5, 5), activation='relu', input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
print(model.summary())

我得到的摘要如下 -


Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 146, 146, 32)      2432      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 73, 73, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 71, 71, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 35, 35, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 33, 33, 64)        36928     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 16, 16, 64)        0         
=================================================================
Total params: 57,856
Trainable params: 57,856
Non-trainable params: 0
_________________________________________________________________

在此之后,我使用删除模型del model并使用上面的代码再次创建它,我得到的摘要如下 -


Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_4 (Conv2D)            (None, 146, 146, 32)      2432      
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 73, 73, 32)        0         
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 71, 71, 64)        18496     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 35, 35, 64)        0         
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 33, 33, 64)        36928     
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 16, 16, 64)        0         
=================================================================
Total params: 57,856
Trainable params: 57,856
Non-trainable params: 0
_________________________________________________________________

那么,为什么这个摘要显示来自 conv2d_4 的层编号它应该来自conv2d_1

即使我创建另一个模型-

model_2 = models.Sequential()
model_2.add(layers.Conv2D(32, (5, 5), activation='relu', input_shape=(150, 150, 3)))
model_2.add(layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model_2.add(layers.Conv2D(64, (3, 3), activation='relu'))
model_2.add(layers.MaxPooling2D((2, 2)))
model_2.add(layers.Conv2D(64, (3, 3), activation='relu'))
model_2.add(layers.MaxPooling2D((2, 2)))
print(model_2.summary())

我在前一个模型的最终层数之后开始编号-


Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_7 (Conv2D)            (None, 146, 146, 32)      2432      
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 73, 73, 32)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 71, 71, 64)        18496     
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 35, 35, 64)        0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 33, 33, 64)        36928     
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 16, 16, 64)        0         
=================================================================
Total params: 57,856
Trainable params: 57,856
Non-trainable params: 0
_________________________________________________________________

标签: pythonkeras

解决方案


这取决于您使用的后端:

你可以看到(https://github.com/keras-team/keras/blob/master/keras/engine/base_layer.py#L132):

name = _to_snake_case(prefix) + '_' + str(K.get_uid(prefix))

并且 Keras 不会重置 uids on del model。当使用 tensorflow 后端时,Keras 确实会重置 uids 虽然 on clear_session()


推荐阅读