一、安装bazel
1、安装MSYS2 shell
根据系统选择需要下载的版本,安装之后配置环境变量,例如:\msys64\usr\bin
2、安装Microsoft Visual C++ Redistributable for Visual Studio 2015
3、根据系统从GitHub下载bazel,例如:bazel-0.16.1-windows-x86_64.exe,下载后,改名为bazel.exe方便使用,并将所在位置添加到环境变量
4、如果需要用到python,那么需要把python添加到环境变量;如果需要用到java,那么需要下载jdk,安装之后添加到环境变量
二、编译graph_transforms
1、从cmd打开tensorflow目录,输入以下指令编译:bazel build tensorflow/tools/graph_transforms:transform_graph
,编译成功会显示:

2、编译的时候,有可能会出现各种问题,根据实验猜测可能的原因:bazel有bug,bazel和tensorflow的版本不匹配。
(1)tf1.9和tf1.10,使用bazel-0.24.0和bazel-0.17.2都无法编译
(2)tf1.9和tf1.10,使用bazel-0.19.0编译到一半出现错误
(3)tf1.5,使用bazel-0.19.0编译到一半出现错误
(4)tf1.5,使用bazel-0.17.2编译成功
3、使用tf1.5和bazel-0.17.2,编译quantize_graph,输入的指令为:bazel build tensorflow/tools/quantization:quantize_graph
经过测试,在使用quantize_graph的时候,只有默认的round模式可以使用,其他的模式(quantize, eightbit, weights, weights_rounded)都会报错。猜测原因:版本有bug


经过测试,optimize_for_inference可以使用。
三、简单的方式使用quantize_graph
实际上,在tensorflow的工具箱里有quantize_graph的python版本,可以直接使用,存放的位置:
tensorflow\tensorflow\tools\quantization
,如果下载的是tf1.5,在使用的时候和bazel编译出来的版本一样,会出现错误。接下来测试了tf1.10版本,round模式和weights模式没有问题,但是eightbit模式会出现如下错误:ValueError: zero-size array to reduction operation minimum which has no identity
,找到代码错误的地方,发现是min_value = np.min(float_tensor.flatten()), max_value = np.max(float_tensor.flatten())
这两行代码出错,原因是因为这个矩阵是空矩阵,在这个地方进行如下修改:
np_modify = float_tensor.flatten()
if np_modify.size == 0:
min_value = 0
max_value = 0
else:
min_value = np.min(float_tensor.flatten())
max_value = np.max(float_tensor.flatten())
修改之后,eightbit模式可以正常运行。
网友评论