Глава 13. Резюме, заключительные слова и дальнейшие источники информации
529
Весьма вероятно, что скоро обычную свертку повсеместно заменит эквивалент
ный, но более быстрый и эффективный алгоритм: разделяемая свертка с учетом глу
бины (слои
tf.layers.separableConv2d
). При создании сети с нуля очень рекомен
дуется использовать разделяемую свертку с учетом глубины. Слой separableConv2d
можно использовать в качестве упрощенной замены
tf.layers.conv2d
, в результате
чего получается меньшая и более быстрая сеть, демонстрирующая ничуть не худшие,
а то и лучшие результаты. Ниже приведена типичная сеть для классификации изобра
жений (однозначной многоклассовой классификации в данном случае). Ее топология
включает повторяющиеся группы слоев сверткисубдискретизации:
const model = tf.sequential();
model.add(tf.layers.separableConv2d({
filters: 32, kernelSize: 3, activation: 'relu',
inputShape: [height, width, channels]}));
model.add(tf.layers.separableConv2d({
filters: 64, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.maxPooling2d({poolSize: 2}));
model.add(tf.layers.separableConv2d({
filters: 64, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.separableConv2d({
filters: 128, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.maxPooling2d({poolSize: 2}));
model.add(tf.layers.separableConv2d({
filters: 64, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.separableConv2d({
filters: 128, kernelSize: 3, activation: 'relu'}));
model.add(tf.layers.globalAveragePooling2d());
model.add(tf.layers.dense({units: 32, activation: 'relu'}));
model.add(tf.layers.dense({units: numClasses, activation: 'softmax'}));
model.compile({loss: 'categoricalCrossentropy', optimizer: 'adam'});
Рекуррентные сети
RNN обрабатывают последовательности входных данных по одной метке времени за
раз с сохранением состояния от начала и до конца. Состояние обычно представляет
собой вектор или набор векторов (точку в геометрическом пространстве). В случае
последовательностей, в которых нас интересуют не инвариантные относительно
времени закономерности (например, данные временных рядов, в которых недавнее
прошлое важнее, чем отдаленное).
В TensorFlow.js есть три типа слоев RNN: simpleRNN, GRU и LSTM. В боль
шинстве случаев на практике применяются GRU или LSTM. LSTM, из этих двух
типов, обладает большими возможностями, но и требует больших вычислительных
ресурсов. GRU можно считать более простой и «дешевой» альтернативой LSTM.
Для размещения нескольких слоев RNN один поверх другого необходимо, чтобы
каждый из них, за исключением последнего, возвращал полную последователь
ность выходных сигналов (каждый входной временной шаг соответствует выход
ному временному шагу). Если такого размещения не требуется, слой RNN обычно
530
Do'stlaringiz bilan baham: |