Calques

Tout comme Tensor est notre élément fondamental pour le calcul parallèle accéléré, la plupart des modèles et opérations d'apprentissage automatique seront exprimés en termes de protocole Layer . Layer définit une interface pour les types qui prennent une entrée différentiable, la traitent et produisent une sortie différentiable. Un Layer peut contenir un état, tel que des poids pouvant être entraînés.

Layer est un raffinement du protocole Module , Module définissant le cas plus général où l'entrée du type n'est pas nécessairement différentiable. La plupart des composants d'un modèle traiteront des entrées différentiables, mais il existe des cas où les types devront plutôt se conformer au Module .

Si vous créez une opération qui ne contient aucun paramètre pouvant être entraîné, vous souhaiterez la définir en termes de ParameterlessLayer au lieu de Layer .

Les modèles eux-mêmes sont souvent définis comme Layer s et sont régulièrement composés d'autres Layer . Un modèle ou une sous-unité qui a été défini comme Layer peut être traité comme n'importe quel autre Layer , permettant la construction de modèles arbitrairement complexes à partir d'autres modèles ou sous-unités.

Pour définir une Layer personnalisée pour un modèle ou une opération qui vous est propre, vous suivrez généralement un modèle similaire à celui-ci :

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 ...
  }
}

Les composants entraînables de Layers , tels que les poids et les biais, ainsi que d'autres Layer s, peuvent être déclarés en tant que propriétés. Un initialiseur personnalisé est un bon endroit pour exposer les paramètres personnalisables d'un modèle, tels qu'un nombre variable de couches ou la taille de sortie d'un modèle de classification. Enfin, le cœur du Layer est callAsFunction() , où vous définirez les types d’entrée et de sortie ainsi que la transformation qui prend en compte l’un et renvoie l’autre.

Couches intégrées

De nombreuses opérations courantes d'apprentissage automatique ont été encapsulées sous forme de Layer pour que vous puissiez les utiliser lors de la définition de modèles ou de sous-unités. Voici une liste des couches fournies par Swift pour TensorFlow, regroupées par domaines fonctionnels :

Augmentation

Convolution

Intégration

Morphologique

Normalisation

mise en commun

Réseaux de neurones récurrents

Remodelage

Suréchantillonnage

Optimiseurs

Les optimiseurs sont un élément clé de la formation d'un modèle d'apprentissage automatique, mettant à jour le modèle en fonction d'un gradient calculé. Idéalement, ces mises à jour ajusteront les paramètres d’un modèle de manière à entraîner le modèle.

Pour utiliser un optimiseur, initialisez-le d'abord pour un modèle cible avec les paramètres d'entraînement appropriés :

let optimizer = RMSProp(for: model, learningRate: 0.0001, decay: 1e-6)

Entraînez un modèle en obtenant un gradient par rapport à l'entrée et une fonction de perte, puis mettez à jour le modèle le long de ce gradient à l'aide de votre optimiseur :

optimizer.update(&model, along: gradients)

Optimiseurs intégrés

Plusieurs optimiseurs courants sont fournis par Swift pour TensorFlow. Ceux-ci incluent les éléments suivants :