张量流会话运行时间随时间增加



我正在使用TF运行图像识别(session.run(。我正在循环图像文件夹并按顺序一个接一个地识别它们。我遇到了奇怪的现象,~20-500 张图像(取决于机器(后,每个会话的运行时间都在增加。在几百张图像之后,持续时间几乎慢了 100 倍。很明显,我正在构造函数中创建会话并在另一个函数中使用它。请参阅下面的类代码,我创建了一个实例,并根据图像循环使用识别函数。

有人也遇到过这种情况吗,有什么解决方案吗?

def __init__(self, verboseSingleRec=True, verboseSummary=True, modelFile='model.pb', labelFile='labels.txt',
height=299, width=299, mean=0, std=255,
input_layer='Mul', output_layer='final_result'):
self.model_file = modelFile
self.label_file = labelFile
self.verbose = False
# Load Graph
graph = tf.Graph()
graph_def = tf.GraphDef()
with open(model_file, "rb") as f:
graph_def.ParseFromString(f.read())
with graph.as_default():
self.graph  = tf.import_graph_def(graph_def)
# Load Labels
label = []          
proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()
for l in proto_as_ascii_lines:
label.append(l.rstrip())
self.labels = label
# Init session
self.tfSession = tf.Session(graph=self.graph)
def recognize(self, image):
tf.reset_default_graph()
input_height=299,
input_width=299,
input_mean=0,
input_std=255
with tf.Graph().as_default():
# Get Tensor from image path
input_name = "file_reader"
output_name = "normalized"
file_reader = tf.read_file(image, input_name)
image_reader = tf.image.decode_png(file_reader, channels=3, name='png_reader')
float_caster = tf.cast(image_reader, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0);
resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
sess = tf.Session()
session_result_1 = sess.run(normalized)
input_name = "import/" + self.input_layer
output_name = "import/" + self.output_layer
input_operation = self.graph.get_operation_by_name(input_name);
output_operation = self.graph.get_operation_by_name(output_name);
sess = self.tfSession
session_result_2 = sess.run(output_operation.outputs[0],
{input_operation.outputs[0]: session_result_1})
return session_result_2 

您的问题是由于数据流范式以及 TensorFlow 计算图的错误使用

这个想法是,你只计算一次图,然后使用你的会话对象运行图的节点。此外,图形应该是完全连接的。

在您的代码中,有两个问题不遵循此模式:

  1. 对于每次运行识别,您都会构建图形的全新部分,并且图形会不断增长,从而导致您正在谈论的性能降低问题。构建嵌入在对象内部的模型的常用方法之一是完全在构造函数中构建模型,并仅使用方法返回特定节点。

  2. 您将图形拆分为两个不同的组件。首先检索session_result_1,然后将其作为图形另一个组件的输入提供。尝试找到一种方法来连接这两个部分(构造函数中的所有内容(,以便您可以通过单次执行会话来检索结果。

最新更新