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

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. Создание модели:

Мы создаем последовательную модель (Sequential) и добавляем слои:

– Первый слой преобразует входные изображения в одномерный вектор.

– Два полносвязных слоя с 512 нейронами каждый и функцией активации ReLU.

– Выходной слой с 10 нейронами и функцией активации softmax для предсказания вероятностей классов.

5. Компиляция модели: Мы компилируем модель, используя функцию потерь `categorical_crossentropy`, оптимизатор `adam` и метрику `accuracy`.

6. Обучение модели: Мы обучаем модель на тренировочных данных с размером батча 128 и числом эпох 10, используя 20% данных для валидации.

7. Оценка модели: Мы оцениваем модель на тестовых данных и выводим значения потерь и точности.

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


Sigmoid

Функция активации Sigmoid была одной из первых функций, широко используемых в нейронных сетях, особенно в ранних моделях искусственных нейронных сетей. Sigmoid преобразует любое входное значение в диапазон от 0 до 1, что делает ее особенно полезной для задач, где требуется интерпретация вывода как вероятности. Именно по этой причине Sigmoid часто используется в выходных слоях нейронных сетей для задач бинарной классификации, где выходная величина должна представлять вероятность принадлежности к одному из двух классов.

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

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

Еще одним недостатком Sigmoid является ее асимптотическое поведение: для очень больших положительных или отрицательных значений входа выход функции становится близким к 1 или 0 соответственно, но никогда не достигает этих значений. Это может привести к ситуации, когда нейроны находятся в насыщенной области, где они практически не обучаются. Это особенно проблематично для глубоких нейронных сетей, где многослойное применение Sigmoid может усугублять проблему затухающих градиентов.