这是我关于机器学习的第一篇文章。 最近,我一直专业从事机器学习和计算机视觉。 在本文以及以后的文章中,我将分享使用TensorFlow和Keras时对特定问题的观察和解决方案。 在本文中,我将讨论与TensorFlow和Keras一起使用时的一个不明显的问题-同时加载和执行多个模型。 如果您不熟悉TensorFlow和Keras的内部工作方式,那么对于初学者来说,这个问题可能是个问题。 如果您对该主题感兴趣,请放在下面。
TensorFlow将内存中神经网络模型中的计算呈现为初始化期间操作之间的依赖关系图。 执行模型时,TensorFlow在特定会话内对图形执行计算。 我不会在Tensorflow中详细介绍这些实体。
您可以在
此处和
此处阅读有关
Medium和Habré的图表和会话的更多信息。
通常,我们使用一个模型,这里没有问题。 现在,让我们想象一下我们正在使用两个类。 这两类都使用Keras模型:创建神经体系结构,加载训练后的权重并执行预测。 当在一个管道中执行两个类别时(例如,第一步,我们在照片中执行人脸检测,然后在第二步中进行人脸识别),可能会发生类似的错误:
Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph
出现错误的原因是,默认情况下,Keras仅
适用于默认会话,而不会将新会话注册为默认会话。
使用Keras模型时,用户必须将新会话明确设置为默认会话。 可以这样完成:
self.graph = tf.Graph() with self.graph.as_default(): self.session = tf.Session(graph=self.graph) with self.session.as_default(): self.model = WideResNet(face_size, depth=depth, k=width)() model_dir = <model_path> ... self.model.load_weights(fpath)
我们创建一个新的TensorFlow图和会话并将模型加载到新的TensorFlow会话中。
弦乐
with self.graph.as_default():
表示
我们要使用新图表()作为默认图表并在行中
with self.session.as_default():
我们表明我们要使用self.session作为默认会话,并在该会话中执行后续代码。 with构造函数创建了一个上下文管理器,该上下文管理器允许我们在处理资源密集型对象(例如,读取文件)时有效地使用内存,因为当我们退出with块时,它会自动释放资源。
当我们需要完成预测时,我们可以这样进行:
with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1)
我们只是在之前创建的TF会话中调用predict()方法。
现在就这些了。 祝大家好运,很快再见!