Keras Functional API在K折交叉验证中Dense层命名递增问题咨询
为啥K折交叉验证时Dense层命名会递增?
嘿,这个问题我之前做K折交叉验证的时候也踩过坑!其实本质是Keras的自动命名机制在搞小动作,咱们一步步说:
核心原因:Keras的自动命名计数器不会重置
- Keras默认会给每一个新创建的层分配一个带递增编号的名称,比如第一个Dense层叫
dense_1,第二个叫dense_2,以此类推。 - 当你跑K折交叉验证时,每一轮折都会重新构建一次完整的模型——哪怕你写的代码结构完全一样,每一轮都会生成全新的层实例。而Keras内部的命名计数器是全局的,不会因为你开始新的一折就重置,所以每一轮的层命名都会在上一轮的基础上继续累加,反映在拟合历史对象的指标名称(比如
dense_5_acc)里,编号自然就越来越大了。
为啥模型摘要显示结构没问题?
因为每一轮你都是按照相同的结构定义模型,所以模型摘要里的层数量、参数规模、连接关系都是完全正确的——只是这些层是全新的实例,名字被自动续上了编号而已,和模型的功能、结构半毛钱关系都没有。
怎么解决这个问题?
最简单的办法就是手动指定层的名称,在定义Dense层的时候加上name参数,比如:
Dense(64, activation='relu', name='fixed_dense_layer')
这样不管你构建多少次模型,这个层的名字都是fixed_dense_layer,对应的指标名称也会固定为fixed_dense_layer_acc,再也不会出现编号乱跳的情况了。
内容的提问来源于stack exchange,提问作者Akhan
相关产品推荐
相关产品推荐

