AlexNet — это глубокая сверточная нейросеть, которая произвела революцию в компьютерном зрении. В ConvNetJS она может быть реализована полностью на стороне клиента с использованием JavaScript, что позволяет экспериментировать с архитектурой, параметрами обучения и визуализацией активаций в реальном времени.
AlexNet состоит из нескольких типов слоёв, каждый из которых играет ключевую роль в обработке изображений:
Сверточные слои (Convolutional Layers)
Используются для выделения признаков изображения.
В ConvNetJS реализуются через объект conv_layer, где
можно задавать фильтры, шаг свертки и размер подвыборки.
Пример конфигурации слоя:
var layer = {
type: 'conv',
num_filters: 96,
filter_size: 11,
stride: 4,
pad: 0,
activation: 'relu'
};Ключевые моменты: первый слой AlexNet использует крупные фильтры 11×11 с шагом 4, что уменьшает размер изображения на ранней стадии, а последующие слои применяют фильтры меньшего размера для захвата локальных признаков.
Субдискретизирующие слои (Pooling Layers)
Обычно применяются после сверточных слоёв для уменьшения размерности и уменьшения вычислительной нагрузки.
В ConvNetJS используется pool_layer:
var layer = {
type: 'pool',
pool_size: 3,
stride: 2,
pool_type: 'max'
};MaxPooling позволяет сети фокусироваться на наиболее выраженных признаках, сохраняя важные детали изображения.
Нелинейные активации (ReLU)
Rectified Linear Unit)
после каждого сверточного слоя для ускорения сходимости обучения.activation: 'relu' в конфигурации слоя.Полносвязные слои (Fully Connected Layers)
После серии сверточных и пуллинговых слоёв идут полносвязные слои, которые объединяют извлечённые признаки для классификации.
Пример конфигурации:
var layer = {
type: 'fc',
num_neurons: 4096,
activation: 'relu'
};AlexNet имеет два больших полносвязных слоя с 4096 нейронами каждый и финальный слой для классификации с числом нейронов, соответствующим количеству классов.
ConvNetJS предоставляет объект ConvNet, в который
передаётся массив слоёв:
var layers = [
{type:'input', out_sx:227, out_sy:227, out_depth:3},
{type:'conv', num_filters:96, filter_size:11, stride:4, pad:0, activation:'relu'},
{type:'pool', pool_size:3, stride:2, pool_type:'max'},
{type:'conv', num_filters:256, filter_size:5, stride:1, pad:2, activation:'relu'},
{type:'pool', pool_size:3, stride:2, pool_type:'max'},
{type:'conv', num_filters:384, filter_size:3, stride:1, pad:1, activation:'relu'},
{type:'conv', num_filters:384, filter_size:3, stride:1, pad:1, activation:'relu'},
{type:'conv', num_filters:256, filter_size:3, stride:1, pad:1, activation:'relu'},
{type:'pool', pool_size:3, stride:2, pool_type:'max'},
{type:'fc', num_neurons:4096, activation:'relu'},
{type:'fc', num_neurons:4096, activation:'relu'},
{type:'softmax', num_classes:1000}
];
var net = new convnetjs.Net();
net.makeLayers(layers);
Для обучения используется объект Trainer:
var trainer = new convnetjs.Trainer(net, {
method: 'sgd',
learning_rate: 0.01,
momentum: 0.9,
batch_size: 128,
l2_decay: 0.0005
});
l2_decay предотвращает
переобучение на больших полносвязных слоях.ConvNetJS позволяет визуализировать, какие признаки распознаются на
каждом сверточном слое. Используется метод forward() для
получения активаций:
var x = new convnetjs.Vol(227, 227, 3, 0.0);
var activations = net.forward(x);
AlexNet в ConvNetJS демонстрирует принципы работы глубокой сверточной сети в компактной и наглядной форме, что делает её удобным инструментом для обучения и исследований в области компьютерного зрения.