MASK RCNN 遇到 Tensorflow 2.x 修改记录
由于TensorFlow环境升级至2.2.0,导致MASK RCNN运行出现问题,主要问题及解决方法如下:1)修改所有涉及import tensorflow的代码,将tf改为tensorflow.compat.v1并启用tf.disablev2behavior();2)修复ParallelModel类初始化时的报错,需在init方法中调用父类初始化;3)修正tf.Tensor作为布尔值的报错,需注释掉相关代码;4)解决ParallelModel无metricstensors属性的报错,需在代码循环前重置metricstensors。
由于服务器上的Tensorflow环境升级至2.2.0版本,导致MASK RCNN在运行过程中出现了性能下降和预测速度变慢的问题。为便于后续排查和优化,现将遇到的问题及相应的解决方法进行汇总整理。
环境:anaconda3 python3.7 tensorflow-gpu2.2.0 keras2.3.1
- 所有涉及import tensorflow 的部分都要改,将mrcnn文件下model.py, parallel_model.py和utils.py中import tensorflow as tf 改为import tensorflow.compat.v1 as tf ; 并添加tf.disable_v2_behavior()
- 报错: RuntimeError: It looks like you are subclassing
Modeland you forgot to callsuper(YourClass, self).__init__(). 建议在使用tf.keras时,避免进行类继承操作,这可能导致上述错误。建议改用tf.keras框架以避免类似问题。
在类体中,ParallelModel的定义为class ParallelModel(KM.Model): def init(self, keras_model, gpu_count)。在类体中,ParallelModel的初始化方法中,在第一行添加super(ParallelModel, self).init()。
3. 报错信息: 在图执行中,使用tf.Tensor作为Python bool是不被允许的,具体错误信息为OperatorNotAllowedInGraphError。建议改用 eager execution 或对函数进行装饰以使用 @tf.function。
修改:
在model.py文件中搜索 if layer.output in self.keras_model.losses: ,将该if语句及其后续的continue语句注释掉。此if语句似乎并无实质功能,注释掉后对训练过程不会产生任何影响。
报错提示显示:ParallelModel对象中未定义的属性是metrics_tensors
修改:
在model.py文件中,查找self.keras_model.metrics_tensors.append(loss)。在该for循环的起始处,初始化self.keras_model.metrics_tensors为空列表。
