TensorFlow技术疑问:会话外使用lambda及MTCNN创建代码困惑
理清TensorFlow中MTCNN初始化的代码逻辑
各位好,我最近在读一段TensorFlow代码(第85-89行)的时候,对里面的图和会话管理逻辑有点懵,于是我修改了代码,把逻辑拆解得更明白:
with tf.Graph().as_default(): gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_memory_fraction) sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, log_device_placement=False)) with sess.as_default(): pnet = align.detect_face.create_mtcnn(sess, None) out = pnet(img_y)
先拆解下这段代码的核心流程:
- 首先创建一个新的TensorFlow图,并把它设为当前默认图;
- 接着配置GPU内存分配比例,用这个配置初始化会话;
- 再把这个会话设为当前默认会话,确保后续的MTCNN操作都绑定在这个会话和对应的图上;
- 最后初始化MTCNN的P-Net,传入会话和空的模型路径,然后用它对图片
img_y做推理。
再看下create_mtcnn函数的部分定义:
def create_mtcnn(sess, model_path): if not model_path: model_path...
从这个片段能看出来,当传入的model_path为空时,函数内部应该会有默认的模型加载逻辑(比如从预设路径读取权重文件)。
我修改后的代码把图和会话的上下文层级明确区分开了,在TensorFlow 1.x这种静态图模式下,如果不做这种显式的上下文管理,很容易出现跨图操作的错误——毕竟所有计算操作都绑定在特定的图和会话上,这样的写法能让逻辑更直观,后续排查问题也更方便。
内容的提问来源于stack exchange,提问作者Tengerye
相关产品推荐
相关产品推荐

