что такое CNN?
Нет, но вот кое-что еще, что вы хотите увидеть:
А теперь скажи мне, что ты видишь?
Ага, собака. Это может быть очень обычной задачей для вас, но переход от просмотра изображения к определению того, что изображение говорит вам, включает в себя сложную цепочку реакций внутри вашего тела, начиная с передачи изображения на фоторецепторы (колбочки и палочки) на спине. ваших глазных яблок к распространению светового сигнала по сети нейронов в нескольких областях мозга. Вы должны благодарить эволюцию за эту удивительную способность.
Этот процесс обработки изображения внутри вашего мозга (после получения светового сигнала изображения) настолько сложен, что инженерам потребовалось некоторое время, чтобы понять, как воссоздать нашу способность обрабатывать данные изображения на компьютерных алгоритмах.
Наконец, в 1998 году исследователи разработали очень успешную алгоритмическую структуру, названную Сверточной нейронной сетью (CNN), которая может извлекать и собирать функции из заданного изображения (и, как вы увидите позже, любые данные, которые могут быть представлены сеткой или массивом значений пикселей) и использовать их, чтобы делать выводы о данных.
Некоторые алгоритмы CNN по-прежнему считаются лучшими алгоритмами для обработки изображений, и мы можем использовать мощь CNN для решения различных проблем, в том числе в инженерии тканей.
Оглавление
- Что такое CNN?
- Математика CNN
- Какое место CNN занимает в сфере машинного обучения?
- Эволюция CNN в истории
- Применение в тканевой инженерии
Что такое сверточная нейронная сеть (CNN)?
CNN — это искусственная нейронная сеть, которая извлекает шаблоны из заданного набора данных путем выполнения свертки. Чтобы расширить это немного больше, CNN применяют фильтры для поиска определенного набора шаблонов во всех частях точки данных. , а небольшие функции объединяются вместе для выявления более абстрактных и сложных закономерностей внутри данных.
Обычно CNN используется для обнаружения лиц, распознавания голоса и обработки сигналов (например, для данных мозговых волн).
Я вижу твое лицо; вы, вероятно, очень неудовлетворены и разочарованы очень расплывчатым определением CNN, которое я дал только вам. Хорошо 😤, я позволю вам глубже изучить CNN (но не гарантирую, что это ненадолго).
Принцип сверточных нейронных сетей (CNN)
Сверточные нейронные сети — это разновидность искусственных нейронных сетей (ИНС). Искусственные нейронные сети — это алгоритмы машинного обучения, состоящие из входного, скрытого и выходного слоев. Входной слой получает данные от пользователя, которые скрытый слой (точнее, скрытый слойs, поскольку он состоит из нескольких слоев, подключенных к друг друга) обрабатывает, распознавая шаблоны из каждой точки данных, а затем выводит вывод/утверждение о входных данных, отображаемых в выходном слое.
Примерами таких «выводов» о точке данных могут быть решения о том, является ли входное изображение кошкой или собакой, какова будет цена акций в следующем десятилетии, как робот должен двигаться, чтобы сделать следующий шаг вперед, и т. д.
Алгоритмы ANN различаются по
- какой тип входных данных принимает входной слой
- какие слои включают скрытые слои (что, в свою очередь, определяет тип вывода, представленного в выходном слое)
- Тип входных данных
Входной слой CNN принимает данные в виде сетки значений пикселей. Другими словами, каждая точка данных, переданная в модель CNN, должна быть матрицей чисел, и мы называем каждое из этих чисел значением пикселя.
2. Скрытые слои
Сверточные нейронные сети, как я только что упомянул, определяются алгоритмом, который извлекает функции из данных сетки, выполняя над ними операции свертки. Есть также три другие важные операции для CNN — слой пула, ReLU. слой и полносвязный слой.
Сверточный слой имеет набор фильтров, каждый из которых ищет определенный шаблон во входной сетке. Каждый из фильтров отдельно применяется к входу. Фильтр обычно представляет собой небольшую (3x3) матрицу чисел, которая наводится на каждое возможное место во входной сетке. Во время свертки каждое число в фильтре умножается на число на входе в соответствующем месте, и все произведения для каждой позиции фильтра суммируются в один пиксель в выходной матрице. Каждое значение в выходной матрице напрямую связано с тем, насколько четко шаблон на фильтре проявляется во входных данных. Когда мы выполняем еще одну операцию свертки над выходной матрицей, каждый фильтр будет представлять шаблон, созданный путем объединения ранее идентифицированных признаков определенным образом.
Но зачем вообще вообще нужны сверточные слои? Главный принцип CNN заключается в том, что поскольку входные данные проходят через последовательность слоев, алгоритм будет продвигаться от обнаружения детализированных, простых функций изображения(например, сегментов линий, форм) к более абстрактным и сложные объекты на входе (например, собаки, лампы). Свертывание(форма глагола «свертка») — это волшебная операция, которая позволяет этому произойти (но не волнуйтесь, на самом деле работа над этими слоями на удивление проста!)
Объединяющий слой уменьшает размер входных данных для следующего слоя свертки, суммируя информацию из групп пикселей в один пиксель. Мы можем сделать это, взяв среднее значение или максимальное значение группы из n пикселей в качестве значения одного пикселя в выходной матрице; мы называем это среднее объединение и максимальное объединение. В любом случае уровень объединения помогает снизить требуемую вычислительную мощность, сохраняя при этом наиболее важную информацию.
Основная цель свертки и объединения — извлечь признаки из входных данных; после всех операций свертки и объединения у вас будет матрица значений пикселей, где каждое значение пикселя указывает вероятность того, что определенный признак (например, кошачий глаз) присутствует в данном месте изображения. После операции свертки и объединения добавляются полносвязные слои, чтобы объединить извлеченные функции и сделать полезный вывод о данных.
Полностью связанные слои (также называемые плотно связанными слоями) лежат в основе фактического принятия решений в модели. Полносвязные слои состоят из нескольких «узлов» (или «персептронов»), где каждый узел принимает набор входных данных, умножает их на константу, называемую весом, и (иногда) добавляет к результату другую константу, называемую смещением.
Между парой слоев скрытый слой CNN включает слой ReLU для увеличения «нелинейности» выходной матрицы, что означает, что вы хотите, чтобы входное изображение было менее линейно коррелировано с окончательным прогнозом, что предположительно повышает точность модели. Честно говоря, я понятия не имею, как именно нелинейность влияет на точность модели. Если кто-то знает, как это сделать, поделитесь в комментариях ниже!
Что на самом деле такое Convolution и Pooling?
А вот и волшебный рецепт свертки и объединения слоев. Опять же, я буду демонстрировать данные изображения в оттенках серого, поскольку их проще всего понять визуально.
Обратное распространение
Прежде чем исследовать слои свертки и объединения, нам нужно знать, как модель машинного обучения повышает свою точность (процесс, называемый обратным распространением), чтобы мы могли собирать фрагменты информации с каждого слоя, которые можно использовать для выполнения обратное распространение в конце.
Как правило, обратное распространение включает три основных этапа:
- Найти неточность конечного результата модели
- Рассчитайте корреляцию того, как каждая часть модели (точнее, «параметры» модели) повлияла на эту ошибку.
- Используйте эту корреляцию для настройки каждого параметра, чтобы минимизировать ошибку.
Параметры – это константы или набор констант на каждом уровне, которые применяются (умножаются, добавляются и т. д.) к входным данным этого слоя для обработки данных. Параметры, присутствующие в алгоритме CNN, — это фильтры в сверточных слоях и веса в полносвязных слоях.
Расчет погрешности модели
Неточность модели рассчитывается путем включения результата модели и реального ответа в функцию потерь (E), которая вычисляет математическую разницу между прогнозом модели и ключом ответа. Существуют различные виды функций потерь, но наиболее распространены два из них: среднеквадратичная ошибка, когда модель выводит одно действительное число, и перекрестная энтропия для модели, которая классифицирует вход в одну из нескольких дискретных категорий. Например, если модель CNN использовалась для классификации изображения по одной из нескольких категорий, выходные данные модели будут включены в уравнение кросс-энтропии, чтобы найти ошибку модели.
Вклад каждого параметра в ошибку
Теперь, когда у нас есть ошибка модели, мы можем использовать ее, чтобы узнать, в каком направлении (положительном или отрицательном) и насколько следует настроить каждый параметр модели, чтобы минимизировать ошибку (и, следовательно, максимизировать точность).
Чтобы выяснить, как следует настроить каждый параметр для минимизации ошибки, мы измеряем, как ошибка модели изменяется при изменении каждого параметра. Математически мы представляем это изменение как наклон линии, где ось Y представляет ошибку модели, а ось X представляет значение одного параметра.
Однако ошибка модели не всегда образует идеально прямую линию с параметрами, поэтому вместо значения m в y = mx + b мы представляем этот наклон в виде производной, т. е. наклон в одной точке кривой (кривая ошибки модели).
Итак, для каждого параметра в модели мы должны найти производную ошибки по параметру: dE/dW_i(E = ошибка, W_i = i-й параметр). Поскольку в модели CNN используется несколько различных типов параметров (фильтры, веса), нам нужна специальная формула для dE/dW для каждого типа слоя.
Сверточный слой
Обычно вы видели, как фильтр парит над входным изображением и умножается на каждую группу пикселей на входе, но какая на самом деле математическая формула управляет этой операцией?
- Перемещение фильтра
Во время свертки фильтр часто перемещается по входному изображению по определенному шаблону, чаще всего по шаблону столбец-первый. В этой последовательности фильтр, начиная с верхнего левого угла, смещается вниз на определенное количество пикселей и продолжает свертываться вниз, пока не достигнет самого низа изображения. Затем он перемещается в самый верх следующего столбца и сворачивается вниз. Другими словами, фильтр завершает просмотр столбца, прежде чем перейти к следующему столбцу. Количество пикселей, на которое фильтр перемещается при каждом сдвиге, называется шагом (обычно используется шаг, равный 1, поэтому фильтр перемещается на 1 пиксель для нахождения следующей суммы).
Вы можете заметить, что количество элементов в выходной матрице меньше, чем количество элементов во входной матрице (входное изображение). На самом деле размер матрицы, полученной в результате свертки с шагом 1, равен
- # столбцов: [# столбцов изображения] - [# столбцов фильтра] + 1
- # строк: [# строк изображения] - [# строк фильтра] + 1
2. Умножение между фильтром и вводом
Для каждого смещения фильтра на входном изображении соответствующие элементы на фильтре и перекрывающаяся часть входного изображения перемножаются, и эти произведения суммируются в 1 число.
Это умножение и последующее сложение представлены матричным скалярным произведением двух матриц (подробности о том, как работает скалярное произведение, см. здесь).
- Первая матрица представляет собой реорганизацию входной матрицы. Для создания каждой строки этой матрицы группа элементов на входной матрице, соответствующая определенному положению фильтра, выкладывается в одну строку, так что каждый столбец этой группы горизонтально цепляется рядом друг с другом. Эти строки укладываются в порядке последовательности позиций, на которые фильтр переместится во входной матрице. Обозначим полученную матрицу через ϕ(x)(x = исходная матрица).
- Вторая матрица является результатом укладки элементов всех фильтров на сверточный слой бок о бок. Каждый столбец этой матрицы представляет элементы каждого фильтра. Как и в первой матрице, столбцы фильтра выстраиваются в цепочку рядом друг с другом, но на этот раз вертикально.
В результате скалярного произведения между первой и второй матрицами будет получена матрица, в которой каждый столбец представляет собой вертикальную перестановку всех элементов в выходной матрице после применения одного фильтра. Нам нужно преобразовать этот столбец в матрицу, чтобы каждый элемент пространственно соответствовал положению фильтра на входной матрице, но скалярное произведение эквивалентно визуальной операции свертки, которую вы видели ранее.
3. Производная от ошибки
После ряда операций мы видим, что производная ошибки модели по каждому фильтру в заданном сверточном слое равна: (вывод этой формулы выходит за рамки данной статьи, но я ссылка на документ, который расширяет этот вывод в конце)
Объединенный слой
В качестве обзора, объединение в основном суммирует выходную матрицу свертки, чтобы извлечь только важную информацию и сэкономить вычислительную мощность. По сути, входная матрица объединяющего слоя делится на непересекающиеся области, и выполняется определенный тип обработки для получения одного числа из каждой области. Существует два типа объединения: максимальное объединение и среднее объединение. Максимальное объединение находит максимальное значение значений в регионе, в то время как среднее объединение находит среднее значение.
Давайте сначала посмотрим на максимальный пул. Математическое уравнение для максимального объединения:
Не пугайтесь количества букв в уравнении; формула говорит следующее:
«Для каждого элемента в выходной матрице слоя l просмотрите каждый отдельный элемент в соответствующем наборе значений во входной матрице этого слоя и выведите максимальное из этих значений».
Примечание:
(1) Помните, что область входной матрицы, состоящая из нескольких элементов, используется для получения одного значения в выходной матрице. Это уравнение фактически берет каждый элемент в выходной матрице и индексирует отдельные элементы выходной матрицы.
(2) i^(l+1)*H+i – это индекс, который позволяет выполнить это преобразование из индекса выходной матрицы в индекс входной матрицы
Теперь, когда мы знаем, какое уравнение управляет максимальным пулом, средний пул выглядит удивительно похожим:
Единственное отличие состоит в том, что мы суммируем каждый отдельный элемент в указанной области во входной матрице и делим его на количество элементов в каждой области. Другими словами, вы выводите среднее значение для каждого региона во входной матрице.
Поздравляем, вы понимаете математику сверточных нейронных сетей! 🥳🥳😎 (Если вам интересно, как работают полносвязные слои и ReLU, ознакомьтесь с этой статьей)
Где находится CNN в машинном обучении?
Я заметил, что во всем, что касается обучения с учителем, CNN, алгоритмов классификации и т. д., есть некоторое недопонимание, поэтому я хочу уточнить здесь некоторую терминологию (и да, я тоже был смущен этим, когда только начинал).
Во-первых, я упомянул, что CNN — это тип искусственной нейронной сети (ANN). ИНС дает базовую структуру алгоритмов машинного обучения. Сверточные нейронные сети, а также рекуррентные нейронные сети (RNN) и генеративно-состязательные сети (GAN) — это все типы структур, которые может использовать алгоритм ML.
Это отличается от обучения с учителем, обучения без учителя, обучения с полуучителем и обучения с подкреплением, которые представляют собой формат данных, передаваемых в нейронную сеть.
- Обучение с учителем: алгоритм машинного обучения, использующий данные, где каждая точка данных помечена правильным ответом (например, изображение кошки с пометкой «кошка»).
- Неконтролируемое обучение: ни одна точка данных не помечена правильным ответом, модель должна определить различные классификации/кластеризацию данных (обычно используется для получения функций из данных, которые люди не могут идентифицировать сами) .
- Полууправляемое обучение: небольшой набор размеченных данных используется для обучения модели общей корреляции между входными и выходными данными (например, дома размером больше x обычно имеют стоимость выше y) и много немаркированных данных используется для остальной части обучения.
- Обучение с подкреплением (RL): модель учится методом проб и ошибок, чтобы повысить свою производительность при выполнении задачи (обычно когда модель помещается в среду, например в игру, и предлагается выполнить последовательность действий). действий для достижения цели, например, набрать более 100 баллов). Модель выводит действие, которое нужно выполнить в среде, а последствия этого действия возвращаются в качестве новых входных данных. RL отличается от других типов обучения тем, что текущий результат определяет следующий ввод.
Каждый из этих форматов данных оптимизирован для выполнения конкретных задач.
контролируемое обучение
- Классификация — классификация входных данных по одному из дискретного числа классов (например, яблоко, банан, клубника и т. д.) или значений (0, 1).
- Регрессия — определение числового значения из непрерывного диапазона (30,9, 0,005784, -pi и т. д.)
Неконтролируемое обучение
- Кластеризация — группировка точек данных по сходству (например, группировка перемешанного набора данных о кошках и собаках по сходству формы глаз, формы ушей и формы тела).
- Ассоциация - поиск корреляций между независимыми переменными, указанными в данных (например, клиенты, которые покупают продукт A, также могут купить продукт B)
Обучение с подкреплением
- На самом деле любое приложение, в котором агент (модель) помещается в среду и должен выполнять ряд действий для достижения цели (например, генератор объявлений, который сопоставляет клиента с нужными объявлениями, чтобы максимизировать вероятность того, что они нажмут на объявление)
Хотя эффективность/выполнимость могут различаться, теоретически все эти задачи можно выполнить с помощью любой структуры алгоритма ИНС (например, вы можете запустить классификацию изображений на CNN, RNN, иGAN). Однако существуют и другие структуры алгоритмов, помимо ИНС, которые специализированы для каждой задачи (например, машины опорных векторов как для классификации, так и для регрессии, K-ближайшие соседи для кластеризации, Q-обучение для обучения с подкреплением).
Выполнение
Вот пример того, как вы можете использовать CNN; мы будем использовать наш старый добрый набор данных MNIST (28 x 28 изображений рукописных цифр):
- Импортируйте библиотеки
import matplotlib.pyplot as plt import tensorflow as tf import tensorflow_datasets as tfds
2. Загрузите данные (= сохраните данные в переменных, чтобы вы могли напрямую передать их в модель)
(train_img, train_y), (test_img, test_y) = tf.keras.datasets.mnist.load_data()
- Данные разделены на две части: обучающие данные (данные, используемые исключительно для повышения производительности модели, например, домашние задания) и тестовые данные (данные, которые предоставляются для проверки точности модели, например, экзаменационные задачи). Набор данных MNIST уже содержит данные, разделенные на эти две части (60 000 поездов и 10 000 тестов), поэтому вам просто нужно «распаковать» набор данных на две части, назначив две переменные набору данных.
3. Визуализируйте точку данных, чтобы увидеть, как она выглядит
- plt.imshow() отображает изображение и очень часто используется для визуализации данных изображения.
img_index = 0 plt.imshow(train_img[img_index], cmap='Greys') print(train_y[img_index])
4. Предварительно обработайте набор данных
4a) Проверьте размер набора данных (посмотрите на размеры каждого изображения, показанные как последние два числа в скобках)
train_img.shape >> (60000, 28, 28)
4b) Нормализуйте набор данных (поместите все значения пикселей в диапазон от 0 до 1, чтобы каждый пиксель в целом влиял на процесс извлечения признаков)
train_img = train_img/255 # normalize to black-and-white test_img = test_img/255
- Для цветного изображения все значения пикселей находятся в диапазоне от 0 до 255, а для черно-белых изображений — от 0 до 1.
5. Постройте модель
import tensorflow.keras.layers as layers model = tf.keras.Sequential([ layers.Conv2D(filters = 28, input_shape = (28, 28, 1), kernel_size = (3, 3), strides = 1), # 28 filters layers.MaxPooling2D(pool_size = (2, 2)), layers.Flatten(), layers.Dense(128, activation=tf.keras.activations.relu), layers.Dropout(0.2), layers.Dense(10, activation = tf.keras.activations.softmax) ])
- Так как это простой пример, мы используем только небольшое количество слоев.
Примечание:
pool_size — размеры сегментов, на которые слой объединения делит входную матрицу
для последнего плотного слоя вы могли заметить, что я использовал функцию активации (функцию, которая сжимает ввод в число от 0 до 1) под названием softmax, о которой я не говорил. По сути, он принимает массив действительных чисел и выводит числа, которые представляют собой набор вероятностей, непосредственно связанных с каждым действительным числом (вероятность была бы большой, если бы заданное значение было большим).
6. Проведите обратное распространение
6a) Определите, какой алгоритм обратного распространения будет использоваться
- Здесь мы используем модель под названием Адам (адаптивная оценка момента), которая измеряет неточность с помощью перекрестной энтропии с точки зрения точности модели (разница между прогнозом и правильным ответом).
model.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
6b) Оптимизируйте параметры, чтобы максимизировать точность модели, используя определенный алгоритм обратного распространения на основе набора обучающих данных.
model.fit(x=train_img, y=train_y, epochs=10) >>
7. Оцените модель
model.evaluate(x=test_img, y=test_y) >> 313/313 [==============================] - 2s 7ms/step - loss: 0.0573 - accuracy: 0.9867
- Набор тестовых данных вводится в модель, и выводится точность модели по всем точкам данных.
8. Протестируйте модель с образцом данных
image_index = 7 plt.imshow(test_img[image_index], cmap = 'Greys') prediction = model.predict(test_img[image_index].reshape(1, 28, 28, 1)) print("Model's prediction:", prediction.argmax()) # .argmax() - label that the model picked as most probable
Привет! Меня зовут Елим, я новатор и строитель, увлеченный искусственным интеллектом, тканевой инженерией и мягкой робототехникой. Если вам понравилась эта статья, загляните в мои социальные сети ниже или свяжитесь со мной по электронной почте: [email protected].
Я с нетерпением жду встречи с вами, и, пожалуйста, похлопайте или прокомментируйте эту статью (бонусный балл, если вы сделаете и то, и другое)!
ЛинкедИн | Ютуб | Персональный сайт | Инстаграм | Твиттер