TensorFlow.js zawiera wiele wstępnie wyszkolonych modeli, które są gotowe do użycia w przeglądarce - można je znaleźć w naszym repozytorium modeli . Być może jednak znalazłeś lub stworzyłeś model TensorFlow w innym miejscu, którego chcesz użyć w swojej aplikacji internetowej. TensorFlow.js udostępnia w tym celu konwerter modeli. Konwerter TensorFlow.js składa się z dwóch komponentów:
- Narzędzie wiersza poleceń, które konwertuje modele Keras i TensorFlow do użytku w TensorFlow.js.
- API do ładowania i wykonywania modelu w przeglądarce za pomocą TensorFlow.js.
Konwertuj swój model
Konwerter TensorFlow.js współpracuje z kilkoma różnymi formatami modeli:
SavedModel : Jest to domyślny format, w którym zapisywane są modele TensorFlow. Format SavedModel jest udokumentowany tutaj .
Model Keras : modele Keras są zazwyczaj zapisywane jako plik HDF5. Więcej informacji na temat zapisywania modeli Keras znajdziesz tutaj .
Moduł TensorFlow Hub : są to modele spakowane do dystrybucji na TensorFlow Hub, platformie umożliwiającej udostępnianie i odkrywanie modeli. Bibliotekę modeli można znaleźć tutaj .
W zależności od typu modelu, który chcesz przekonwertować, będziesz musiał przekazać do konwertera różne argumenty. Załóżmy na przykład, że zapisałeś model Keras o nazwie model.h5
w katalogu tmp/
. Aby przekonwertować model za pomocą konwertera TensorFlow.js, możesz uruchomić następującą komendę:
$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model
Spowoduje to konwersję modelu w /tmp/model.h5
i wyświetlenie pliku model.json
wraz z binarnymi plikami wag do katalogu tmp/tfjs_model/
.
Więcej szczegółów na temat argumentów wiersza poleceń odpowiadających różnym formatom modelu można znaleźć w pliku README konwertera TensorFlow.js.
Podczas procesu konwersji przemierzamy graf modelu i sprawdzamy, czy każda operacja jest obsługiwana przez TensorFlow.js. Jeśli tak, zapisujemy wykres w formacie, który może wykorzystać przeglądarka. Staramy się zoptymalizować model pod kątem wyświetlania w Internecie, dzieląc wagi na pliki o wielkości 4 MB, dzięki czemu będą mogły być buforowane przez przeglądarki. Próbujemy również uprościć sam wykres modelu, korzystając z projektu Grappler o otwartym kodzie źródłowym. Uproszczenia wykresów obejmują składanie sąsiadujących ze sobą operacji, eliminowanie wspólnych podgrafów itp. Zmiany te nie mają wpływu na wynik modelu. W celu dalszej optymalizacji użytkownicy mogą przekazać argument, który instruuje konwerter, aby skwantyzował model do określonego rozmiaru bajtów. Kwantyzacja to technika zmniejszania rozmiaru modelu poprzez reprezentowanie wag za pomocą mniejszej liczby bitów. Użytkownicy muszą zachować ostrożność, aby upewnić się, że ich model zachowuje akceptowalny stopień dokładności po kwantyzacji.
Jeśli podczas konwersji napotkamy nieobsługiwaną operację, proces zakończy się niepowodzeniem i wydrukujemy nazwę operacji dla użytkownika. Zachęcamy do zgłoszenia problemu na naszym GitHubie i poinformowania nas o nim - staramy się wdrażać nowe operacje w odpowiedzi na zapotrzebowanie użytkowników.
Najlepsze praktyki
Chociaż dokładamy wszelkich starań, aby zoptymalizować model podczas konwersji, często najlepszym sposobem zapewnienia dobrego działania modelu jest zbudowanie go z myślą o środowiskach o ograniczonych zasobach. Oznacza to unikanie zbyt skomplikowanych architektur i minimalizowanie liczby parametrów (wag), jeśli to możliwe.
Uruchom swój model
Po pomyślnej konwersji modelu otrzymasz zestaw plików wag i plik topologii modelu. TensorFlow.js udostępnia interfejsy API ładowania modelu, których można użyć do pobrania zasobów modelu i uruchomienia wnioskowania w przeglądarce.
Oto jak wygląda interfejs API dla przekonwertowanego modułu TensorFlow SavedModel lub TensorFlow Hub:
const model = await tf.loadGraphModel(‘path/to/model.json’);
A oto jak wygląda przerobiony model Keras:
const model = await tf.loadLayersModel(‘path/to/model.json’);
Interfejs API tf.loadGraphModel
zwraca wartość tf.FrozenModel
, co oznacza, że parametry są stałe i nie będzie można dostroić modelu przy użyciu nowych danych. Interfejs API tf.loadLayersModel
zwraca obiekt tf.Model, który można wytrenować. Informacje na temat uczenia tf.Model można znaleźć w przewodniku po modelach pociągów .
Po konwersji warto kilka razy przeprowadzić wnioskowanie i porównać prędkość swojego modelu. Mamy samodzielną stronę testów porównawczych, którą można wykorzystać w tym celu: https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html Możesz zauważyć, że odrzucamy pomiary z początkowego biegu rozgrzewkowego - dzieje się tak dlatego, że (ogólnie) pierwsze wnioskowanie Twojego modelu będzie kilka razy wolniejsze niż kolejne wnioski ze względu na obciążenie związane z tworzeniem tekstur i kompilowaniem shaderów.