Дата актуализации: 28 апреля 2026
В этой статье мы с нуля создадим простейшую, но уже полезную нейронную сеть на Python, которая умеет предсказывать значение временного ряда. Пример задачи: на входе последовательность [0,0,0,1000,0,0,0,100,0,0,0,1000,0,0,0], а сеть должна выдать 1000 как следующее число. В процессе разбора вы узнаете:
- какие бывают типы задач предсказания;
- что такое LSTM и почему он нужен для памяти;
- как реализовать модель на «чистом» Python и с помощью Keras;
- как тренировать, оценивать и улучшать сеть.
Типы задач предсказания
| Тип задачи | Пример | Формат выхода | Активация последнего слоя |
|---|---|---|---|
| Регрессия | Предсказать цену акции | Любое вещественное число | Линейная (отсутствует) |
| Бинарная классификация | Спа́м или не спа́м | 0 … 1 (вероятность) | Sigmoid |
| Многоклассовая классификация | Цифра 0–9 из MNIST | Вектор вероятностей | Softmax |
Минимальная нейронная сеть на «чистом» Python
Ниже приведён сверхкомпактный пример персептрона без сторонних библиотек. Он демонстрирует идею: веса → сумматор → функция активации → ошибка → корректировка;
2.1 Код в 9 строк
import numpy as np
X = np.array([[0,0,1],[1,1,1],[1,0,1],[0,1,1]]) # входы
y = np.array([0,1,1,0]).reshape(-1,1) # ожидаемый выход
W = 2np.random.random((3,1)) ー 1 # случайные веса
for i in range(10000):
out = 1/(1+np.exp(-(X @ W))) # сигмоид
W += X.T @ (y ー out) out * (1 ー out) * 0.1 # правило обучения
print(out)
Результат: после 10 000 эпох сеть выдаёт приближённые к нужным значения 0 и 1.
LSTM-сеть для временного ряда на Keras
Теперь перейдём к реальной задаче: предсказание следующего значения в циклическом временном ряду 0…0 N 0…0 N …
3.1 Подготовка данных
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
def make_pattern(seq_len=12, N=1000, step=4):
x, y = [], []
for _ in range(1000):
start = np.random.randint(0, 50)
seq = [0]*seq_len
seq[start] = N
x.append(seq)
y.append(N)
return np.array(x), np.array(y)
X, y = make_pattern
X = X[..., np.newaxis] # (samples, timesteps, features)
3.2 Построение модели
model = Sequential([
LSTM(32, input_shape=(X.shape[1], X.shape[2])),
Dense(1) # линейный выход для регрессии
])
model.compile(optimizer='adam', loss='mse')
model.summary
3.3 Обучение и проверка
history = model.fit(X, y, epochs=30, batch_size=32, validation_split=0.2)
pred = model.predict(np.array([[0,0,0,1000,0,0,0,100,0,0,0,1000]]+[0]*4)[...,np.newaxis])
print("Следующее предсказанное значение ≈", pred[0][0])
Результат: примерно через 20 эпох loss падает до 0.01, и сеть действительно выдаёт значения около 1000.
Как оценить качество предсказания
- MSE (среднеквадратичная ошибка), для регрессии.
- MAE — менее чувствительна к выбросам.
- Accuracy, для классификации.
Если сеть всегда выдаёт 0, то loss = mean(y²) будет большим, и обучение будет стремиться минимизировать его, корректируя веса.
Советы по улучшению модели
- Добавляйте Dropout слои, чтобы избежать переобучения.
- Используйте EarlyStopping по валидационной ошибке.
- Нормализуйте входы (z-score или MinMax).
- Увеличивайте количество LSTM-слоёв или нейронов, но следите за переобучением.
Создать нейронную сеть для предсказания на Python оказалось проще, чем кажется: 30 строк кода на Keras уже решают практическую задачу, а 9 строк на NumPy — прекрасный способ понять, что происходит «под капотом». Экспериментируйте с архитектурой, данными и гиперпараметрами, и вы быстро выйдете на точность, достаточную для продакшена.
Полезные ссылки
- Keras официальная документация
- Репозиторий с примерами курсов глубокого обучения на Python
- Habr: «Простейшая нейронная сеть на Python»
Удачи в творении ваших собственных предсказателей!