TensorFlow.js zapewnia funkcjonalność zapisywania i ładowania modeli, które zostały utworzone za pomocą interfejsu Layers
API lub przekonwertowane z istniejących modeli TensorFlow. Mogą to być modele, które wyszkoliłeś sam lub te wyszkolone przez innych. Kluczową zaletą korzystania z interfejsu Layers api jest to, że utworzone za jego pomocą modele można serializować i właśnie to omówimy w tym samouczku.
Ten samouczek skupi się na zapisywaniu i ładowaniu modeli TensorFlow.js (identyfikowanych przez pliki JSON). Możemy również importować modele TensorFlow Python. Wczytywanie tych modeli zostało omówione w następujących dwóch samouczkach:
Zapisz tf.Model
tf.Model
i tf.Sequential
udostępniają funkcję model.save
, która umożliwia zapisanie topologii i wag modelu.
Topologia: Jest to plik opisujący architekturę modelu (tj. jakich operacji używa). Zawiera odniesienia do mas modeli, które są przechowywane zewnętrznie.
Wagi: Są to pliki binarne, które przechowują wagi danego modelu w wydajnym formacie. Zazwyczaj są one przechowywane w tym samym folderze co topologia.
Przyjrzyjmy się, jak wygląda kod do zapisania modelu
const saveResult = await model.save('localstorage://my-model-1');
Kilka rzeczy do zapamiętania:
- Metoda
save
pobiera ciąg znaków podobny do adresu URL, który zaczyna się od schema . Opisuje rodzaj miejsca docelowego, w którym próbujemy zapisać model. W powyższym przykładzie schemat tolocalstorage://
- Po schemacie następuje ścieżka . W powyższym przykładzie ścieżka to
my-model-1
. - Metoda
save
jest asynchroniczna. - Wartość zwracana przez
model.save
to obiekt JSON, który przenosi informacje, takie jak rozmiary bajtów topologii i wagi modelu. - Środowisko użyte do zapisania modelu nie ma wpływu na to, które środowiska mogą wczytać model. Zapisanie modelu w node.js nie zapobiega jego załadowaniu w przeglądarce.
Poniżej przeanalizujemy różne dostępne schematy.
Pamięć lokalna (tylko przeglądarka)
Schemat: localstorage://
await model.save('localstorage://my-model');
Powoduje to zapisanie modelu pod nazwą my-model
w lokalnej pamięci przeglądarki . Będzie to trwało między odświeżeniami, chociaż pamięć lokalna może zostać wyczyszczona przez użytkowników lub samą przeglądarkę, jeśli pojawi się problem. Każda przeglądarka ustala również własny limit ilości danych, które mogą być przechowywane w pamięci lokalnej dla danej domeny.
IndexedDB (tylko przeglądarka)
Schemat: indexeddb://
await model.save('indexeddb://my-model');
To zapisuje model w magazynie IndexedDB przeglądarki. Podobnie jak pamięć lokalna, utrzymuje się między odświeżeniami, ma również większe limity rozmiaru przechowywanych obiektów.
Pobieranie plików (tylko przeglądarka)
Schemat: downloads://
await model.save('downloads://my-model');
Spowoduje to, że przeglądarka pobierze pliki modelu na komputer użytkownika. Powstaną dwa pliki:
- Tekstowy plik JSON o nazwie
[my-model].json
, który zawiera topologię i odwołanie do pliku wag opisanego poniżej. - Plik binarny zawierający wartości wag o nazwie
[my-model].weights.bin
.
Możesz zmienić nazwę [my-model]
, aby uzyskać pliki o innej nazwie.
Ponieważ plik .json
wskazuje na .bin
przy użyciu ścieżki względnej, oba pliki powinny znajdować się w tym samym folderze.
Żądanie HTTP(S)
Schemat: http://
lub https://
await model.save('http://model-server.domain/upload')
Spowoduje to utworzenie żądania internetowego, aby zapisać model na zdalnym serwerze. Powinieneś mieć kontrolę nad tym zdalnym serwerem, aby upewnić się, że jest w stanie obsłużyć żądanie.
Model zostanie wysłany do określonego serwera HTTP za pośrednictwem żądania POST . Treść POST jest w formacie multipart/form-data
i składa się z dwóch plików
- Tekstowy plik JSON o nazwie
model.json
, który zawiera topologię i odwołanie do pliku wag opisanego poniżej. - Plik binarny zawierający wartości wag o nazwie
model.weights.bin
.
Zauważ, że nazwy dwóch plików zawsze będą dokładnie takie, jak podano powyżej (nazwa jest wbudowana w funkcję). Ten dokument api zawiera fragment kodu Pythona, który demonstruje, jak można wykorzystać framework sieciowy flask do obsługi żądania pochodzącego z save
.
Często będziesz musiał przekazać więcej argumentów lub nagłówków żądań do swojego serwera HTTP (np. w celu uwierzytelnienia lub jeśli chcesz określić folder, w którym ma być zapisany model). Możesz uzyskać szczegółową kontrolę nad tymi aspektami żądań z save
, zastępując argument ciągu URL w tf.io.browserHTTPRequest
. Ten interfejs API zapewnia większą elastyczność w kontrolowaniu żądań HTTP.
Na przykład:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
Natywny system plików (tylko Node.js)
Schemat: file://
await model.save('file:///path/to/my-model');
Działając na Node.js mamy również bezpośredni dostęp do systemu plików i możemy tam zapisywać modele. Powyższe polecenie zapisze dwa pliki w path
określonej za scheme
.
- Tekstowy plik JSON o nazwie
[model].json
, który zawiera topologię i odwołanie do pliku wag opisanego poniżej. - Plik binarny zawierający wartości wag o nazwie
[model].weights.bin
.
Zauważ, że nazwy dwóch plików zawsze będą dokładnie takie, jak podano powyżej (nazwa jest wbudowana w funkcję).
Ładowanie tf.Model
Mając model, który został zapisany przy użyciu jednej z powyższych metod, możemy go załadować za pomocą API tf.loadLayersModel
.
Przyjrzyjmy się, jak wygląda kod do ładowania modelu
const model = await tf.loadLayersModel('localstorage://my-model-1');
Kilka rzeczy do zapamiętania:
- Podobnie jak
model.save()
, funkcjaloadLayersModel
pobiera ciąg znaków przypominający adres URL, który zaczyna się od schema . Opisuje rodzaj miejsca docelowego, z którego próbujemy załadować model. - Po schemacie następuje ścieżka . W powyższym przykładzie ścieżka to
my-model-1
. - Ciąg podobny do adresu URL można zastąpić obiektem, który pasuje do interfejsu IOHandler.
- Funkcja
tf.loadLayersModel()
jest asynchroniczna. - Wartość zwracana przez
tf.loadLayersModel
totf.Model
Poniżej przeanalizujemy różne dostępne schematy.
Pamięć lokalna (tylko przeglądarka)
Schemat: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
Spowoduje to załadowanie modelu o nazwie my-model
z lokalnej pamięci przeglądarki .
IndexedDB (tylko przeglądarka)
Schemat: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
Spowoduje to załadowanie modelu z magazynu IndexedDB przeglądarki.
HTTP(S)
Schemat: http://
lub https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
Spowoduje to załadowanie modelu z punktu końcowego http. Po załadowaniu pliku json
funkcja wyśle żądania dotyczące odpowiednich plików .bin
, do których odwołuje się plik json
.
Natywny system plików (tylko Node.js)
Schemat: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
Działając na Node.js mamy również bezpośredni dostęp do systemu plików i stamtąd możemy ładować modele. Zauważ, że w powyższym wywołaniu funkcji odwołujemy się do samego pliku model.json (podczas zapisywania określamy folder). Odpowiednie pliki .bin
powinny znajdować się w tym samym folderze co plik json
.
Ładowanie modeli za pomocą IOHandlers
Jeśli powyższe schematy nie są wystarczające dla Twoich potrzeb, możesz zaimplementować niestandardowe zachowanie ładowania za pomocą IOHandler
. Jednym IOHandler
, który zapewnia TensorFlow.js, jest tf.io.browserFiles
, który umożliwia użytkownikom przeglądarek przesyłanie plików modeli w przeglądarce. Więcej informacji znajdziesz w dokumentacji .
Zapisywanie i ładowanie modeli za pomocą niestandardowych IOHandlers
Jeśli powyższe schematy nie są wystarczające dla potrzeb związanych z ładowaniem lub zapisywaniem, możesz zaimplementować niestandardowe zachowanie serializacji, implementując IOHandler
.
IOHandler
to obiekt z metodą save
i load
.
Funkcja save
przyjmuje jeden parametr, który jest zgodny z interfejsem ModelArtifacts i powinna zwracać obietnicę, która jest rozpoznawana jako obiekt SaveResult .
Funkcja load
nie przyjmuje żadnych parametrów i powinna zwrócić obietnicę, która zostanie rozwiązana do obiektu ModelArtifacts . Jest to ten sam obiekt, który jest przekazywany do save
.
Zobacz BrowserHTTPRequest , aby zapoznać się z przykładem implementacji IOHandler.
, TensorFlow.js zapewnia funkcjonalność zapisywania i ładowania modeli, które zostały utworzone za pomocą interfejsu Layers
API lub przekonwertowane z istniejących modeli TensorFlow. Mogą to być modele, które wyszkoliłeś sam lub te wyszkolone przez innych. Kluczową zaletą korzystania z interfejsu Layers api jest to, że utworzone za jego pomocą modele można serializować i właśnie to omówimy w tym samouczku.
Ten samouczek skupi się na zapisywaniu i ładowaniu modeli TensorFlow.js (identyfikowanych przez pliki JSON). Możemy również importować modele TensorFlow Python. Wczytywanie tych modeli zostało omówione w następujących dwóch samouczkach:
Zapisz tf.Model
tf.Model
i tf.Sequential
udostępniają funkcję model.save
, która umożliwia zapisanie topologii i wag modelu.
Topologia: Jest to plik opisujący architekturę modelu (tj. jakich operacji używa). Zawiera odniesienia do mas modeli, które są przechowywane zewnętrznie.
Wagi: Są to pliki binarne, które przechowują wagi danego modelu w wydajnym formacie. Zazwyczaj są one przechowywane w tym samym folderze co topologia.
Przyjrzyjmy się, jak wygląda kod do zapisania modelu
const saveResult = await model.save('localstorage://my-model-1');
Kilka rzeczy do zapamiętania:
- Metoda
save
pobiera ciąg znaków podobny do adresu URL, który zaczyna się od schema . Opisuje rodzaj miejsca docelowego, w którym próbujemy zapisać model. W powyższym przykładzie schemat tolocalstorage://
- Po schemacie następuje ścieżka . W powyższym przykładzie ścieżka to
my-model-1
. - Metoda
save
jest asynchroniczna. - Wartość zwracana przez
model.save
to obiekt JSON, który przenosi informacje, takie jak rozmiary bajtów topologii i wagi modelu. - Środowisko użyte do zapisania modelu nie ma wpływu na to, które środowiska mogą wczytać model. Zapisanie modelu w node.js nie zapobiega jego załadowaniu w przeglądarce.
Poniżej przeanalizujemy różne dostępne schematy.
Pamięć lokalna (tylko przeglądarka)
Schemat: localstorage://
await model.save('localstorage://my-model');
Powoduje to zapisanie modelu pod nazwą my-model
w lokalnej pamięci przeglądarki . Będzie to trwało między odświeżeniami, chociaż pamięć lokalna może zostać wyczyszczona przez użytkowników lub samą przeglądarkę, jeśli pojawi się problem. Każda przeglądarka ustala również własny limit ilości danych, które mogą być przechowywane w pamięci lokalnej dla danej domeny.
IndexedDB (tylko przeglądarka)
Schemat: indexeddb://
await model.save('indexeddb://my-model');
To zapisuje model w magazynie IndexedDB przeglądarki. Podobnie jak pamięć lokalna, utrzymuje się między odświeżeniami, ma również większe limity rozmiaru przechowywanych obiektów.
Pobieranie plików (tylko przeglądarka)
Schemat: downloads://
await model.save('downloads://my-model');
Spowoduje to, że przeglądarka pobierze pliki modelu na komputer użytkownika. Powstaną dwa pliki:
- Tekstowy plik JSON o nazwie
[my-model].json
, który zawiera topologię i odwołanie do pliku wag opisanego poniżej. - Plik binarny zawierający wartości wag o nazwie
[my-model].weights.bin
.
Możesz zmienić nazwę [my-model]
, aby uzyskać pliki o innej nazwie.
Ponieważ plik .json
wskazuje na .bin
przy użyciu ścieżki względnej, oba pliki powinny znajdować się w tym samym folderze.
Żądanie HTTP(S)
Schemat: http://
lub https://
await model.save('http://model-server.domain/upload')
Spowoduje to utworzenie żądania internetowego, aby zapisać model na zdalnym serwerze. Powinieneś mieć kontrolę nad tym zdalnym serwerem, aby upewnić się, że jest w stanie obsłużyć żądanie.
Model zostanie wysłany do określonego serwera HTTP za pośrednictwem żądania POST . Treść POST jest w formacie multipart/form-data
i składa się z dwóch plików
- Tekstowy plik JSON o nazwie
model.json
, który zawiera topologię i odwołanie do pliku wag opisanego poniżej. - Plik binarny zawierający wartości wag o nazwie
model.weights.bin
.
Zauważ, że nazwy dwóch plików zawsze będą dokładnie takie, jak podano powyżej (nazwa jest wbudowana w funkcję). Ten dokument api zawiera fragment kodu Pythona, który demonstruje, jak można wykorzystać framework sieciowy flask do obsługi żądania pochodzącego z save
.
Często będziesz musiał przekazać więcej argumentów lub nagłówków żądań do swojego serwera HTTP (np. w celu uwierzytelnienia lub jeśli chcesz określić folder, w którym ma być zapisany model). Możesz uzyskać szczegółową kontrolę nad tymi aspektami żądań z save
, zastępując argument ciągu URL w tf.io.browserHTTPRequest
. Ten interfejs API zapewnia większą elastyczność w kontrolowaniu żądań HTTP.
Na przykład:
await model.save(tf.io.browserHTTPRequest(
'http://model-server.domain/upload',
{method: 'PUT', headers: {'header_key_1': 'header_value_1'} }));
Natywny system plików (tylko Node.js)
Schemat: file://
await model.save('file:///path/to/my-model');
Działając na Node.js mamy również bezpośredni dostęp do systemu plików i możemy tam zapisywać modele. Powyższe polecenie zapisze dwa pliki w path
określonej za scheme
.
- Tekstowy plik JSON o nazwie
[model].json
, który zawiera topologię i odwołanie do pliku wag opisanego poniżej. - Plik binarny zawierający wartości wag o nazwie
[model].weights.bin
.
Zauważ, że nazwy dwóch plików zawsze będą dokładnie takie, jak podano powyżej (nazwa jest wbudowana w funkcję).
Ładowanie tf.Model
Mając model, który został zapisany przy użyciu jednej z powyższych metod, możemy go załadować za pomocą API tf.loadLayersModel
.
Przyjrzyjmy się, jak wygląda kod do ładowania modelu
const model = await tf.loadLayersModel('localstorage://my-model-1');
Kilka rzeczy do zapamiętania:
- Podobnie jak
model.save()
, funkcjaloadLayersModel
pobiera ciąg znaków przypominający adres URL, który zaczyna się od schema . Opisuje rodzaj miejsca docelowego, z którego próbujemy załadować model. - Po schemacie następuje ścieżka . W powyższym przykładzie ścieżka to
my-model-1
. - Ciąg podobny do adresu URL można zastąpić obiektem, który pasuje do interfejsu IOHandler.
- Funkcja
tf.loadLayersModel()
jest asynchroniczna. - Wartość zwracana przez
tf.loadLayersModel
totf.Model
Poniżej przeanalizujemy różne dostępne schematy.
Pamięć lokalna (tylko przeglądarka)
Schemat: localstorage://
const model = await tf.loadLayersModel('localstorage://my-model');
Spowoduje to załadowanie modelu o nazwie my-model
z lokalnej pamięci przeglądarki .
IndexedDB (tylko przeglądarka)
Schemat: indexeddb://
const model = await tf.loadLayersModel('indexeddb://my-model');
Spowoduje to załadowanie modelu z magazynu IndexedDB przeglądarki.
HTTP(S)
Schemat: http://
lub https://
const model = await tf.loadLayersModel('http://model-server.domain/download/model.json');
Spowoduje to załadowanie modelu z punktu końcowego http. Po załadowaniu pliku json
funkcja wyśle żądania dotyczące odpowiednich plików .bin
, do których odwołuje się plik json
.
Natywny system plików (tylko Node.js)
Schemat: file://
const model = await tf.loadLayersModel('file://path/to/my-model/model.json');
Działając na Node.js mamy również bezpośredni dostęp do systemu plików i stamtąd możemy ładować modele. Zauważ, że w powyższym wywołaniu funkcji odwołujemy się do samego pliku model.json (podczas zapisywania określamy folder). Odpowiednie pliki .bin
powinny znajdować się w tym samym folderze co plik json
.
Ładowanie modeli za pomocą IOHandlers
Jeśli powyższe schematy nie są wystarczające dla Twoich potrzeb, możesz zaimplementować niestandardowe zachowanie ładowania za pomocą IOHandler
. Jednym IOHandler
, który zapewnia TensorFlow.js, jest tf.io.browserFiles
, który umożliwia użytkownikom przeglądarek przesyłanie plików modeli w przeglądarce. Więcej informacji znajdziesz w dokumentacji .
Zapisywanie i ładowanie modeli za pomocą niestandardowych IOHandlers
Jeśli powyższe schematy nie są wystarczające dla potrzeb związanych z ładowaniem lub zapisywaniem, możesz zaimplementować niestandardowe zachowanie serializacji, implementując IOHandler
.
IOHandler
to obiekt z metodą save
i load
.
Funkcja save
przyjmuje jeden parametr, który jest zgodny z interfejsem ModelArtifacts i powinna zwracać obietnicę, która jest rozpoznawana jako obiekt SaveResult .
Funkcja load
nie przyjmuje żadnych parametrów i powinna zwrócić obietnicę, która zostanie rozwiązana do obiektu ModelArtifacts . Jest to ten sam obiekt, który jest przekazywany do save
.
Zobacz BrowserHTTPRequest , aby zapoznać się z przykładem implementacji IOHandler.