реклама
Бургер менюБургер меню

Джейд Картер – Сверточные нейросети (страница 10)

18

```

[[0, 1, 0, 2, 1, 0],

[0, 2, 1, 1, 0, 1],

[1, 0, 2, 0, 1, 2],

[2, 1, 0, 1, 2, 0],

[1, 2, 1, 0, 0, 1],

[0, 0, 1, 2, 1, 0]]

```

Предположим, мы применяем операцию Max-pooling с окном размером 2x2 и шагом 2. Это означает, что мы будем скользить окном размером 2x2 по изображению с шагом 2 и выбирать максимальное значение в каждом окне.

Результат Max-pooling будет следующим:

```

[[2, 2],

[2, 2]]

```

Здесь каждое значение является максимальным из соответствующего окна 2x2 в исходном изображении. Таким образом, мы уменьшили размерность изображения с 6x6 до 2x2, оставив только наиболее активные признаки.

Вместе свертка и пулинг образуют основу сверточных нейронных сетей, обеспечивая эффективное извлечение и агрегацию признаков из входных данных.

Глава 3. Функции активации

– Основные функции: ReLU, Sigmoid, Tanh

– Современные функции активации: Leaky ReLU, ELU, Swish

– Влияние функций активации на обучение сети

ReLU (Rectified Linear Unit)

ReLU, или выпрямленный линейный элемент, является одной из наиболее часто используемых функций активации в современных нейронных сетях. Главной особенностью ReLU является его простота: он передает входное значение, если оно положительно, и устанавливает его в ноль, если оно отрицательно. Такая простота в вычислениях делает ReLU чрезвычайно эффективной и быстрой по сравнению с другими функциями активации, такими как Sigmoid или Tanh.

Основным преимуществом ReLU является его способность устранять проблему затухающих градиентов. Проблема затухающих градиентов возникает, когда производные активационной функции становятся очень маленькими, что замедляет обновление весов во время обратного распространения ошибки и делает обучение сети затруднительным. ReLU, благодаря своей линейной природе для положительных входов, сохраняет большие градиенты и, следовательно, способствует более быстрой сходимости модели.

Однако у ReLU есть и недостатки. Один из основных – это проблема "умирающих ReLU". Эта проблема возникает, когда большое количество нейронов в сети перестает реагировать на изменения входных данных. Это происходит потому, что для отрицательных входных значений ReLU возвращает ноль, и если нейрон часто получает отрицательные значения, он может навсегда перестать обновлять свои веса, фактически "умирая". В результате сеть может терять значительное количество нейронов, что снижает её способность к обучению и обобщению.

Несмотря на этот недостаток, ReLU остается популярным выбором благодаря своим преимуществам и простоте. Для решения проблемы "умирающих ReLU" были разработаны модификации, такие как Leaky ReLU и ELU, которые сохраняют преимущества ReLU, добавляя при этом возможность обработки отрицательных значений.

Пример использования ReLU

Рассмотрим пример использования функции активации ReLU в нейронной сети, реализованной с помощью библиотеки Keras на Python. В этом примере мы создадим простую полносвязную нейронную сеть для классификации рукописных цифр из набора данных MNIST.

```python

import keras

from keras.models import Sequential

from keras.layers import Dense, Flatten

from keras.datasets import mnist

from keras.utils import np_utils

# Загрузка данных MNIST

(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Нормализация входных данных

X_train = X_train.astype('float32') / 255

X_test = X_test.astype('float32') / 255

# Преобразование меток в one-hot encoding

y_train = np_utils.to_categorical(y_train, 10)

y_test = np_utils.to_categorical(y_test, 10)

# Создание модели

model = Sequential()

# Добавление слоев с функцией активации ReLU

model.add(Flatten(input_shape=(28, 28))) # Преобразование входных данных в вектор

model.add(Dense(512, activation='relu')) # Первый полносвязный слой с ReLU

model.add(Dense(512, activation='relu')) # Второй полносвязный слой с ReLU

model.add(Dense(10, activation='softmax')) # Выходной слой с softmax для многоклассовой классификации

# Компиляция модели

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Обучение модели

model.fit(X_train, y_train, batch_size=128, epochs=10, validation_split=0.2)

# Оценка модели на тестовых данных

score = model.evaluate(X_test, y_test)

print(f'Test loss: {score[0]}')

print(f'Test accuracy: {score[1]}')

```

Пояснение

1. Загрузка данных MNIST:

Мы загружаем набор данных MNIST, который состоит из изображений рукописных цифр (28x28 пикселей).

2. Нормализация входных данных:

Мы нормализуем значения пикселей, деля их на 255, чтобы привести их в диапазон от 0 до 1.

3. Преобразование меток в one-hot encoding:

Мы преобразуем метки классов в формат one-hot encoding, что необходимо для обучения модели в задачах многоклассовой классификации.

4. Создание модели: