W uczeniu maszynowym model to funkcja z parametrami do nauki , która mapuje dane wejściowe na dane wyjściowe. Optymalne parametry uzyskuje się poprzez uczenie modelu na danych. Dobrze wyszkolony model zapewni dokładne odwzorowanie danych wejściowych na pożądane dane wyjściowe.
W TensorFlow.js istnieją dwa sposoby na stworzenie modelu uczenia maszynowego:
- za pomocą interfejsu Layers API, w którym budujesz model przy użyciu warstw .
- za pomocą interfejsu API Core z operacjami niższego poziomu, takimi jak
tf.matMul()
,tf.add()
, itp.
Najpierw przyjrzymy się interfejsowi Layers API, który jest interfejsem API wyższego poziomu do budowania modeli. Następnie pokażemy, jak zbudować ten sam model za pomocą Core API.
Tworzenie modeli za pomocą Layers API
Istnieją dwa sposoby tworzenia modelu przy użyciu interfejsu API warstw: model sekwencyjny i model funkcjonalny . W następnych dwóch sekcjach przyjrzymy się bliżej każdemu typowi.
Model sekwencyjny
Najpopularniejszym typem modelu jest model Sequential
, który jest liniowym stosem warstw. Model Sequential
można utworzyć, przekazując listę warstw do funkcji sequential()
:
const model = tf.sequential({
layers: [
tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
tf.layers.dense({units: 10, activation: 'softmax'}),
]
});
Lub za pomocą metody add()
:
const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
WAŻNE: Pierwsza warstwa w modelu wymaga
inputShape
. Upewnij się, że podczas podawaniainputShape
wykluczasz rozmiar partii. Na przykład, jeśli planujesz podać tensory modelu o kształcie[B, 784]
, gdzieB
może być dowolnym rozmiarem partii, określinputShape
jako[784]
podczas tworzenia modelu.
Możesz uzyskać dostęp do warstw modelu poprzez model.layers
, a dokładniej model.inputLayers
i model.outputLayers
.
Model funkcjonalny
Innym sposobem utworzenia LayersModel
jest użycie funkcji tf.model()
. Kluczową różnicą między tf.model()
i tf.sequential()
jest to, że tf.model()
umożliwia tworzenie dowolnego wykresu warstw, o ile nie mają one cykli.
Oto fragment kodu, który definiuje ten sam model, co powyżej, przy użyciu interfejsu API tf.model()
:
// Create an arbitrary graph of layers, by connecting them
// via the apply() method.
const input = tf.input({shape: [784]});
const dense1 = tf.layers.dense({units: 32, activation: 'relu'}).apply(input);
const dense2 = tf.layers.dense({units: 10, activation: 'softmax'}).apply(dense1);
const model = tf.model({inputs: input, outputs: dense2});
Wywołujemy apply()
na każdej warstwie, aby połączyć ją z wyjściem innej warstwy. Wynikiem apply()
w tym przypadku jest SymbolicTensor
, który działa jak Tensor
, ale bez żadnych konkretnych wartości.
Zauważ, że w przeciwieństwie do modelu sekwencyjnego, tworzymy SymbolicTensor
za pomocą tf.input()
zamiast dostarczania inputShape
do pierwszej warstwy.
apply()
może również dać Ci konkretny Tensor
, jeśli przekażesz do niego konkretny Tensor
:
const t = tf.tensor([-2, 1, 0, 5]);
const o = tf.layers.activation({activation: 'relu'}).apply(t);
o.print(); // [0, 1, 0, 5]
Może to być przydatne podczas testowania warstw w izolacji i oglądania ich wyników.
Podobnie jak w modelu sekwencyjnym, możesz uzyskać dostęp do warstw modelu za pośrednictwem model.layers
, a dokładniej model.inputLayers
i model.outputLayers
.
Walidacja
Zarówno model sekwencyjny, jak i model funkcjonalny są instancjami klasy LayersModel
. Jedną z głównych zalet pracy z LayersModel
jest walidacja: wymusza określenie kształtu wejściowego i użyje go później do sprawdzenia poprawności danych wejściowych. LayersModel
wykonuje również automatyczne wnioskowanie o kształcie, gdy dane przepływają przez warstwy. Znajomość kształtu z wyprzedzeniem pozwala modelowi automatycznie tworzyć jego parametry i może powiedzieć, czy dwie kolejne warstwy nie są ze sobą kompatybilne.
Podsumowanie modelu
Wywołaj model.summary()
, aby wydrukować przydatne podsumowanie modelu, które zawiera:
- Nazwa i typ wszystkich warstw w modelu.
- Kształt wyjściowy dla każdej warstwy.
- Liczba parametrów wagowych każdej warstwy.
- Jeśli model ma ogólną topologię (omówioną poniżej), dane wejściowe, które otrzymuje każda warstwa
- Całkowita liczba możliwych do trenowania i nietreningowych parametrów modelu.
Dla modelu, który zdefiniowaliśmy powyżej, otrzymujemy na konsoli następujące dane wyjściowe:
Warstwa (typ) | Kształt wyjściowy | Parametr # |
gęsty_Gęsty1 (Gęsty) | [null,32] | 25120 |
gęsty_Gęsty2 (Gęsty) | [null,10] | 330 |
Całkowite parametry: 25450 Parametry, które można trenować: 25450 Parametry nietreningowe: 0 |
Zwróć uwagę na wartości null
w kształtach wyjściowych warstw: przypomnienie, że model oczekuje, że dane wejściowe będą miały rozmiar partii jako wymiar zewnętrzny, który w tym przypadku może być elastyczny ze względu na wartość null
.
Serializacja
Jedną z głównych zalet korzystania z LayersModel
w porównaniu z interfejsem API niższego poziomu jest możliwość zapisywania i ładowania modelu. Model LayersModel
wie o:
- architekturę modelu, pozwalającą na odtworzenie modelu.
- waga modelu
- konfiguracja szkolenia (strata, optymalizator, metryki).
- stan optymalizatora, co pozwala na wznowienie treningu.
Aby zapisać lub wczytać model, wystarczy 1 linia kodu:
const saveResult = await model.save('localstorage://my-model-1');
const model = await tf.loadLayersModel('localstorage://my-model-1');
Powyższy przykład zapisuje model w pamięci lokalnej w przeglądarce. Zapoznaj się z model.save() documentation
oraz instrukcją zapisywania i ładowania , aby dowiedzieć się, jak zapisywać na różnych nośnikach (np. przechowywanie plików, IndexedDB
, wyzwalanie pobierania z przeglądarki itp.)
Warstwy niestandardowe
Warstwy to elementy składowe modelu. Jeśli Twój model wykonuje obliczenia niestandardowe, możesz zdefiniować niestandardową warstwę, która dobrze współgra z pozostałymi warstwami. Poniżej definiujemy niestandardową warstwę, która oblicza sumę kwadratów:
class SquaredSumLayer extends tf.layers.Layer {
constructor() {
super({});
}
// In this case, the output is a scalar.
computeOutputShape(inputShape) { return []; }
// call() is where we do the computation.
call(input, kwargs) { return input.square().sum();}
// Every layer needs a unique name.
getClassName() { return 'SquaredSum'; }
}
Aby to przetestować, możemy wywołać metodę apply()
z konkretnym tensorem:
const t = tf.tensor([-2, 1, 0, 5]);
const o = new SquaredSumLayer().apply(t);
o.print(); // prints 30
WAŻNE: Jeśli dodasz warstwę niestandardową, utracisz możliwość serializacji modelu.
Tworzenie modeli za pomocą Core API
Na początku tego przewodnika wspomnieliśmy, że istnieją dwa sposoby tworzenia modelu uczenia maszynowego w TensorFlow.js.
Ogólną zasadą jest, aby zawsze najpierw próbować użyć interfejsu Layers API, ponieważ jest on wzorowany na dobrze zaadaptowanym interfejsie API Keras, który jest zgodny z najlepszymi praktykami i zmniejsza obciążenie poznawcze . Interfejs API warstw oferuje również różne gotowe rozwiązania, takie jak inicjowanie wagi, serializacja modelu, szkolenie w zakresie monitorowania, przenośność i sprawdzanie bezpieczeństwa.
Możesz chcieć użyć Core API, gdy:
- Potrzebujesz maksymalnej elastyczności lub kontroli.
- Nie potrzebujesz serializacji lub możesz zaimplementować własną logikę serializacji.
Modele w Core API to po prostu funkcje, które pobierają jeden lub więcej Tensors
i zwracają Tensor
. Ten sam model, co powyżej napisany przy użyciu Core API, wygląda tak:
// The weights and biases for the two dense layers.
const w1 = tf.variable(tf.randomNormal([784, 32]));
const b1 = tf.variable(tf.randomNormal([32]));
const w2 = tf.variable(tf.randomNormal([32, 10]));
const b2 = tf.variable(tf.randomNormal([10]));
function model(x) {
return x.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();
}
Zauważ, że w Core API jesteśmy odpowiedzialni za tworzenie i inicjowanie wag modelu. Każda waga jest poparta Variable
, która sygnalizuje TensorFlow.js, że te tensory można się nauczyć. Możesz utworzyć Variable
za pomocą tf.variable() i przekazując istniejący Tensor
.
W tym przewodniku zapoznałeś się z różnymi sposobami tworzenia modelu za pomocą Layers i Core API. Następnie zapoznaj się z przewodnikiem dotyczącym modeli szkoleniowych, aby dowiedzieć się, jak trenować model.