为了尝试使用TF和PY3.5进行初始-v3转移学习,我测试了两种方法:
1-重新训练最后一层,如下所示:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/image_retraining
2-在初始-V3瓶颈之上应用线性SVM,如下所示:https://www.kernix.com/blog/image-classification-with-a-pre-trained-deep-neural-network_p11
预计,他们应该在分类阶段有类似的运行时间,因为关键部分 - 瓶颈提取 - 是相同的。但实际上,在运行分类时,再训练网络的速度要慢8倍。
我的问题是,是否有人对此有所了解。
一些代码段:
SVM在顶部(速度更快):
def getTensors():
graph_def = tf.GraphDef()
f = open('classify_image_graph_def.pb', 'rb')
graph_def.ParseFromString(f.read())
tensorBottleneck, tensorsResizedImage = tf.import_graph_def(graph_def, name='', return_elements=['pool_3/_reshape:0', 'Mul:0'])
return tensorBottleneck, tensorsResizedImage
def calc_bottlenecks(imgFile, tensorBottleneck, tensorsResizedImage):
""" - read, decode and resize to get <resizedImage> - """
bottleneckValues = sess.run(tensorBottleneck, {tensorsResizedImage : resizedImage})
return np.squeeze(bottleneckValues)
我的(Windows)笔记本电脑大约需要0.5秒,而SVM部分则不需要时间。
重新训练最后一层 - (由于代码较长,因此难以总结)
def loadGraph(pbFile):
with tf.gfile.FastGFile(pbFile, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')
with tf.Session() as sess:
softmaxTensor = sess.graph.get_tensor_by_name('final_result:0')
def labelImage(imageFile, softmaxTensor):
with tf.Session() as sess:
input_layer_name = 'DecodeJpeg/contents:0'
predictions, = sess.run(softmax_tensor, {input_layer_name: image_data})
'pbFile'是保存的文件,它应该具有相同的拓扑和权重,不包括分类层,如'classify_image_graph_def.pb'。这需要大约4秒才能运行(在我的同一台笔记本电脑上,没有加载)。
对性能差距有何想法? 谢谢!
答案 0 :(得分:0)
解决。问题在于为每个图像创建一个新的tf.Session()。在阅读图表并使用它时存储会话使运行时恢复到预期状态。
def loadGraph(pbFile):
...
with tf.Session() as sess:
softmaxTensor = sess.graph.get_tensor_by_name('final_result:0')
sessToStore = sess
return softmaxTensor, sessToStore
def labelImage(imageFile, softmaxTensor, sessToStore):
input_layer_name = 'DecodeJpeg/contents:0'
predictions, = sessToStore.run(softmax_tensor, {input_layer_name: image_data})