Warstwy

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

Osadzanie

Morfologiczne

Normalizacja

Łączenie

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: