Naprawdę nie mogę się doczekać rozpoczęcia korzystania z nowej biblioteki Google Tensorflow w C ++. Witryna i dokumentacja są po prostu naprawdę niejasne, jeśli chodzi o tworzenie interfejsu API C ++ projektu i nie wiem, od czego zacząć.
Czy ktoś z większym doświadczeniem może pomóc, odkrywając i udostępniając przewodnik po korzystaniu z interfejsu API C ++ tensorflow?
c++
tensorflow
theideasmith
źródło
źródło
Odpowiedzi:
Jedną z alternatyw dla korzystania z Tensorflow C ++ API, które znalazłem, jest użycie cppflow .
Jest to lekkie opakowanie C ++ wokół interfejsu API języka C Tensorflow . Otrzymujesz bardzo małe pliki wykonywalne i łączy się z
libtensorflow.so
już skompilowanym plikiem. Istnieją również przykłady użycia i używasz CMAKE zamiast Bazela.źródło
Aby rozpocząć, należy pobrać kod źródłowy z Github, postępując zgodnie z instrukcjami tutaj (będziesz potrzebować Bazela i najnowszej wersji GCC).
C ++ API (i zaplecze systemu) jest w
tensorflow/core
. Obecnie obsługiwane są tylko C ++ Session i C API . Możesz użyć dowolnego z nich do wykonywania wykresów TensorFlow, które zostały zbudowane przy użyciu interfejsu API języka Python i serializowane doGraphDef
buforu protokołu. Dostępna jest również funkcja eksperymentalna do tworzenia wykresów w C ++, ale obecnie nie jest ona w pełni funkcjonalna jak API Pythona (np. Obecnie nie obsługuje automatycznego różnicowania). Możesz zobaczyć przykładowy program, który tworzy mały wykres w C ++ tutaj .Druga część C ++ API to API do dodawania nowego
OpKernel
, czyli klasy zawierającej implementacje numerycznych jąder dla CPU i GPU. Istnieje wiele przykładów, jak je wbudowaćtensorflow/core/kernels
, a także samouczek dotyczący dodawania nowej operacji w C ++ .źródło
Aby dodać do posta @ mrry, przygotowałem samouczek, który wyjaśnia, jak załadować wykres TensorFlow za pomocą interfejsu API C ++. Jest to bardzo minimalne i powinno pomóc ci zrozumieć, jak wszystkie elementy pasują do siebie. Oto jego mięso:
Wymagania:
Struktura folderów:
tensorflow/tensorflow/|project name|/
tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
tensorflow/tensorflow/|project name|/BUILD
BUDOWAĆ:
Dwa zastrzeżenia, dla których prawdopodobnie istnieją obejścia:
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
źródło
./loader
pojawia się błąd:Not found: models/train.pb
.Jeśli chcesz uniknąć zarówno budowania swoich projektów w Bazelu, jak i generowania dużego pliku binarnego, przygotowałem repozytorium instruujące użycie biblioteki TensorFlow C ++ z CMake. Znajdziesz go tutaj . Ogólne pomysły są następujące:
tensorflow/BUILD
(dostarczone nie obejmują wszystkich funkcji C ++).źródło
Po pierwsze, po zainstalowaniu
protobuf
ieigen
chcesz zbudować Tensorflow:Następnie skopiuj poniższe nagłówki i dynamiczną bibliotekę współdzieloną do
/usr/local/lib
i/usr/local/include
:Na koniec skompiluj na przykładzie:
źródło
Jeśli myślisz o użyciu interfejsu API Tensorflow c ++ na samodzielnym pakiecie, prawdopodobnie będziesz potrzebować tensorflow_cc.so (istnieje również wersja tensorflow.so ac api), aby zbudować wersję c ++, której możesz użyć:
Uwaga 1: Jeśli chcesz dodać obsługę funkcji wewnętrznych, możesz dodać te flagi jako:
--copt=-msse4.2 --copt=-mavx
Uwaga 2: Jeśli myślisz o wykorzystaniu OpenCV również w swoim projekcie, występuje problem podczas używania obu bibliotek razem ( problem z tensorflow ) i powinieneś użyć
--config=monolithic
.Po zbudowaniu biblioteki musisz dodać ją do swojego projektu. Aby to zrobić, możesz uwzględnić te ścieżki:
I połącz bibliotekę ze swoim projektem:
A kiedy budujesz swój projekt, powinieneś również wskazać swojemu kompilatorowi, że zamierzasz używać standardów C ++ 11.
Uwaga boczna: ścieżki względem tensorflow w wersji 1.5 (może być konieczne sprawdzenie, czy w Twojej wersji coś się zmieniło).
Również ten link bardzo mi pomógł w znalezieniu tych wszystkich informacji: link
źródło
tensorflow/bazel-tensorflow/external/com_google_absl
Możesz użyć tego ShellScript do zainstalowania (większości) jego zależności, klonowania, budowania, kompilowania i pobierania wszystkich niezbędnych plików do
../src/includes
folderu:https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
źródło
Jeśli nie masz nic przeciwko używaniu CMake, istnieje również projekt tensorflow_cc , który buduje i instaluje API TF C ++, wraz z wygodnymi celami CMake, z którymi możesz się połączyć. Projekt README zawiera przykład i pliki Dockerfiles, które możesz łatwo śledzić.
źródło
Jeśli nie chcesz samodzielnie budować Tensorflow, a Twój system operacyjny to Debian lub Ubuntu, możesz pobrać gotowe pakiety z bibliotekami Tensorflow C / C ++. Ta dystrybucja może być używana do wnioskowania C / C ++ z procesorem, obsługa GPU nie jest uwzględniona:
https://github.com/kecsap/tensorflow_cpp_packaging/releases
Istnieją instrukcje, jak zamrozić punkt kontrolny w Tensorflow (TFLearn) i załadować ten model do wnioskowania za pomocą interfejsu API C / C ++:
https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md
Uwaga: jestem twórcą tego projektu na Githubie.
źródło
Używam hacka / obejścia, aby uniknąć konieczności samodzielnego budowania całej biblioteki TF (co oszczędza zarówno czas (jest konfigurowany w 3 minuty), miejsce na dysku, instalowanie zależności dev i rozmiar wynikowego pliku binarnego). Oficjalnie nie jest obsługiwany, ale działa dobrze, jeśli chcesz po prostu szybko wskoczyć.
Zainstaluj TF przez pip (
pip install tensorflow
lubpip install tensorflow-gpu
). Następnie znajdź jego bibliotekę_pywrap_tensorflow.so
(TF 0. * - 1.0) lub_pywrap_tensorflow_internal.so
(TF 1.1+). W moim przypadku (Ubuntu) znajduje się pod adresem/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so
. Następnie utwórz dowiązanie symboliczne do tej biblioteki o nazwielib_pywrap_tensorflow.so
gdzieś, gdzie znajduje ją twój system budowania (np/usr/lib/local
.). Prefikslib
jest ważny! Możesz również nadać mu innąlib*.so
nazwę - jeśli ją nazwieszlibtensorflow.so
, możesz uzyskać lepszą kompatybilność z innymi programami napisanymi do pracy z TF.Następnie stwórz projekt w C ++ taki, do jakiego jesteś przyzwyczajony (CMake, Make, Bazel, cokolwiek lubisz).
A potem jesteś gotowy, aby po prostu połączyć się z tą biblioteką, aby mieć TF dostępne dla twoich projektów (i musisz również połączyć się z
python2.7
bibliotekami)! W CMake np. Po prostu dodajesztarget_link_libraries(target _pywrap_tensorflow python2.7)
.Pliki nagłówkowe C ++ znajdują się wokół tej biblioteki, np
/usr/local/lib/python2.7/dist-packages/tensorflow/include/
. W.Jeszcze raz: ten sposób jest oficjalnie nieobsługiwany i możesz biegać w różnych sprawach. Biblioteka wydaje się być statycznie połączona z np. Protobuf, więc możesz działać z dziwnymi problemami w czasie łączenia lub wykonywania. Ale jestem w stanie załadować zapisany wykres, przywrócić wagi i uruchomić wnioskowanie, co jest najbardziej pożądaną funkcją IMO w C ++.
źródło
undefined reference to 'PyType_IsSubtype'
python2.7
biblioteki ... Odpowiednio zmodyfikuję post.Sam Tensorflow zawiera tylko bardzo podstawowe przykłady dotyczące interfejsów API C ++.
Oto dobry zasób, który zawiera przykłady zestawów danych, rnn, lstm, cnn i więcej
przykładów tensorflow c ++
źródło
powyższe odpowiedzi są wystarczająco dobre, aby pokazać, jak zbudować bibliotekę, ale sposób zbierania nagłówków jest nadal trudny. tutaj udostępniam mały skrypt, którego używam do kopiowania niezbędnych nagłówków.
SOURCE
jest pierwszym parametrem, który jest direcoty źródła (kompilacji) tensorflow;DST
jest drugim parametrem, czyliinclude directory
przechowuje zebrane nagłówki. (np. w cmake,include_directories(./collected_headers_here)
).źródło
mkdir -p $DST/tensorflow$target_dir
wcześniejcp $line $DST/tensorflow/$target_dir