Olhando para os documentos oficiais: o que você vê? A tarifa usual? Agora, adivinhe: esta é uma zona livre de Bazel. Usamos cmake aqui!
Esta coleção contém exemplos confiáveis e mortos e simples para usar o tensorflow em C, C ++, Go e Python: carregue um modelo pré-treinado ou compile uma operação personalizada com ou sem CUDA. Todas as compilações são testadas contra a versão mais recente do tensorflow estável e confiam no cmake com um findEnsorflow.cmake personalizado. Este arquivo cmake inclui trabalhos comuns para bugs em versões específicas de TF.
| Tensorflow | Status |
|---|---|
| 1.14.0 | |
| 1.13.1 | |
| 1.12.0 | |
| 1.11.0 | |
| 1.10.0 | |
| 1.9.0 |
O repositório contém os seguintes exemplos.
| Exemplo | Explicação |
|---|---|
| operação personalizada | Construa uma operação personalizada para Tensorflow em C ++/Cuda (requer apenas Pip) |
| Inferência (C ++) | Execute a inferência em C ++ |
| Inferência (C) | Execute a inferência em C |
| Inferência (vá) | Exerir inferência em GO |
| escritor de eventos | Escreva arquivos de eventos para tensorboard em C ++ |
| Exemplo de Inferência de Keras CPP | Execute um modelo Keras em C ++ |
| exemplo simples | Crie e execute um gráfico de tensorflow em C ++ |
| Ressimensione Exemplo de imagem | redimensione uma imagem em tensorflow com/sem opencv |
Este exemplo ilustra o processo de criação de uma operação personalizada usando C ++/CUDA e CMAKE. Não se destina a mostrar uma implementação obtendo pico de desempenho. Em vez disso, é apenas um modelo de caldeira.
user@host $ pip install tensorflow-gpu --user # solely the pip package is needed
user@host $ cd custom_op/user_ops
user@host $ cmake .
user@host $ make
user@host $ python test_matrix_add.py
user@host $ cd ..
user@host $ python example.py Este exemplo ilustra o processo de carregar uma imagem (usando o OpenCV ou TensorFlow), redimensionando a imagem salvando a imagem como um JPG ou PNG (usando OpenCV ou TensorFlow).
user@host $ cd examples/resize
user@host $ export TENSORFLOW_BUILD_DIR=...
user@host $ export TENSORFLOW_SOURCE_DIR=...
user@host $ cmake .
user@host $ make Existem dois exemplos demonstrando o manuseio do Tensorflow que serve: usando uma entrada vetorial e usando uma entrada de imagem codificada.
server@host $ CHOOSE=basic # or image
server@host $ cd serving/ ${CHOOSE} /training
server@host $ python create.py # create some model
server@host $ cd serving/server/
server@host $ ./run.sh # start server
# some some queries
client@host $ cd client/bash
client@host $ ./client.sh
client@host $ cd client/python
# for the basic-example
client@host $ python client_rest.py
client@host $ python client_grpc.py
# for the image-example
client@host $ python client_rest.py /path/to/img.[png,jpg]
client@host $ python client_grpc.py /path/to/img.[png,jpg] Crie um modelo no Python, salve o gráfico no disco e carregue -o em C/C+/Go/Python para executar a inferência. Como esses exemplos são baseados no tensorflow c-api, eles exigem a biblioteca libtensorflow_cc.so , que não é enviada no pip-package (Tensorfow-GPU). Portanto, você precisará construir o tensorflow a partir da fonte antes, por exemplo,
user@host $ ls ${TENSORFLOW_SOURCE_DIR}
ACKNOWLEDGMENTS bazel-genfiles configure pip
ADOPTERS.md bazel-out configure.py py.pynano
ANDROID_NDK_HOME bazel-tensorflow configure.py.bkp README.md
...
user@host $ cd ${TENSORFLOW_SOURCE_DIR}
user@host $ ./configure
user@host $ # ... or whatever options you used here
user@host $ bazel build -c opt --copt=-mfpmath=both --copt=-msse4.2 --config=cuda //tensorflow:libtensorflow.so
user@host $ bazel build -c opt --copt=-mfpmath=both --copt=-msse4.2 --config=cuda //tensorflow:libtensorflow_cc.so
user@host $ export TENSORFLOW_BUILD_DIR=/tensorflow_dist
user@host $ mkdir ${TENSORFLOW_BUILD_DIR}
user@host $ cp ${TENSORFLOW_SOURCE_DIR} /bazel-bin/tensorflow/ * .so ${TENSORFLOW_BUILD_DIR} /
user@host $ cp ${TENSORFLOW_SOURCE_DIR} /bazel-genfiles/tensorflow/cc/ops/ * .h ${TENSORFLOW_BUILD_DIR} /includes/tensorflow/cc/ops/Acabamos de executar um modelo muito básico
x = tf . placeholder ( tf . float32 , shape = [ 1 , 2 ], name = 'input' )
output = tf . identity ( tf . layers . dense ( x , 1 ), name = 'output' ) Portanto, salve o modelo como você regularmente. Isso é feito no example.py além de algumas saídas
user@host $ python example.py
[<tf.Variable 'dense/kernel:0' shape=(2, 1) dtype=float32_ref>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32_ref>]
input [[1. 1.]]
output [[2.1909506]]
dense/kernel:0 [[0.9070684]
[1.2838823]]
dense/bias:0 [0.] user@host $ python python/inference.py
[<tf.Variable 'dense/kernel:0' shape=(2, 1) dtype=float32_ref>, <tf.Variable 'dense/bias:0' shape=(1,) dtype=float32_ref>]
input [[1. 1.]]
output [[2.1909506]]
dense/kernel:0 [[0.9070684]
[1.2838823]]
dense/bias:0 [0.] user@host $ cd cc
user@host $ cmake .
user@host $ make
user@host $ cd ..
user@host $ ./cc/inference_cc
input Tensor<type: float shape: [1,2] values: [1 1]>
output Tensor<type: float shape: [1,1] values: [2.19095063]>
dense/kernel:0 Tensor<type: float shape: [2,1] values: [0.907068372][1.28388226]>
dense/bias:0 Tensor<type: float shape: [1] values: 0> user@host $ cd c
user@host $ cmake .
user@host $ make
user@host $ cd ..
user@host $ ./c/inference_c
2.190951
user@host $ go get github.com/tensorflow/tensorflow/tensorflow/go
user@host $ cd go
user@host $ ./build.sh
user@host $ cd ../
user@host $ ./inference_go
input [[1 1]]
output [[2.1909506]]
dense/kernel:0 [[0.9070684] [1.2838823]]
dense/bias:0 [0]