-
Notifications
You must be signed in to change notification settings - Fork 8
Models
EasyCNTK на текущий момент поддерживает 2 вида архитектур моделей: последовательную и последовательную с несколькими выходами. В большинстве задач подойдет обычная последовательная архитектура модели.
Стандартная архитектура применяемая в большинстве типовых задач глубокого обучения. Модель имеет один вход и один выход, сигнал последовательно передается от первого слоя к последнему. Реализуется классом Sequential.
Здесь создается последовательная модель с одним входом размерности 10, тремя Dense слоями по 10, 5, 1 нейронов соответственно. Везде функция активации Tanh.
var model = new Sequential<double>(DeviceDescriptor.CPUDevice, new[] { 10 });
model.Add(new Dense(10, new Tanh()));
model.Add(new Dense(5, new Tanh()));
model.Add(new Dense(1, new Tanh()));
Архитектура применяется в задачах, где необходимо, чтобы одна модель имела несколько выходов с одним общим входом. Например, при обучении с подкреплением по алгоритму Actor-Critic, где один выход модели указывает, какое действие необходимо выполнить, а второй выход указывает, какую среднюю награду (Reward) агент получит в этом случае.
Здесь создается последовательная модель с одним входом и тремя выходами. Вход имеет размерность 10, далее три общих слоя Dense по 10 нейронов и активацией Relu, затем модель разбивается на три ветви: "First", "Second", "Third".
- Ветвь First имеет один слой (являющийся так же выходом) Residual2 с активацией Tanh и размерностью 1.
- Ветвь Second имеет 3 слоя Dense по 10, 8, 4 нейрона соответственно, везде активация Relu.
- Ветвь Third имеет 3 слоя Dense по 20, 15, 8 нейронов соответственно, везде активация PRelu.
var model = new SequentialMultiOutput<float>(DeviceDescriptor.GPUDevice(0), new[] { 10 });
model.Add(new Dense(10, new ReLU()));
model.Add(new Dense(10, new ReLU()));
model.Add(new Dense(10, new ReLU()));
model.SplitToBranches("First", "Second", "Third");
model.AddToBranch("First", new Residual2(1, new Tanh()));
model.AddToBranch("Second", new Dense(10, new ReLU()));
model.AddToBranch("Second", new Dense(8, new ReLU()));
model.AddToBranch("Second", new Dense(4, new ReLU()));
model.AddToBranch("Third", new Dense(20, new PReLU()));
model.AddToBranch("Third", new Dense(15, new PReLU()));
model.AddToBranch("Third", new Dense(8, new PReLU()));
Обучается такая модель точно так же, как и простая последовательная модель Sequential, за исключением того, что для каждого выхода указывается:
- функция потерь
- оценочная функция
- оптимизатор
- набор меток/целевых значений (label)
Shortcut Connections (SC) - это техника проброса выхода слоя без изменения мимо нескольких последующих слоев, с целью ускорения обучения и устранения проблемы затухающих градиентов в глубоких сетях. Подобная техника используется в ResNet. EasyCNTK поддерживает этот механизм для создания неограниченного числа SC в одной модели, размер SC не ограничен, можно пробросить вход сразу на выход мимо всех слоев модели.
Здесь создается модель с двумя SC: SC1 и SC2. Обратите внимание, что SC2 имеет две выходные точки: в середине и в конце модели, допускается создать неограниченное количество выходных точек для одного SC.
var model = new Sequential<double>(DeviceDescriptor.CPUDevice, new[] { 10 });
model.Add(new Dense(10, new Tanh()));
model.Add(new Dense(10, new Tanh()));
model.CreateInputPointForShortcutConnection("SC1");
model.Add(new Dense(10, new Tanh()));
model.Add(new Dense(10, new Tanh()));
model.CreateInputPointForShortcutConnection("SC2");
model.Add(new Dense(10, new Tanh()));
model.Add(new Dense(10, new Tanh()));
model.CreateOutputPointForShortcutConnection("SC1");
model.CreateOutputPointForShortcutConnection("SC2");
model.Add(new Dense(5, new Tanh()));
model.Add(new Dense(5, new Tanh()));
model.CreateOutputPointForShortcutConnection("SC2");
model.Add(new Dense(1, new Tanh())); //выход модели