Заморозка слоёв является ключевым приёмом в процессе дообучения (transfer learning) нейронных сетей. Основная идея заключается в том, чтобы сохранить веса уже обученных слоёв неизменными, фокусируя обучение на новых слоях, адаптированных под конкретную задачу.
Слой (Layer) — это базовый строительный блок модели,
который выполняет математические преобразования входных данных. В
TensorFlow.js слои создаются через tf.layers.
Заморозка слоя означает установку свойства
trainable в значение false. В результате
градиенты для этого слоя не вычисляются, и веса слоя остаются
неизменными во время обучения.
const layer = tf.layers.dense({ units: 128, activation: 'relu' });
layer.trainable = false;
При использовании предобученной модели часто замораживают базовые слои, оставляя обучаемыми только верхние слои:
const mobilenet = await tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json');
for (const layer of mobilenet.layers) {
layer.trainable = false;
}
// Добавление нового классификатора
const x = mobilenet.outputs[0];
const newOutput = tf.layers.dense({ units: 10, activation: 'softmax' }).apply(x);
const model = tf.model({ inputs: mobilenet.inputs, outputs: newOutput });
model.compile({
optimizer: tf.train.adam(),
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
await model.fit(trainData, trainLabels, {
epochs: 10,
batchSize: 32,
validationData: [valData, valLabels]
});
Замороженные слои сохраняют предобученные признаки, ускоряя обучение и снижая риск переобучения на малых данных.
В некоторых сценариях требуется замораживать только часть слоёв:
mobilenet.layers[0].trainable = false; // Заморозка первого слоя
mobilenet.layers[1].trainable = false; // Заморозка второго слоя
Можно комбинировать заморозку с fine-tuning, постепенно разблокируя слои:
for (let i = 0; i < mobilenet.layers.length; i++) {
mobilenet.layers[i].trainable = i >= 50; // Разблокировать последние слои
}
Такой подход позволяет сначала адаптировать верхние слои к новой задаче, а затем тонко настроить базовые слои.
Свойство trainable действует только
до компиляции модели. После компиляции изменение не повлияет на
обучение, поэтому заморозку нужно выполнять до вызова
model.compile().
Масштабирование и нормализация: при заморозке слоёв следует учитывать, что предобученные модели часто ожидают определённый диапазон входных данных (например, [0,1] или [-1,1]). Несоответствие входного формата может снизить эффективность замороженных слоёв.
Сохранение модели: при сохранении модели через
model.save() информация о том, какие слои заморожены,
сохраняется автоматически.
await model.save('localstorage://my-model');
Заморозка слоёв — фундаментальный инструмент при работе с предобученными моделями в TensorFlow.js. Она обеспечивает баланс между сохранением уже изученных признаков и адаптацией модели к новой задаче, позволяя эффективно использовать ресурсы и улучшать качество обучения.