tensorflow 모델 압축 문제 해결_구덩이를 무수히 밟아서 마침내 해결되었다

1.bazel을 설치하고github에서 linux 버전을 다운로드합니다.sh 파일, 설치
2. GitHub에서 최신 TensorFlow 소스 다운로드
3. TensorFlow 소스 폴더로 들어가 명령을 입력합니다.

bazel build tensorflow/tools/graph_transforms:transform_graph
이곳은 각종 구덩이를 만날 수 있다. 예를 들면
ERROR:/opt/tf/tensorflow-master/tensorflow/core/kernels/BUILD:3044:1: C++ compilation of rule ‘//tensorflow/core/kernels:matrix_square_root_op' failed (Exit 4)
gcc: internal compiler error: Killed (program cc1plus)
이 오류는 cpu 부하가 너무 커서 행 코드가 필요합니다

#  swap 
sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=512
#  
sudo mkswap /mnt/512Mb.swap
#   
sudo swapon /mnt/512Mb.swap
아니면 이 @aws Error downloading
내가 보기에 csdn에 있는 블로거 해결 방법은 임시 폴더에서 파일을 삭제하고 다시 다운로드하는 것이다. 그러나 나는 이쪽에서 쓸모가 없다는 것을 발견했다. 이쪽의 해결 방법은bazel을 실행하기 전에 명령을 입력하는 것이다.

sed -i '\@https://github.com/aws/aws-sdk-cpp/archive/1.5.8.tar.gz@aws' tensorflow/workspace.bzl
명령의 사이트 주소는 실제 다운로드할 파일의 주소입니다. 어떤 주소는 바뀔 수 있기 때문입니다
여기 와서 bazel을 컴파일하면 완성됩니다.
4. 컴파일하면 모형이 압축되고 코드도 한 줄, in_graph 는 입력 모델 경로, outputs 부동, out_graph는 출력 모델 경로,transforms는quantize_weights면 됩니다. 이것은 32bit를 8bit로 바꾸는 것이고 이 방법이 가장 효과적인 단계입니다.내가 보기에 어떤 블로거들은 Summary를 먼저 컴파일한 다음에 입력과 출력의 결점을 인쇄한 다음에 파라미터를 한 무더기 입력하고 결점 따위를 삭제한다. 나는 이쪽에서 모두 시험해 보았지만 최종적으로 모델의 크기를 더 줄이지 않았기 때문에 이렇게 하면 된다.

bazel-bin/tensorflow/tools/graph_transforms/transform_graph --in_graph=../model/ctpn.pb  --outputs='output_node_name'  --out_graph=../model/quantized_ctpn.pb  --transforms='quantize_weights'
최종적으로 68m에서 17m, 75%의 축소 비율로 축소되었는데 실측 효과는 기본적으로 별 차이가 없고 이 방법은 그래도 매우 유용하다.
보충: 모델 압축 1, 2, 3의tensorflowckpt모델의 매개 변수와 수치 보기

ckpt 모델 매개 변수와 수치 보기


import os
from tensorflow.python import pywrap_tensorflow
checkpoint_path = os.path.join("< >", "./model.ckpt-11000") 
# Read data from checkpoint file
reader = pywrap_tensorflow.NewCheckpointReader(checkpoint_path)
var_to_shape_map = reader.get_variable_to_shape_map()
# Print tensor name and values
for key in var_to_shape_map:
 print("tensor_name: ", key)
 print(reader.get_tensor(key))

참고:


1,'<당신의 모델 디렉터리>'는 당신의 메타, ckpt 이 모델들이 저장된 경로를 가리킨다.
예를 들어 경로/모델/모델.ckpt-11000.meta'이런, 그러면'<당신의 모델 디렉터리>'바로'/models'
2. 디렉터리에 여러 개의 ckpt가 있을 때 최신 모델 이름을 ckpt-<최대 숫자>로 지으면 됩니다. 뒤에 사용하지 않습니다.
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기