python - 为什么删除和重新创建模型后,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 _________________________________________________________________
解决方案
这取决于您使用的后端:
你可以看到(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()
。
推荐阅读
- python - 查找 pandas 数据框中非 NAN 元素的总数
- c# - 检查状态生存时间是否未过期
- python - python - 如何在没有.capitalize或.upper或.title的情况下将每个单词的首字母大写
- hbase - 使用 HBase 后端从 JanusGraph 批量读取
- python - 使用“通过”更正索引错误但仍然出现“列表索引超出范围”错误?
- vuex - Vuex - 以一定容量清理商店
- firebase - 如何限制 Firestore 的 onSnapshot 监听器返回的数据?
- html - 与导航下拉菜单相关的问题
- javascript - 抓住点击选择,添加选项,然后打开选择下拉菜单
- python - Python lxml XPathEvalError:解析较大文件时xpath表达式出错