Поскольку Tensor
является нашим фундаментальным строительным блоком для ускоренных параллельных вычислений, большинство моделей и операций машинного обучения будут выражаться в терминах протокола Layer
. Layer
определяет интерфейс для типов, которые принимают дифференцируемые входные данные, обрабатывают их и создают дифференцируемые выходные данные. Layer
может содержать состояние, например обучаемые веса.
Layer
— это усовершенствованная версия протокола Module
, где Module
определяет более общий случай, когда входные данные типа не обязательно дифференцируемы. Большинство компонентов модели будут иметь дело с дифференцируемыми входными данными, но бывают случаи, когда вместо этого может потребоваться соответствие типов Module
.
Если вы создаете операцию, в которой нет обучаемых параметров, вам нужно будет определить ее с помощью ParameterlessLayer
вместо Layer
.
Сами модели часто определяются как Layer
и обычно состоят из других Layer
. С моделью или субъединицей, определенной как Layer
можно обращаться так же, как с любым другим Layer
, что позволяет создавать произвольно сложные модели из других моделей или субъединиц.
Чтобы определить пользовательский Layer
для собственной модели или операции, вы обычно будете следовать шаблону, подобному этому:
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 ...
}
}
Обучаемые компоненты Layers
, такие как веса и смещения, а также другие Layer
, могут быть объявлены как свойства. Пользовательский инициализатор — хорошее место для предоставления настраиваемых параметров модели, таких как переменное количество слоев или выходной размер модели классификации. Наконец, ядром Layer
является callAsFunction()
, где вы определите типы ввода и вывода, а также преобразование, которое принимает одно и возвращает другое.
Встроенные слои
Многие распространенные операции машинного обучения инкапсулированы в виде Layer
, которые вы можете использовать при определении моделей или подразделений. Ниже приведен список слоев, предоставляемых Swift для TensorFlow, сгруппированных по функциональным областям:
Увеличение
Свертка
- Конв1D
- Конв2D
- Конв3D
- Плотный
- ГлубинаConv2D
- СепарабельКонв1Д
- СепараблеКонв2Д
- ТранспонированныйConv1D
- ТранспонированныйConv2D
- ТранспонированныйConv3D
- ZeroPadding1D
- ZeroPadding2D
- ZeroPadding3D
Встраивание
Морфологический
Нормализация
Объединение
- Средний пул1D
- Средний пул2D
- Средний пул3D
- Макспул1D
- Макспул2D
- МаксПул3D
- ДробныйМаксБассейн2D
- Глобальный пул AVG1D
- ГлобалАвгпул2D
- Глобальный пул AVG3D
- ГлобалМакспул1D
- ГлобалМакспул2D
- ГлобалМаксПул3D
Рекуррентные нейронные сети
Изменение формы
Повышение дискретизации
Оптимизаторы
Оптимизаторы — ключевой компонент обучения модели машинного обучения, обновляющий модель на основе рассчитанного градиента. В идеале эти обновления будут корректировать параметры модели таким образом, чтобы ее можно было обучить.
Чтобы использовать оптимизатор, сначала инициализируйте его для целевой модели с соответствующими параметрами обучения:
let optimizer = RMSProp(for: model, learningRate: 0.0001, decay: 1e-6)
Обучите модель, получив градиент по отношению к входным данным и функции потерь, а затем обновите модель по этому градиенту с помощью оптимизатора:
optimizer.update(&model, along: gradients)
Встроенные оптимизаторы
Swift для TensorFlow предоставляет несколько распространенных оптимизаторов. К ним относятся следующие: