使用TensorFlow目标检测API训练预训练Faster RCNN模型时遇属性错误
解决TensorFlow目标检测API训练时的
AttributeError: 'FasterRcnn' object has no attribute 'inplace_batchnorm_update'错误 这个错误我之前帮不少开发者排查过,本质上是TensorFlow版本和目标检测API的兼容性问题,或者是模型配置里引用了已经被废弃的方法。下面给你几个靠谱的解决思路:
先从版本对齐入手(最推荐)
不同版本的TensorFlow目标检测API对TensorFlow本体版本要求很严格,比如:
- 如果你用的是TensorFlow 1.x(比如1.15.x这种稳定版),得用对应适配TF1的API分支(也就是官方的
master分支) - 如果是TensorFlow 2.x,必须切换到API的
tf2分支,不然很多老方法都会报错
操作步骤:
- 先确认你当前的TensorFlow版本:
python3 -c "import tensorflow as tf; print(tf.__version__)"
- 去目标检测API的代码仓库,切换到和你TF版本匹配的分支
- 重新安装API依赖:进入
models/research目录,运行python3 setup.py install
调整模型配置文件
如果版本对齐后还是报错,那可能是你的faster_rcnn_resnet101_kitti.config里有过时的配置项:
- 打开配置文件,搜索和
batch_norm相关的设置,看看有没有写inplace_batchnorm_update: true这类内容 - 把这行删掉,或者替换成当前API支持的参数(比如
use_batch_norm: true),因为这个inplace_batchnorm_update方法在新的API版本里已经被移除了
临时修复:给FasterRcnn类补个空方法
要是上面两个方法都没搞定,你可以直接修改API的模型代码来绕过这个错误(这是临时方案,优先选前面的):
- 找到API代码里的
models/research/object_detection/models/faster_rcnn_meta_arch.py文件 - 在
FasterRcnn类里添加一个空的inplace_batchnorm_update方法:
def inplace_batchnorm_update(self): pass
这样代码就不会因为找不到这个属性而报错了。
最后验证
改完之后重新运行你的训练命令:
python3 train.py --logtostderr --train_dir='/training/' --pipeline_config_path='/training/faster_rcnn_resnet101_kitti.config'
如果不再弹出那个AttributeError,就说明问题解决啦!
内容的提问来源于stack exchange,提问作者wik0rl
相关产品推荐
相关产品推荐

