Какие типы слоёв знаешь в machine learning?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы слоёв в Machine Learning (Neural Networks)
Neural Networks состоят из различных типов слоёв, каждый из которых выполняет определённую функцию. Вот полный обзор на основе моего опыта работы с глубоким обучением.
1. Dense (Fully Connected) слой
Самый базовый тип слоя — каждый нейрон связан со всеми нейронами предыдущего слоя:
import tensorflow as tf
import numpy as np
# Dense слой
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Формула: output = activation(input @ weights + bias)
# Количество параметров: (input_dim + 1) * output_dim
# (784 + 1) * 128 = 100,480 параметров для первого слоя
# Использование
X_train = np.random.rand(1000, 784)
y_train = np.random.randint(0, 10, 1000)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5, batch_size=32)
2. Convolutional (Conv2D) слой
Для обработки изображений — использует свёртку (convolution):
# Conv2D слой
model = tf.keras.Sequential([
# (height, width, channels) -> (output_height, output_width, filters)
tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation='softmax')
])
# Conv2D параметры:
# - kernel_size: размер фильтра (обычно 3x3 или 5x5)
# - filters: количество фильтров (как выходные каналы)
# - strides: размер шага при сдвиге ядра
# - padding: 'same' или 'valid'
# Примеры использования
X_train = np.random.rand(1000, 28, 28, 1) # Чёрно-белые изображения
y_train = np.random.randint(0, 10, 1000)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5, batch_size=32)
3. Recurrent (RNN, LSTM, GRU) слои
Для последовательных данных — имеют память предыдущих шагов:
# Простой RNN
model = tf.keras.Sequential([
tf.keras.layers.SimpleRNN(128, activation='relu', input_shape=(None, 100), return_sequences=True),
tf.keras.layers.SimpleRNN(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# LSTM (Long Short-Term Memory) — лучше обрабатывает длинные последовательности
model = tf.keras.Sequential([
tf.keras.layers.LSTM(128, activation='relu', input_shape=(None, 100), return_sequences=True),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# GRU (Gated Recurrent Unit) — более эффективный чем LSTM
model = tf.keras.Sequential([
tf.keras.layers.GRU(128, activation='relu', input_shape=(None, 100), return_sequences=True),
tf.keras.layers.GRU(64, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Использование
X_train = np.random.rand(1000, 30, 100) # 1000 последовательностей из 30 шагов по 100 признаков
y_train = np.random.randint(0, 10, 1000)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5, batch_size=32)
# return_sequences=True — возвращает все шаги, иначе только последний
4. Embedding слой
Преобразует целые числа в плотные вектора — используется для текста:
# Embedding для обработки текста
model = tf.keras.Sequential([
# input_dim: размер словаря, output_dim: размер вектора
tf.keras.layers.Embedding(input_dim=10000, output_dim=128, input_length=100),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# Использование для классификации текста
X_train = np.random.randint(0, 10000, (1000, 100)) # 1000 текстов из 100 слов
y_train = np.random.randint(0, 2, 1000) # Бинарная классификация
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5, batch_size=32)
5. Batch Normalization слой
Нормализует активации для ускорения обучения:
# Batch Normalization
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, input_shape=(784,)),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('relu'),
tf.keras.layers.Dense(64),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Batch Norm нормализует выход предыдущего слоя:
# y = gamma * (x - mean) / sqrt(variance + epsilon) + beta
# Преимущества:
# - Уменьшает внутреннее смещение (internal covariate shift)
# - Позволяет использовать более высокие learning rates
# - Работает как регуляризация
# - Ускоряет обучение
6. Dropout слой
Регуляризация — случайно отключает нейроны:
# Dropout
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dropout(0.5), # Отключит 50% нейронов
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(0.3), # Отключит 30% нейронов
tf.keras.layers.Dense(10, activation='softmax')
])
# Dropout работает по-разному в обучении и тестировании:
# Training: случайно отключает нейроны
# Testing: использует все нейроны (с масштабированием)
# Преимущества:
# - Предотвращает переобучение (overfitting)
# - Заставляет сеть учиться устойчивым представлениям
# - Как бы ансамбль моделей
7. Pooling слои
Уменьшает размерность данных:
# Max Pooling
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)), # Берёт максимум в окне 2x2
tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation='softmax')
])
# Average Pooling — берёт среднее значение
model.add(tf.keras.layers.AveragePooling2D(pool_size=(2, 2)))
# Global Pooling — берёт одно значение со всей карты признаков
model.add(tf.keras.layers.GlobalMaxPooling2D())
model.add(tf.keras.layers.GlobalAveragePooling2D())
8. Flatten слой
Преобразует многомерный вход в одномерный:
# Flatten
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
tf.keras.layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
# Преобразует (batch_size, height, width, channels) в (batch_size, height*width*channels)
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10, activation='softmax')
])
# Вычисления
# Input: (64, 7, 7, 64) = 64*7*7*64 = 200,704 параметров для Dense
9. Attention слои
Основной компонент трансформеров:
# Multi-Head Attention
model = tf.keras.Sequential([
tf.keras.layers.Embedding(10000, 128, input_length=100),
# Multi-Head Attention
tf.keras.layers.MultiHeadAttention(
num_heads=8,
key_dim=16,
dropout=0.1
),
tf.keras.layers.GlobalAveragePooling1D(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# Attention вычисляет взвешенную сумму значений на основе сходства ключей и запросов
# Query @ Key.T / sqrt(d) -> softmax -> взвешенная сумма Value
10. Residual (Skip Connection) слои
Добавляет выход предыдущего слоя к текущему — облегчает обучение глубоких сетей:
from tensorflow.keras import layers, Model
input_layer = layers.Input(shape=(784,))
# First block
x = layers.Dense(128, activation='relu')(input_layer)
x = layers.BatchNormalization()(x)
# Residual connection (skip connection)
residual = input_layer
residual = layers.Dense(128)(residual) # Match dimensions if needed
# Add residual
x = layers.Add()([x, residual])
x = layers.Activation('relu')(x)
# Second block
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(10, activation='softmax')(x)
model = Model(inputs=input_layer, outputs=x)
# Residual connections:
# - Позволяют обучать очень глубокие сети
# - Облегчают распространение градиентов
# - Пример: ResNet, DenseNet
11. Layer Normalization
Альтернатива Batch Norm — нормализует по признакам:
# Layer Normalization
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, input_shape=(784,)),
tf.keras.layers.LayerNormalization(),
tf.keras.layers.Activation('relu'),
tf.keras.layers.Dense(64),
tf.keras.layers.LayerNormalization(),
tf.keras.layers.Activation('relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Разница:
# Batch Norm нормализует по батчу (важна размер батча)
# Layer Norm нормализует по признакам (не зависит от размера батча)
12. 1D Convolution
Для временных рядов и текста:
# Conv1D для временных рядов
model = tf.keras.Sequential([
tf.keras.layers.Conv1D(32, kernel_size=3, activation='relu', input_shape=(100, 50)),
tf.keras.layers.MaxPooling1D(pool_size=2),
tf.keras.layers.Conv1D(64, kernel_size=3, activation='relu'),
tf.keras.layers.GlobalMaxPooling1D(),
tf.keras.layers.Dense(10, activation='softmax')
])
# Использование
X_train = np.random.rand(1000, 100, 50) # 1000 временных рядов, 100 шагов, 50 признаков
y_train = np.random.randint(0, 10, 1000)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=5, batch_size=32)
Сравнение слоёв
| Слой | Назначение | Входные данные | Параметры |
|---|---|---|---|
| Dense | Классификация, регрессия | Любые 1D | Тяжелый |
| Conv2D | Изображения | 2D изображения | Локальные связи |
| LSTM/GRU | Последовательности | Временные ряды | С памятью |
| Embedding | Текст | Целые числа (индексы слов) | Словарь |
| Dropout | Регуляризация | Любые | Нет |
| Batch Norm | Нормализация | Любые | Весь батч |
| Attention | Взаимодействие | Любые | Мощно |
| Flatten | Трансформация | Многомерные | Нет |
Рекомендации
- CNN для изображений — Conv2D + MaxPooling + Dense
- RNN для текста/времени — LSTM или GRU
- Attention для трансформеров — Multi-Head Attention
- Batch Norm для ускорения — после Dense или Conv
- Dropout для регуляризации — после Dense слоёв
- Skip connections — в глубоких сетях
- Layer Norm для трансформеров — стандартный выбор
- Pooling для уменьшения — MaxPooling для признаков
Выбор слоёв зависит от типа задачи, архитектуры и размера данных. Начните с базовых и добавляйте по необходимости.