Модели и слои

В машинном обучении, модель представляет собой функция с изучаемыми параметрами , отображающая вход к выходу. Оптимальные параметры получаются путем обучения модели на данных. Хорошо обученная модель обеспечит точное сопоставление входных данных с желаемыми выходными данными.

В TensorFlow.js есть два способа создать модель машинного обучения:

  1. используя Слои API , где вы строите модель с использованием слоев.
  2. используя Core API с ОПС более низкого уровня , таких как tf.matMul() , tf.add() и т.д.

Сначала мы рассмотрим Layers API, который представляет собой API более высокого уровня для построения моделей. Затем мы покажем, как построить ту же модель с помощью Core API.

Создание моделей с помощью Layers API

Есть два способа создания модели с использованием слоев API: последовательную модель и функциональную модель. В следующих двух разделах каждый тип рассматривается более подробно.

Последовательная модель

Наиболее распространенный тип модели является Sequential модель, которая представляет собой линейный набор слоев. Вы можете создать Sequential модель, передавая список слоев в sequential() функции:

const model = tf.sequential({
 layers: [
   tf.layers.dense({inputShape: [784], units: 32, activation: 'relu'}),
   tf.layers.dense({units: 10, activation: 'softmax'}),
 ]
});

Или с помощью 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'}));

ВНИМАНИЕ: Первый слой в модели нуждается в inputShape . Убедитесь , что вы исключаете размер партии при предоставлении inputShape . Например, если вы планируете кормить модели тензорами формы [B, 784] , где B может быть любым размером партии, указать inputShape в [784] при создании модели.

Вы можете получить доступ слои модели с помощью model.layers , а более конкретно model.inputLayers и model.outputLayers .

Функциональная модель

Другой способ создания LayersModel осуществляется через tf.model() функции. Основное различие между tf.model() и tf.sequential() является то , что tf.model() позволяет создавать произвольный граф слоев, до тех пор , пока они не имеют циклы.

Вот фрагмент кода , который определяет ту же модель , как описано выше , используя tf.model() API:

// 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});

Мы называем apply() на каждом слое, чтобы подключить его к выходу другого слоя. Результат apply() в данном случае является SymbolicTensor , который действует как Tensor , но без каких - либо значений конкретных.

Следует отметить , что в отличие от последовательной модели, мы создаем SymbolicTensor через tf.input() вместо того , чтобы предоставление inputShape к первому слою.

apply() также может дать вам конкретный Tensor , если вы передаете бетон Tensor к нему:

const t = tf.tensor([-2, 1, 0, 5]);
const o = tf.layers.activation({activation: 'relu'}).apply(t);
o.print(); // [0, 1, 0, 5]

Это может быть полезно при тестировании слоев изолированно и просмотре их результатов.

Так же , как в последовательной модели, вы можете получить доступ слоев модели с помощью model.layers , а более конкретно model.inputLayers и model.outputLayers .

Проверка

И последовательная модель и функциональная модель являются экземплярами LayersModel класса. Одним из основных преимуществ работы с LayersModel является проверка: она заставляет вас указать форму ввода и использовать его в дальнейшем для проверки введенных данных. LayersModel также делает автоматический вывод формы , как потоки данных через слои. Знание формы заранее позволяет модели автоматически создавать свои параметры и может сказать вам, несовместимы ли два последовательных слоя друг с другом.

Краткое описание модели

Вызов model.summary() , чтобы напечатать полезное резюме модели, которая включает в себя:

  • Имя и тип всех слоев модели.
  • Форма вывода для каждого слоя.
  • Количество весовых параметров каждого слоя.
  • Если модель имеет общую топологию (обсуждается ниже), входные данные каждый уровень получает
  • Общее количество обучаемых и необучаемых параметров модели.

Для модели, которую мы определили выше, мы получаем на консоли следующий вывод:

Слой (тип) Форма вывода Параметр #
плотный_плотный1 (плотный) [null, 32] 25120
плотный_плотный2 (плотный) [null, 10] 330
Всего параметров: 25450
Обучаемые параметры: 25450
Необучаемые параметры: 0

Обратите внимание на null значения в выходных формах слоев: напоминание о том , что модель ожидает ввод , чтобы иметь размер пакета в качестве самого внешнего измерения, которое в этом случае может быть гибким в связи с null значением.

Сериализация

Одним из основных преимуществ использования LayersModel через API нижнего уровня является возможность сохранения и загрузки модели. LayersModel знает:

  • архитектура модели, позволяющая воссоздать модель.
  • вес модели
  • конфигурация обучения (убыток, оптимизатор, метрики).
  • состояние оптимизатора, позволяющее возобновить обучение.

Чтобы сохранить или загрузить модель, достаточно 1 строчки кода:

const saveResult = await model.save('localstorage://my-model-1');
const model = await tf.loadLayersModel('localstorage://my-model-1');

В приведенном выше примере модель сохраняется в локальном хранилище в браузере. См model.save() documentation и сохранять и загружать руководство для того, как сохранить в различные среды (например , для хранения файлов, IndexedDB , вызвать загрузку браузера и т.д.)

Пользовательские слои

Слои - это строительные блоки модели. Если ваша модель выполняет настраиваемые вычисления, вы можете определить настраиваемый слой, который хорошо взаимодействует с остальными слоями. Ниже мы определяем настраиваемый слой, который вычисляет сумму квадратов:

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'; }
}

Чтобы проверить это, мы можем назвать apply() метод с конкретным тензором:

const t = tf.tensor([-2, 1, 0, 5]);
const o = new SquaredSumLayer().apply(t);
o.print(); // prints 30

ВАЖНО: Если вы добавите настраиваемый слой, вы потеряете возможность сериализации модели.

Создание моделей с помощью Core API

В начале этого руководства мы упоминали, что есть два способа создать модель машинного обучения в TensorFlow.js.

Общее правило заключается в том , чтобы всегда пытаться использовать Layers API первого, так как он по образцу хорошо принятой Keras API , который следует лучшие практики и снижает когнитивную нагрузку . Layers API также предлагает различные готовые решения, такие как инициализация веса, сериализация модели, обучение мониторингу, переносимость и проверка безопасности.

Вы можете использовать Core API всякий раз, когда:

  • Вам нужна максимальная гибкость или контроль.
  • Вам не нужна сериализация, или вы можете реализовать свою собственную логику сериализации.

Модели в Core API просто функции , которые принимают один или несколько Tensors и возвращающие Tensor . Та же модель, что и выше, написанная с использованием Core API, выглядит так:

// 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();
}

Обратите внимание, что в Core API мы отвечаем за создание и инициализацию весов модели. Каждый вес опирается на Variable , который сигнализирует , чтобы TensorFlow.js , что эти тензоры изучаемые. Вы можете создать Variable с помощью tf.variable () и переходя в существующий Tensor .

В этом руководстве вы познакомились с различными способами создания модели с использованием Layers и Core API. Далее см учебные модели руководство для того, как тренировать модель.