← Назад к вопросам

Какие типы слоёв знаешь в machine learning?

2.0 Middle🔥 11 комментариев
#Python Core#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы слоёв в 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ТрансформацияМногомерныеНет

Рекомендации

  1. CNN для изображений — Conv2D + MaxPooling + Dense
  2. RNN для текста/времени — LSTM или GRU
  3. Attention для трансформеров — Multi-Head Attention
  4. Batch Norm для ускорения — после Dense или Conv
  5. Dropout для регуляризации — после Dense слоёв
  6. Skip connections — в глубоких сетях
  7. Layer Norm для трансформеров — стандартный выбор
  8. Pooling для уменьшения — MaxPooling для признаков

Выбор слоёв зависит от типа задачи, архитектуры и размера данных. Начните с базовых и добавляйте по необходимости.