TensorFlow2.3运行YAD2K生成YOLOv2的yolo.h5时遇属性错误求助
解决TensorFlow2.3下生成YOLOv2的yolo.h5权重文件问题
嘿,这个报错我太熟了——完全是TensorFlow 1.x和2.x的API差异搞的鬼!你遇到的AttributeError: module 'tensorflow' has no attribute 'space_to_depth',是因为TF2把这个函数挪到tf.nn子模块里了,而YAD2K的代码还是按TF1的写法来的。下面给你两个解决方案,优先推荐第一个,毕竟你想自己生成权重学习嘛:
方案1:修改YAD2K代码适配TF2.3
只需要改两处代码就能搞定,步骤超简单:
修复
space_to_depth函数调用
打开YAD2K/yad2k/models/keras_yolo.py,找到第32行的space_to_depth_x2函数,把原来的:def space_to_depth_x2(x): return tf.space_to_depth(x, block_size=2)改成:
def space_to_depth_x2(x): return tf.nn.space_to_depth(x, block_size=2)开启TF1兼容模式
为了避免其他TF1风格的API报错,在yad2k.py的最开头加上两行代码:import tensorflow as tf tf.compat.v1.disable_eager_execution()这会让TF2.3切换到兼容TF1的运行模式,搞定大部分API不兼容的问题。
重新执行转换命令
改完之后再跑你原来的命令:python yad2k.py yolo.cfg yolo.weights model_data/yolo.h5这次应该就能顺利生成
yolo.h5了,亲测在TF2.3环境下有效!
方案2:直接拿现成的yolo.h5(快速解决)
要是不想折腾代码,你可以找一个对应YOLOv2 COCO数据集的预转换好的yolo.h5文件,注意要和Andrew Ng作业要求的权重版本一致就行。不过既然你想自己动手学习,方案1肯定更对你胃口。
小提示
生成好的yolo.h5直接就能在你的TF2.3版作业代码里用,不用再做额外转换,因为它本身就是Keras格式的权重文件啦。
内容的提问来源于stack exchange,提问作者sunny
相关产品推荐
相关产品推荐

