Регуляризация и Dropout – это мощные методы, которые помогают улучшить обобщающую способность модели и предотвращают переобучение. Регуляризация добавляет штраф за сложные модели, уменьшая значения весов, а Dropout отключает случайный набор нейронов в процессе обучения, что снижает зависимость между нейронами.
Регуляризация L2
Регуляризация L2 добавляет штраф за большие веса к функции потерь, что помогает предотвратить переобучение.
```python
import tensorflow as tf
from tensorflow.keras import layers, models, regularizers
import numpy as np
import matplotlib.pyplot as plt
# Загрузка и предобработка данных
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images / 255.0
test_images = test_images / 255.0
train_images = train_images.reshape((60000, 28 * 28))
test_images = test_images.reshape((10000, 28 * 28))
# Модель с регуляризацией L2
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,), kernel_regularizer=regularizers.l2(0.001)))
model.add(layers.Dense(10, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Обучение модели
model.fit(train_images, train_labels, epochs=5, batch_size=128)
# Оценка модели
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Точность на тестовых данных с регуляризацией L2: {test_acc}")
```
Dropout
Dropout случайным образом отключает нейроны в процессе обучения, что снижает вероятность переобучения.
```python
# Модель с Dropout
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
model.add(layers.Dropout(0.5)) # Dropout слой с вероятностью 0.5
model.add(layers.Dense(10, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Обучение модели
model.fit(train_images, train_labels, epochs=5, batch_size=128)
# Оценка модели
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Точность на тестовых данных с Dropout: {test_acc}")
```
Совмещение регуляризации и Dropout
Использование регуляризации L2 вместе с Dropout может дополнительно улучшить обобщающую способность модели.
```python
# Модель с регуляризацией L2 и Dropout
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,), kernel_regularizer=regularizers.l2(0.001)))
model.add(layers.Dropout(0.5)) # Dropout слой с вероятностью 0.5
model.add(layers.Dense(10, activation='softmax'))
# Компиляция модели
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# Обучение модели
model.fit(train_images, train_labels, epochs=5, batch_size=128)
# Оценка модели
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(f"Точность на тестовых данных с регуляризацией L2 и Dropout: {test_acc}")
```
Добавление регуляризации и Dropout в вашу модель помогает предотвратить переобучение и улучшить её обобщающую способность. Регуляризация L2 уменьшает значения весов, а Dropout снижает зависимость между нейронами, что делает модель более устойчивой к шуму и менее склонной к переобучению. Экспериментируя с различными значениями параметров регуляризации и вероятностью Dropout, вы можете найти оптимальные настройки для вашей задачи.