← На главную Воспоминания

Среда, 15 Ноября 2023

Продолжаю изучать сверточные нейронные сети. В этот раз разберу подробнее из чего состоит бейс. 3 главных операции:

  1. Фильтер. Сама свертка
  2. Детект. Применение Релу чтобы убрать все что ниже нуля(неважные фичи неважны одинаково)
  3. Конденс. Чтобы меньшить размерность, тем самым сделать меньше ненужных пикселей, повысив эффективность обучения

Пример фильтра

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(filters=64, kernel_size=3), # activation is None
    # More layers follow
])

kernel_size - это размер кернела. Кернел это веса слоя-фильтра.
Фича мап - это взвещенная сумма пикселей картинки и слоя фильтра, то что получается после применения фильтр матрицы.
filters - количество фильтров которые мы хотим чтобы были применины к изображению.

Полезные ссылки:

Второе это детект. С помощью релу все отрицательные числа в получившимся тензоре заменяются нулями

model = keras.Sequential([
    layers.Conv2D(filters=64, kernel_size=3, activation='relu')
    # More layers follow
])

Третье это конденс. Иными словами цель сделать меньше ненужных данных, те которые стали нулями. Если мы уберем часть нулей, качество распознования ухидшиться из за того что у нас теперь меньше позиционных данных(это как смотреть на изображение с все большего и большего расстояния) но возрастет скорость обработки, так нужно будет обрабатывать меньше информации, меньше нейронов для нейронной сети. Это называется Maximum pooling, и его пример

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(filters=64, kernel_size=3), # activation is None
    layers.MaxPool2D(pool_size=2),
    # More layers follow
])

Stride and Padding

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(filters=64,
                  kernel_size=3,
                  strides=1,
                  padding='same',
                  activation='relu'),
    layers.MaxPool2D(pool_size=2,
                     strides=1,
                     padding='same')
    # More layers follow
])

strides - на сколько пикселей перемещаться при смене положения окна.
padding - что делать с краями изображения. Чтобы все пиксели вместились в окно и свернулись, нужно сделать либо рамку из нулей(padding='same'), либо не брать краевые пиксели(padding='valid').


Продолжаю дальше изучать сверточные сети