问题描述
tf2合并了keras,绝大部分操作tf2和keras是相同的效果,但有的报错,比如在集成学习时,在定义了多个基类模型并训练好后,在集成时报错层名有重复的,是因为默认基类模型的层名是按照默认名命名的,所以有重复的(在定义了相同类型的层时),为解决报错,需要修改层名(两种解决报错的思路:1)去除判断层名是否重复的代码,但在其他代码使用该框架时可能出现相同层名却无法及时判定异常的Bug,这样弊大于利;2)增加配置层名的set方法,这样弊端就是层名成员变量可以被外部修改了,其实没觉得是弊端,所以利远大于弊)
问题解决
考虑name是Layer类的一个属性,所以通过model.get_layer()返回一个Layer类的对象,然后跳转进来,进入Layer类的定义代码:
尝试添加set方法,找name变量,注意一定不是局部变量,一定是self.*name*变量(*表示通配符),所以尝试下图,然后get_layer后进行方法调用测试name是否可以修改(如果不修改源码则报错Layer的name属性是只读的,就无法直接layer.name='xx’来赋值)
问题总结
这些在网上找的解决方案都是不痛不痒的,解决不了根本问题,都是本着逃避去解决问题,这样是不对的,最核心的能力应该是迎面而上,总想着绕弯、找替代方法在有些地方是行不通的,尤其是陌生领域,不去思考,只想着投机取巧是不合适的。