Google Colab中TensorFlow目标检测报错:module 'nets'无'autograd'属性
AttributeError: module 'nets' has no attribute 'autograd'错误 我之前也碰到过一模一样的坑,这个错误的核心原因是Python模块命名冲突——你的环境里装了一个和TensorFlow Model Zoo官方nets目录同名的第三方包,导致Python优先导入了这个错误的nets模块,而不是Model Zoo Slim库中的官方模块。
你看报错日志里的路径:/usr/local/lib/python3.6/dist-packages/nets/__init__.py,这个是pip安装的第三方包路径,完全不是你/content/models/research/slim/nets下的官方模块,所以才会出现找不到autograd属性的问题(官方的nets根本没有这个东西)。
下面是一步步的解决方案:
步骤1:卸载冲突的nets第三方包
先确认这个冲突包存在,在Colab里运行:
pip list | grep nets
如果能看到nets包的条目,直接卸载它:
pip uninstall -y nets
步骤2:正确设置PYTHONPATH环境变量
你之前只把object_detection目录加入了PYTHONPATH,但Model Zoo的nets模块在slim目录下,必须把这个路径也加上。在Colab里执行:
%cd '/content/models/research' os.environ['PYTHONPATH'] = '/content/models/research:/content/models/research/slim:' + os.environ['PYTHONPATH']
或者用更直接的shell命令:
!export PYTHONPATH=/content/models/research:/content/models/research/slim:$PYTHONPATH
步骤3:重新运行训练脚本
回到object_detection目录,再次执行训练命令:
%cd '/content/models/research/object_detection' !python legacy/train.py --train_dir=training/ --pipeline_config_path=training/ssd_mobilenet_v1_pets.config --logtostderr
可选:验证导入是否正确
如果还是有问题,可以先测试导入,确认用的是官方模块:
import nets print(nets.__file__)
如果输出是/content/models/research/slim/nets/__init__.py就说明路径设置正确了;要是还是指向/usr/local/lib/python3.6/dist-packages/nets,要么是冲突包没卸载干净,要么是PYTHONPATH设置没生效,重启Colab runtime再试一次就行。
小提醒
以后尽量避免安装和TensorFlow官方模块重名的第三方包,这种命名冲突的问题排查起来特别费时间。另外在Colab里每次重启runtime后,都要重新设置PYTHONPATH,最好把这些配置命令放在笔记本最开头,方便一键执行。
内容的提问来源于stack exchange,提问作者Isra

