Tak jak Tensor
jest naszym podstawowym elementem przyspieszonych obliczeń równoległych, większość modeli i operacji uczenia maszynowego będzie wyrażona w kategoriach protokołu Layer
. Layer
definiuje interfejs dla typów, które pobierają różniczkowalne dane wejściowe, przetwarzają je i generują różniczkowalny wynik. Layer
może zawierać stan, na przykład wagi, które można trenować.
Layer
jest udoskonaleniem protokołu Module
, przy czym Module
definiuje bardziej ogólny przypadek, w którym dane wejściowe typu niekoniecznie są różniczkowalne. Większość komponentów modelu będzie obsługiwać różniczkowe dane wejściowe, ale zdarzają się przypadki, w których zamiast tego typy mogą wymagać zgodności z Module
.
Jeśli utworzysz operację, która nie zawiera parametrów, które można przeszkolić, warto ją zdefiniować w kategoriach ParameterlessLayer
zamiast Layer
.
Same modele są często definiowane jako Layer
i regularnie składają się z innych Layer
. Model lub podjednostkę zdefiniowaną jako Layer
można traktować jak każdą inną Layer
, co pozwala na konstruowanie dowolnie złożonych modeli z innych modeli lub podjednostek.
Aby zdefiniować niestandardową Layer
dla własnego modelu lub operacji, zazwyczaj będziesz korzystać z szablonu podobnego do tego:
public struct MyModel: Layer {
// Define your layers or other properties here.
// A custom initializer may be desired to configure the model.
public init() {}
@differentiable
public func callAsFunction(_ input: Tensor<Float>) -> Tensor<Float> {
// Define the sequence of operations performed on model input to arrive at the output.
return ...
}
}
Nadające się do szkolenia komponenty Layers
, takie jak wagi i odchylenia, a także inne Layer
, można zadeklarować jako właściwości. Inicjator niestandardowy to dobre miejsce do udostępniania dostosowywalnych parametrów modelu, takich jak zmienna liczba warstw lub rozmiar wyjściowy modelu klasyfikacji. Wreszcie, rdzeniem Layer
jest callAsFunction()
, w którym zdefiniujesz typy danych wejściowych i wyjściowych, a także transformację, która przyjmuje jedno i zwraca drugie.
Wbudowane warstwy
Wiele typowych operacji uczenia maszynowego zostało hermetyzowanych jako Layer
, których można używać podczas definiowania modeli lub podjednostek. Poniżej znajduje się lista warstw dostarczonych przez Swift dla TensorFlow, pogrupowanych według obszarów funkcjonalnych:
Powiększenie
Skręt
- Konw1D
- Konw2D
- Konw3D
- Gęsty
- DepthwiseConv2D
- Oddzielne Conv1D
- Oddzielne Conv2D
- Transponowane Conv1D
- Transponowane Conv2D
- Transponowane Conv3D
- ZeroPadding1D
- ZeroPadding2D
- ZeroPadding3D
Osadzanie
Morfologiczne
Normalizacja
Łączenie
- Średnia pula 1D
- Średnia pula2D
- Średnia pula3D
- MaxPool1D
- MaxPool2D
- MaxPool3D
- FractionalMaxPool2D
- GlobalAvgPool1D
- GlobalAvgPool2D
- Globalny AvgPool3D
- GlobalMaxPool1D
- GlobalMaxPool2D
- GlobalMaxPool3D
Rekurencyjne sieci neuronowe
Przekształcanie
Upsampling
Optymalizatory
Optymalizatory są kluczowym elementem uczenia modelu uczenia maszynowego, aktualizującym model na podstawie obliczonego gradientu. Te aktualizacje idealnie dostosują parametry modelu w taki sposób, aby wytrenować model.
Aby użyć optymalizatora, należy najpierw zainicjalizować go dla modelu docelowego z odpowiednimi parametrami szkoleniowymi:
let optimizer = RMSProp(for: model, learningRate: 0.0001, decay: 1e-6)
Wytrenuj model, uzyskując gradient w odniesieniu do danych wejściowych i funkcji straty, a następnie zaktualizuj model wzdłuż tego gradientu za pomocą optymalizatora:
optimizer.update(&model, along: gradients)
Wbudowane optymalizatory
Swift udostępnia kilka typowych optymalizatorów dla TensorFlow. Należą do nich: