Skip to content
StanislavGrigoriev edited this page Jan 9, 2020 · 3 revisions

Модели

EasyCNTK на текущий момент поддерживает 2 вида архитектур моделей: последовательную и последовательную с несколькими выходами. В большинстве задач подойдет обычная последовательная архитектура модели.

Последовательная архитектура (Sequential)

Стандартная архитектура применяемая в большинстве типовых задач глубокого обучения. Модель имеет один вход и один выход, сигнал последовательно передается от первого слоя к последнему. Реализуется классом 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()));

Последовательная архитектура с несколькими выходами (SequentialMultiOutput)

Архитектура применяется в задачах, где необходимо, чтобы одна модель имела несколько выходов с одним общим входом. Например, при обучении с подкреплением по алгоритму 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)

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())); //выход модели