В Keras.js, как и в Keras для Python, каждый слой модели имеет
атрибут trainable, который определяет,
будут ли веса слоя обновляться в процессе обучения. Установка
trainable = false позволяет заморозить слой, предотвращая
изменение его параметров во время обучения, что особенно полезно при
использовании предобученных моделей или при поэтапной тренировке сложных
нейронных сетей.
Когда слой помечен как trainable = false:
Пример настройки слоя:
const denseLayer = new KerasJS.layers.Dense({
units: 128,
activation: 'relu',
inputShape: [64]
});
denseLayer.trainable = false;
После этого веса denseLayer останутся фиксированными при
обучении модели.
Частая практика — использование предобученных моделей, например, VGG16 или MobileNet, для извлечения признаков. В таких случаях:
Пример:
const KerasJS = require('keras-js');
const vgg16 = new KerasJS.Model({
filepath: 'vgg16_model.bin',
gpu: true
});
// Заморозка всех слоёв
vgg16.layers.forEach(layer => layer.trainable = false);
// Добавление нового слоя классификации
const newLayer = new KerasJS.layers.Dense({ units: 10, activation: 'softmax' });
newLayer.trainable = true;
vgg16.add(newLayer);
В этом подходе основные признаки остаются неизменными, а обучение сосредотачивается только на новых слоях.
Keras.js позволяет динамически менять состояние слоя:
denseLayer.trainable = false; // заморозка
denseLayer.trainable = true; // разморозка
Это удобно для пошаговой тренировки модели:
Такой подход называют fine-tuning и он позволяет улучшить качество модели, минимизируя риск переобучения.
Важно понимать, что установка trainable = false влияет
только на градиенты и обновление весов, но не отключает
слой в прямом проходе (forward pass). Слой продолжает участвовать в
вычислении выходов и влияет на итоговую ошибку.
Например:
const input = new KerasJS.layers.Input({ shape: [64] });
const frozenLayer = new KerasJS.layers.Dense({ units: 32, activation: 'relu' });
frozenLayer.trainable = false;
const output = frozenLayer.apply(input);
Даже при замороженных весах, output зависит от входных
данных и веса слоя используются при вычислении результата.
trainable каждого слоя при
загрузке предобученной модели, особенно если используется конвертация из
Python Keras.Keras.js поддерживает функциональный подход:
const input = new KerasJS.layers.Input({ shape: [224, 224, 3] });
const conv1 = new KerasJS.layers.Conv2D({ filters: 64, kernelSize: 3, activation: 'relu' });
conv1.trainable = false;
const conv2 = new KerasJS.layers.Conv2D({ filters: 128, kernelSize: 3, activation: 'relu' });
conv2.trainable = true;
const x = conv1.apply(input);
const y = conv2.apply(x);
const model = new KerasJS.Model({ inputs: input, outputs: y });
Это позволяет гибко управлять заморозкой отдельных слоёв и строить сложные архитектуры с разным уровнем обучаемости.
В Keras.js:
model.trainable = False для
всей модели. Замораживать нужно каждый слой
вручную.trainable не влияет на сохранение
весов, только на обучение.Эффективное использование trainable = false позволяет
экономить ресурсы, избегать переобучения и точно управлять обучаемостью
слоёв в Keras.js, что особенно важно при работе с крупными
предобученными моделями и задачами компьютерного зрения.