Часть II • Введение в TensorFlow.js
изображении. Например, сеть должна распознавать цифру 8 независимо от того,
была ли она сдвинута влево/вправо, вверх/вниз от центра входного изображе
ния 28
×
28. Это свойство называется
независимостью от конкретной позиции
(positional invariance). Чтобы уяснить себе, почему слой maxPooling2d снижает
зависимость от конкретной позиции, достаточно осознать: для него неважно, где
находится наиболее яркий пиксел в каждом из обрабатываемых фрагментов изо
бражения, лишь бы он не выходил за пределы фрагмента. Конечно, отдельный
слой maxPooling2d делает сеть лишь ограниченно нечувствительной к сдвигам
в силу ограниченности его окна субдискретизации. Однако совместное использо
вание в одной сети нескольких слоев maxPooling2d позволяет добиться существен
но большей независимости от конкретной позиции. Именно такова наша модель
MNIST — как и абсолютное большинство используемых на практике сверточных
нейронных сетей, — включающая два слоя maxPooling2d.
В качестве мысленного эксперимента представьте, что получится, если раз
местить непосредственно один над другим два слоя conv2d (назовем их conv2d_1
и conv2d_2) без промежуточного слоя maxPooling2d. Пусть
kernelSize
у каждого
из них равен
3
, тогда любой пиксел выходного тензора conv2d_2 является функ
цией области 5
×
5 входного тензора слоя conv2d_1, то есть размер рецептивного
поля у каждого «нейрона» слоя conv2d_2 равен 5
×
5. А что будет, если вставить
между этими двумя слоями conv2d (как в нашей сверточной нейронной сети для
MNIST) промежуточный слой maxPooling2d? Рецептивное поле нейронов conv2d_2
становится больше: 11
×
11, разумеется, вследствие субдискретизации. Большое ко
личество слоев maxPooling2d в сверточной нейронной сети обеспечивает наличие
широких рецептивных полей и независимость от конкретной позиции для слоев на
высших уровнях сети. Проще говоря, их поле зрения расширяется!
Вовторых, слой maxPooling2d уменьшает размеры измерений высоты и ширины
входного тензора, существенно снижая объем вычислений, необходимых в после
дующих слоях и сети в целом. Например, форма выходного тензора первого слоя
conv2d
[26,
26,
16]
. После прохождения через слой maxPooling2d тензор приобрета
ет форму
[13,
13,
16]
, то есть количество его элементов уменьшается в четыре раза.
Наша сверточная сеть включает еще один слой maxPooling2d, еще более уменьшая
размеры набора весов в последующих слоях, а значит, и число поэлементных мате
матических операций в них.
4.2.3. «Лейтмотивы» свертки и субдискретизации
Мы обсудили первый слой maxPooling2d и можем сосредоточить свое внимание
на следующих двух слоях сети, описываемых в листинге 4.1 этими строками кода:
model.add(tf.layers.conv2d(
{kernelSize: 3, filters: 32, activation: 'relu'}));
model.add(tf.layers.maxPooling2d({poolSize: 2, strides: 2}));
Эти два слоя в точности повторяют предыдущие два (за исключением большего
значения параметра
filters
и отсутствия поля
inputShape
в слое conv2d). Этот почти
в точности повторяющийся «лейтмотив», состоящий из сверточного слоя и слоя
Do'stlaringiz bilan baham: |