«Это 28-й день моего участия в ноябрьском испытании обновлений. Подробную информацию об этом событии см.:Вызов последнего обновления 2021 г.".
Сверточная нейронная сеть, CNN: сверточная нейронная сеть
Проблемы распознавания изображений и классические наборы данных
Набор данных CIFAR Набор данных ILSVRC2012
1. Введение в сверточные нейронные сети
По сравнению с полносвязной нейронной сетью разница заключается в следующем: в полностью связанной нейронной сети узлы между двумя соседними слоями соединены ребрами, поэтому узлы в каждом полносвязном слое обычно организованы в столбец. В сверточной нейронной сети только некоторые узлы соединены между двумя соседними слоями.Чтобы отобразить размеры нейронов в каждом слое, узлы каждого сверточных слоев обычно организуют в трехмерную матрицу. Структурная схема сверточной нейронной сети:
Входная информация-->Сверточный уровень 1-->Объединяющий уровень 1-->Сверточный уровень 2-->Объединяющий уровень 2-->Полный уровень соединения 1-->Полный уровень соединения 2-->softMax-->Результаты классификации
В первых нескольких слоях сверточной нейронной сети узлы каждого слоя организованы в трехмерную матрицу:
- Входной слой: Входной слой является входом всей нейронной сети.В сверточной нейронной сети, которая обрабатывает изображения, он обычно представляет собой пиксельную матрицу изображения. Начиная с входного слоя, сверточная нейронная сеть преобразует трехмерную матрицу предыдущего слоя в трехмерную матрицу следующего слоя через различные структуры нейронной сети и, наконец, достигает конечного полносвязного слоя;
- Сверточный слой: самый важный слой в сверточной нейронной сети. Вход каждого узла в сверточном слое — это только небольшой блок предыдущей нейронной сети, и размер этого небольшого блока обычно составляет 3*3 или 5*5. Сверточный слой пытается более глубоко проанализировать каждый небольшой блок в нейронной сети, чтобы получить признаки с более высокой степенью абстракции;
- Слой объединения: Слой объединения не изменяет глубину 3D-матрицы, но уменьшает размер матрицы. Например: преобразование изображения с более высоким разрешением в изображение с более низким разрешением. Через слой пула количество узлов в конечном полностью подключенном слое может быть дополнительно уменьшено, чтобы достичь цели уменьшения параметров во всей нейронной сети;
- Полностью связанный слой: в основном для выполнения задачи классификации;
- Слой Softmax: через слой softmax можно получить распределение вероятностей текущей выборки, принадлежащей к разным типам.
2. Общая структура сверточной нейронной сети
2.1 Сверточный слой
Его можно назвать фильтром или ядром.
Функция состоит в том, чтобы преобразовать матрицу дочерних узлов на текущем слое нейронной сети в матрицу единичных узлов на следующем слое нейронной сети. Так называемая единичная матрица узлов относится к матрице узлов, длина и ширина которой равны 1, но глубина не ограничена.
Длина и ширина обрабатываемой в фильтре матрицы узлов задаются вручную, и этот размер также называется размером фильтра, и обычно используется размер 3x3 или 5x5. Поскольку глубина матрицы, обрабатываемой фильтром, согласуется с глубиной текущей матрицы узлов нейронной сети, хотя матрица узлов является трехмерной, размер фильтра должен указывать только два измерения. Другой параметр в фильтре, который необходимо указать вручную, — это глубина результирующей единичной матрицы узлов, которая называется глубиной фильтра.
Процесс прямого распространения нейронной сети сверточного слоя — это процесс вычисления матрицы единичных узлов через матрицу фильтра: предположим, мы используемдля обозначения веса входного узла фильтра (x, y, z) для i-го узла в выходной единичной матрице узлов, используяпредставляет параметр члена смещения, соответствующий i-му выходному узлу, тогда значение i-го узла в единичной матрице равно:
в— значение узла фильтра (x, y, z), а f — функция активации.
Процесс прямого распространения структуры сверточного слоя получается путем перемещения фильтра из левого верхнего угла в правый нижний угол текущего слоя нейронной сети и вычисления каждой соответствующей матрицы идентичности во время движения.
Следующая формула дает размер результирующей матрицы, когда также используется заполнение всеми нулями:
вПредставляет длину матрицы выходного слоя, которая равна длине матрицы входного слоя, деленной на шаг в направлении длины с округлением в большую сторону. сродни,Представляет ширину матрицы выходного слоя, которая равна ширине матрицы входного слоя, деленной на шаг в направлении ширины с округлением вверх.
Если не использовать полное заполнение нулями, размер результирующей матрицы следующий:
В сверточной нейронной сети параметры фильтров, используемых в каждом сверточном слое, одинаковы, и совместное использование параметров фильтров в каждом сверточном слое может значительно уменьшить параметры нейронной сети. А количество параметров сверточного слоя никак не связано с размером изображения, оно связано только с размером, глубиной фильтра и глубиной матрицы узла текущего слоя. Это свойство позволяет сверточным нейронным сетям хорошо масштабироваться для больших данных изображения.
import tensorflow as tf
'''
通过tf.getV...的方式创建过滤器的权重变量和偏置项变量。上面介绍了卷积层
的参数个数只和过滤器的尺寸、深度以及当前层节点矩阵的深度相关,所以这里声明的参数变量是一个四维矩阵。
前两个维度表示了过滤器的尺寸,第三个维度表示了当前层的深度,第四个维度表示过滤器的深度
'''
filter_weight = tf.get_variable('weights', [5, 3, 1, 16],
initializer=tf.truncated_normal_initializer(stddev=0.1))
'''
和卷积层的权重类似,当前层矩阵上不同位置的偏置项也是共享的,所以总共有下一层深度个不同的偏置项。
本代码中的16为过滤器的深度,也是神经网络中下一层节点矩阵的深度
'''
biases = tf.get_variable('biases', [16], initializer=tf.constant_initializer(0.1))
'''
tf.nn.conv2d提供了一个非常方便的函数来实现卷积层的前向传播算法。这个函数的第一个输入为当前
层的节点矩阵,这个矩阵是一个四维矩阵,后面三个维度对应一个节点矩阵,第一维对应一个输入batch。比如
在输入层,input[0, :, :, :]表示第一张图片,input[1, :, :, :]表示第二张图片。以此类推。
tf.n.conv2d第二个参数提供了卷积层的权重,第三个参数为不同维度的步长,虽然参数三提供了一个长度为4的数组,
但是第一维和最后一维的数字要求一定是1,这是因为卷积层的步长只对矩阵的长和宽有效。最后一个参数是填充(padding)
TensorFlow提供了SAME和VALID两种选择,SAME表示添加全0填充,VALID表示不添加
'''
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding='SAME')
'''
tf.nn,bias_add提供了一个方便的函数给每一个节点加上偏置项,这里不能直接使用加法,因为矩阵上不同位置
上的节点都需要加上同样的偏置项。
'''
bias = tf.nn.bias_add(conv, biases)
# 将计算结果通过ReLU激活函数完成去线性化
actived_conv = tf.nn.relu(bias)
2.2 Слой объединения
- Между сверточными слоями часто добавляется объединяющий слой. Объединение слоев может быть очень эффективным для уменьшения размера матрицы, тем самым уменьшая параметры в конечном полносвязном слое. Использование объединяющего слоя может не только ускорить вычисления, но и предотвратить проблему переобучения;
- Прямой проход слоя объединения аналогичен сверточному слою, который также реализуется путем перемещения фильтра. Однако расчет в фильтре слоя пула представляет собой не взвешенную сумму узлов, а более простой расчет максимального или среднего значения. Слои пула, которые работают с максимальными значениями, называются максимальными слоями пула, и это наиболее часто используемая структура слоя пула. Слой пула, работающий со средним значением, называется слоем пула среднего;
- Способ перемещения фильтров в сверточном слое и слое пула аналогичен, единственное отличие состоит в том, что фильтры, используемые сверточным слоем, охватывают всю глубину, а фильтры, используемые слоем пула, влияют только на узлы на одной глубине. Следовательно, фильтр объединяющего слоя должен перемещаться в измерении глубины в дополнение к перемещению в двух измерениях длины и ширины.
Следующая программа TensorFlow реализует прямое распространение максимального слоя пула:
# tf.nn.max_pool实现了最大池化层的前向传播,它的参数和tf.nn.conv2d函数类似
# tf.nn.avg_pool来实现平均池化层
# ksize提供了过滤器的尺寸,strides提供了步长信息,padding决定是否要全0填充
pool = tf.nn.max_pool(activted_conv, ksize = [1, 3, 3, 1], strides=[1, 2, 2, 1], padding='SAME')
3. Модель классической сверточной сети
3.1 Модель Ленет-5
Структура модели «Ленет-5» состоит всего из семи слоев:
- Сверточный слой: этот слой является исходным пикселем изображения, а размер входного слоя, полученного моделью LeNet, составляет 32x32x1. Размер фильтра 5x5, глубина 6, отступы не используются со всеми нулями, а шаг равен 1. Поскольку все заполнение 0 не используется, выходной размер равен 32-5+1 = 28, а глубина равна 6. Этот сверточный слой имеет в общей сложности 5x5x1x6+6 = 156 параметров, из которых 6 являются параметрами члена смещения. Поскольку матрица узлов следующего уровня имеет 28x28x6 = 4071 узел, каждый узел соединен с 5x5 = 25 узлами текущего уровня, поэтому этот слой имеет в общей сложности 4071x(25+1) = 122304 соединения;
- Слой пула: вход этого слоя является выходом первого слоя, который представляет собой матрицу узлов 28x28x6. Размер фильтра равен 2x2, а шаг длины и ширины равен 2, поэтому размер выходной матрицы этого слоя равен 14x14x6;
- Сверточный слой: размер входной матрицы этого слоя составляет 14x14x6, размер используемого фильтра — 5x5, а глубина — 16. Не используйте все отступы 0, размер шага равен 1. Размер выходной матрицы 10x10x16. Согласно стандартному сверточному слою этот слой должен иметь 5x5x6x16+16 = 2416 параметров, 10x10x16x(25+1) = 41600 связей;
- Слой объединения: размер входной матрицы 10x10x16, размер фильтра 2x2, шаг 2. Выходная матрица 5х5х16;
- Полносвязный слой: Размер входной матрицы 5x5, а размер фильтра 5x5. В LeNet-5 он называется сверточным слоем. Поскольку входная матрица имеет тот же размер, что и фильтр, ее можно рассматривать как полностью связанный слой. Количество выходных узлов в этом слое 120, всего 5x5x16x120+120 = 48120 параметров;
- Полносвязный слой: количество входных узлов 120, количество выходных узлов 84, суммарные параметры 120x84+84 = 10164;
- Полносвязный слой: количество входных узлов 84, количество выходных узлов 10, всего 84x10+10 = 850 параметров.
Краткое описание применения модели LeNet-5:
Функция pool.get_shape может получить размер выходной матрицы, а функция tf.reshape может превратить данные, полученные с помощью get_shape, в концепцию отсева пакетного вектора: отсев случайным образом изменит вывод некоторых узлов на 0 во время обучения. Dropout может избежать проблемы переобучения и улучшить работу модели на тестовых данных. Dropout обычно используется только в полностью связанных слоях, а не в сверточных слоях или слоях пула.
Следующие регулярные выражения обобщают некоторые классические архитектуры сверточных нейронных сетей для задач классификации изображений:
Входной слой --> (сверточный слой +--> объединяющий слой?) +--> полносвязный слой +
В приведенной выше формуле «сверточный слой+» означает один или несколько сверточных слоев. «Объединяющий слой?» означает отсутствие или один объединяющий слой. После нескольких раундов сверточных слоев и объединенных слоев сверточная нейронная сеть обычно проходит через 1–2 полностью связанных слоя перед выводом. Например, модель LeNet-5 может быть выражена как:
Входной слой-->Сверточный слой-->Объединяющий слой-->Сверточный слой-->Объединяющий слой-->Полностью подключенный слой-->Полностью подключенный слой-->Выходной слой
Резюме конфигурации параметров сверточной нейронной сети:
- Как правило, длина стороны фильтра сверточного слоя не превышает 5, но в некоторых сверточных нейронных сетях сверточный слой, обрабатывающий вход, использует фильтр с длиной стороны 7 или даже 11;
- Что касается глубины фильтра, большинство сверточных нейронных сетей используют послойный метод;
- Шаг сверточного слоя обычно равен 1, но в некоторых моделях в качестве шага также используются 2 и 3;
- Конфигурация уровня пула относительно проста, и обычно используется максимальный уровень пула;
- Длина стороны фильтра объединяющего слоя обычно равна 2 или 3, а размер шага обычно равен 2 или 3.
3.2 Модель Inception-v3
Совершенно другая структура сверточной нейронной сети, отличная от структуры LeNet-5. Структура Inception в модели Inception-v3 параллельно сочетает в себе различные сверточные слои. То есть используя фильтры с длинами сторон 1, 3, 5, то есть все фильтры разного размера, а затем сшивая полученную матрицу воедино.
Модуль Inception сначала обрабатывает входную матрицу фильтрами разного размера. Различные матрицы представляют вычислительный путь в модуле Inception. Хотя размеры фильтров различны, если все фильтры заполнены всеми нулями, а размер шага равен 1, длина и ширина результирующей матрицы, полученной прямым распространением, такие же, как и входная матрица, так что результаты, обработанные разными фильтрами Матрицы могут быть объединены в более глубокую матрицу, которая может быть объединена в измерении глубины.
Модель Inception-v3 имеет в общей сложности 46 слоев и состоит из 11 начальных модулей с 96 сверточными слоями. Если следовать предыдущему разделу и реализовать сверточный слой с пятью строками кода, потребуется 480 строк кода, что, несомненно, слишком громоздко. Вот введение в инструмент TensorFlow-Slim для более лаконичной реализации сверточного слоя:
# 直接使用TensorFlow原始API实现卷积层
with tf.variable_scope(scope_name):
weights = tf.get_variable("weights", ...)
biases = tf.get_variable("bias", ...)
conv = tf.nn.conv2d(...)
relu = tf.nn.relu(tf.nn.bias_add(conv, biases))
# 使用TensorFlow-Slim实现卷积层
# slim.conv2d函数的有3个参数是必填的。第一个参数为输入节点矩阵
# 第二个参数为当前卷积层过滤器的深度
# 第三个参数为过滤器的尺寸
# 可选的参数有过滤器移动的步长、是否选用全0、激活函数的选择以及变量的命名空间等
net = slim.conv2d(input, 2, [3, 3])
Следующий код реализует начальный модуль:
import tensorflow as tf
# 加载slim库
slim = tf.contrib.slim
'''
slim.arg_scope函数可以用于设置默认的参数取值。slim.arg_scope函数的第一个参数是一个函数列表
在这个列表中的函数将使用默认的参数取值。比如通过下面的定义,调用slim.conv2d(net, 320, [1, 1]函数时会自动加上
stride=1和padding='SAME'的参数。如果在函数调用时指定了stride,那么这里设置的默认值就不会再使用
通过这种方式可以减少冗余的代码
'''
with slim.arg_scope([slim.conv2d, slim.max_pool2d, slim.avg_pool2d],
stride=1, padding='VALID'):
'''
此处省略了Inception-v3模型中其他的网络结构而直接实现最后面红色方框中的Inception结构
假设输入图片经过之前的神经网络前向传播的结果保存在变量net中
'''
net = '上一层的输出节点矩阵'
# 为一个Inception模块声明一个统一的变量命名空间
with tf.variable_scope('Mixed_7c'):
# 给Inception模块中每一条路径声明一个命名空间
with tf.variable_scope('Branch_0'):
# 实现一个过滤器,边长为1,深度为320的卷积层
branch_0 = slim.conv2d(net, 320, [1, 1], scope='Conv2d_0a_1x1')
# Inception模块中第二条路径,这条计算路径上的结构本身也是一个Inception结构
with tf.variable_scope('Branch_1'):
branch_1 = slim.conv2d(net, 384, [1, 1], scope='Conv2d_0a_1x1')
'''
tf.concat函可以将多个矩阵拼接起来。tf.concat函数的第一个参数指定了拼接的维度
这里给出的'3'代表了矩阵是在深度这个维度上进行拼接。
'''
branch_1 = tf.concat(3,
[slim.conv2d(branch_1, 384, [1, 3], scope='Conv2d_0b_1x3'),
slim.conv2d(branch_1, 384, [3, 1], scope='Conv2d_0c_3x1')])
# Inception中的第三条路径,此计算路径也是一个Inception结构
with tf.variable_scope('Branch_2'):
branch_2 = slim.conv2d(net, 448, [1, 1], scope='Conv2d_0a_1x1')
branch_2 = slim.conv2d(net, 384, [3, 3], scope='Conv2d_0b_3x3')
branch_2 = tf.concat(3,
# 此处2层卷积层的输入都是branch_1而不是net
[slim.conv2d(branch_2, 384, [1, 3], scope='Conv2d_0c_1x3')],
[slim.conv2d(branch_2, 384, [3, 1], scope='Conv2d_0d_3x1')])
# Inception中的第四条路径
with tf.variable_scope('Branch_3'):
branch_3 = slim.avg_pool2d(net, [3, 3], scope='AvgPool_0a_3x3')
branch_3 = slim.conv2d(branch_3, 192, [1, 1], scope='Conv2d_0b_1x1')
# 当前Inception模块的最后输出是上面四个计算结果拼接得到的
net = tf.concat(3, [branch_0, branch_1, branch_2, branch_3])
4. Обучение переносу сверточной нейронной сети
Так называемое трансфертное обучение заключается в том, чтобы сделать модель, обученную решению проблемы, подходящей для решения новой задачи путем простой настройки. Согласно заключению в статье DeCAF, параметры всех сверточных слоев в обученной модели Inception-v3 могут быть сохранены, но последний полносвязный слой заменяется, а сетевой слой перед последним полносвязным слоем называется слоем узкого места . Процесс прохождения нового изображения через обученную сверточную нейронную сеть в слой узкого места можно рассматривать как процесс выделения признаков для изображения. В обученной модели Inception-v3, поскольку выходные данные слоя узкого места передаются через однослойную полносвязную нейронную сеть, можно хорошо различить 1000 типов изображений, поэтому разумно предположить, что вектор узлов, выдаваемый узким местом Слой можно использовать напрямую.Эта обученная нейронная сеть выполняет извлечение признаков на изображениях, а затем использует извлеченные векторы признаков в качестве входных данных для обучения новой однослойной полносвязной нейронной сети для решения новых задач классификации.
Примечание: обработка естественного языка
языковая модель
Предполагая, что все возможные предложения в языке подчиняются определенному распределению вероятностей, сумма вероятностей появления каждого предложения равна 1, тогда задача языковой модели состоит в том, чтобы предсказать вероятность появления каждого предложения в языке. Хорошая языковая модель должна давать относительно высокие вероятности для предложений, которые распространены в языке, и близкие к 0 для незаконных предложений. Так как же рассчитать вероятность предложения? Сначала предложение можно рассматривать как последовательность слов:
где m — длина предложения, то его вероятность можно выразить как:
Представляет вероятность того, что m-е слово равно wm, когда известны первые m-1 слова. Если этот термин можно смоделировать, то вероятность появления предложения можно рассчитать, просто перемножив условные вероятности каждой позиции. Распространенными являются модель n-грамм, дерево решений, модель максимальной энтропии, условное случайное поле, модель языка нейронной сети и т. Д.
Методы оценки языковых моделей
Распространенной оценочной метрикой для оценки эффективности языковых моделей является сложность (недоумение). Чем ниже сложность, полученная на тестовом наборе, тем лучше эффект моделирования.
Формула расчета сложности выглядит следующим образом:
Из этой формулы видно, что, например, известно, чтоЭто предложение появится в корпусе, и чем выше вероятность этого предложения, рассчитанная языковой моделью, тем лучше языковая модель подходит к корпусу.
При обучении языковых моделей обычно используется логарифмическое представление недоумения:
Это превращает кумулятивное умножение в кумулятивное.
Математически логарифмическую сложность можно рассматривать как разницу между истинным распределением и прогнозируемым распределением.перекрестная энтропия, кросс-энтропия описывает своего рода расстояние между двумя распределениями вероятностей. Предполагая, что x является дискретной переменной, u (x) и v (x) являются двумя распределениями вероятностей, связанными с x, тогда определение перекрестной энтропии между u и v равно -log (v (x)) при ожидаемом распределении u ценность.
Рассмотрим x как слово, u(x) — истинное распределение слов в каждой позиции, v(x) — предсказанное распределение p(wi|w1, w2, ..., wi-1) модели, вы можете см. логарифмическое недоумение и перекрестная энтропия эквивалентны.