Tensorflow:继续训练包含更多数据的图形(.pb)

时间:2019-01-15 14:11:32

标签: python tensorflow

我是Tensorflow的新手,并遵循了这个简单的花卉图像分类器指南https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0。因此,现在我有了一个图形文件“ retrained_graph.pb”和一个文本文件“ retrained_labels.txt”,我想继续训练该模型以区分更多的花朵(和其他对象),并使用旧花朵类别中的更多图像进行训练。如何在不重新训练整个最后一层的情况下继续训练模型。同样,我对Python和Tensorflow还是很陌生,所以如果我说错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

首先,这对初学者来说是一个答案,因此,我将尽可能清楚地包括我所做的一切。这种图像分类的解决方案称为转移学习,它采用经过训练的模型,然后仅对模型的最后一层进行重新训练,这不仅比建立您自己的模型花费的时间更少,而且可以保持较高的准确性。 (请记住,此过程会在训练之前将图像分辨率降低到300x300或更低,因此,如果您要使用高分辨率图像,建议阅读此Train High Definition images with Tensorflow and inception V3 pre trained model。)

我使用Tensorflow图像分类再训练示例(因为诗人的tensorflow不会为您保存检查点,并且检查点对于进一步培训很重要),在完成本教程之后,您将拥有几个文件,检查点和图形,这些文件已保存在/ tmp文件夹中(请确保将它们复制到其他地方,因为在计算机关闭时tmp会被删除;要导航到/ tmp文件夹,请在终端上输入“ open / tmp”):https://www.tensorflow.org/hub/tutorials/image_retraining

以下是检查点文件的说明:https://stackoverflow.com/a/45033500/10917154

一段时间后,我发现您无法继续训练带有新图像的图形:Saving model in tensorflow

但是,相反,您必须保存带有检查点的进度(脚本已经为您完成了此工作),然后加载检查点以继续训练,在脚本retrain.py中将目录更改为保存检查点的目录,然后为此:https://github.com/tensorflow/hub/issues/37#issuecomment-384237524

可悲的是,我还没有找到一种方法来向训练有素的模型添加更多的类,并且只能用旧的类来训练更多的数据。

在本教程的this部分,您还将看到有两个变量分别称为“ input_layer”和“ output_layer”,要了解模型的输入/输出层,请运行以下命令:List of tensor names in graph in Tensorflow,第一行和最后一行应该是模型的输入/输出层。

我采取了另一个步骤,将图形转换为tflite,以便在移动设备上使用它。要进行转换,您必须冻结图形(graph-> frozen_graph-> tflite)How to convert a retrained model to tflite format?,幸运的是,本教程中的脚本已经为我们冻结了图形。所以现在我们只需要转换它即可(您可以将.tflite更改为.lite,反之亦然)。

$ tflite_convert \
--output_file=/.../output_graph.tflite \
--graph_def_file=/.../output_graph.pb \
--input_arrays=Placeholder \
--output_arrays=final_result \
--output_format=TFLITE \
--inference_type=FLOAT \
--inference_input_type=FLOAT

对于其他一些图形,它会要求我们提供输入形状,我们可以在命令中再添加1条线(224,224是训练模型所使用图像的分辨率,分别将其更改为您的模型; 3是对于RGB):

--input_shape=1,224,224,3

一旦有了tflite,就可以将其添加到Tensorflow示例中并运行它: https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/ios/camera