Несмотря на свои недостатки, функция активации Sigmoid все еще находит применение в современных нейронных сетях, особенно в тех случаях, когда требуется интерпретация выходных значений как вероятностей. Тем не менее, для большинства задач глубокого обучения предпочтение отдается другим функциям активации, таким как ReLU и его вариации, которые лучше справляются с проблемой затухающих градиентов и способствуют более быстрой сходимости моделей.
Пример использования Sigmoid
Рассмотрим пример использования функции активации Sigmoid в нейронной сети, реализованной с помощью библиотеки Keras на Python. В этом примере мы создадим простую нейронную сеть для задачи бинарной классификации на наборе данных Pima Indians Diabetes.
```python
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
from keras.utils import np_utils
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# Загрузка данных Pima Indians Diabetes
from sklearn.datasets import load_diabetes
data = load_diabetes()
X = data.data
y = (data.target > data.target.mean()).astype(int) # Бинаризация целевой переменной
# Разделение данных на тренировочную и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Нормализация данных
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# Создание модели
model = Sequential()
# Добавление слоев с функцией активации Sigmoid
model.add(Dense(12, input_dim=X_train.shape[1], activation='sigmoid')) # Первый полносвязный слой с Sigmoid
model.add(Dense(8, activation='sigmoid')) # Второй полносвязный слой с Sigmoid
model.add(Dense(1, activation='sigmoid')) # Выходной слой с Sigmoid для бинарной классификации
# Компиляция модели
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Обучение модели
model.fit(X_train, y_train, epochs=150, batch_size=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. Загрузка данных Pima Indians Diabetes:
Мы используем набор данных Pima Indians Diabetes, который содержит различные медицинские показатели, чтобы предсказать, есть ли у пациента диабет (бинарная классификация). В этом примере мы создаем бинарную метку на основе того, превышает ли целевая переменная среднее значение.
2. Разделение данных:
Мы делим данные на тренировочные и тестовые выборки в соотношении 80% на 20%.
3. Нормализация данных:
Мы нормализуем данные с использованием `StandardScaler` для улучшения производительности модели.
4. Создание модели:
Мы создаем последовательную модель (Sequential) и добавляем слои:
– Первый слой содержит 12 нейронов и использует функцию активации Sigmoid. Размер входного слоя соответствует числу признаков в данных.
– Второй слой содержит 8 нейронов и также использует функцию активации Sigmoid.
– Выходной слой содержит 1 нейрон и использует функцию активации Sigmoid для бинарной классификации (выходное значение в диапазоне от 0 до 1, интерпретируемое как вероятность).
5. Компиляция модели:
Мы компилируем модель, используя функцию потерь `binary_crossentropy`, оптимизатор `adam` и метрику `accuracy`.
6. Обучение модели:
Мы обучаем модель на тренировочных данных с размером батча 10 и числом эпох 150, используя 20% данных для валидации.
7. Оценка модели:
Мы оцениваем модель на тестовых данных и выводим значения потерь и точности.