Использование фреймворков для нейросетей в Data Science
Для создания нейронных сетей на Python применяются два основных фреймворка: TensorFlow (с Keras) и PyTorch. Каждый из них предлагает различные способы построения архитектур. Рассмотрим основные подходы с примерами кода.
Создание нейронных сетей: TensorFlow и PyTorch
Как создать полносвязную сеть в TensorFlow?
Основное решение: Sequential API
Sequential API позволяет последовательно добавлять слои. Это самый простой способ для линейных архитектур.
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])библиотеки для машинного обучения python (библиотеки для машинного обучения в python (scikit-learn, tensorflow, pytorch))
Данный код создает модель с одним скрытым слоем, dropout и выходным слоем. Проблема: если забыть указать input_shape, модель не будет знать размер входа. Решение: задать input_shape в первом слое или использовать model.build().
Вариант 1: Functional API
Functional API позволяет строить более сложные графы, например, с множественными входами и выходами. Подходит для нелинейных топологий.
inputs = tf.keras.Input(shape=(784,))
x = tf.keras.layers.Dense(128, activation='relu')(inputs)
x = tf.keras.layers.Dropout(0.2)(x)
outputs = tf.keras.layers.Dense(10, activation='softmax')(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)Feature names python (имена признаков в python)
Частая ошибка:
неправильное соединение слоев (например, забыть передать тензор из предыдущего слоя). Решение: проверять, что каждый слой получает на вход тензор нужной формы.Вариант 2: Subclassing (пользовательский класс)
Создание модели через наследование от tf.keras.Model дает полный контроль над проходом вперед. Используется для исследовательских задач.
class MyModel(tf.keras.Model):
def __init__(self):
super().__init__()
self.dense1 = tf.keras.layers.Dense(128, activation='relu')
self.dropout = tf.keras.layers.Dropout(0.2)
self.dense2 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, inputs):
x = self.dense1(inputs)
x = self.dropout(x)
return self.dense2(x)
model = MyModel()искусственный интеллект на языке python (искусственный интеллект на python)
Ошибка:
забыть вызватьsuper().__init__(), что приводит к неправильной инициализации. Решение: всегда вызывать конструктор родительского класса.
Проблемы при работе с TensorFlow:
- Несоответствие формы данных: часто возникает, когда размерность входа не совпадает с
input_shape. Рекомендуется использоватьmodel.summary()для проверки. - Выбор функции потерь: для многоклассовой классификации используется
sparse_categorical_crossentropyпри метках в виде индексов иcategorical_crossentropyпри one-hot. - Переобучение: помогает регуляризация (L1/L2) и Dropout.
Как создать полносвязную сеть в PyTorch?
Основное решение: nn.Sequential
PyTorch также предоставляет последовательный контейнер для линейных сетей.
import torch.nn as nn
model = nn.Sequential(
nn.Linear(784, 128),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(128, 10),
nn.LogSoftmax(dim=1)
)Python model (модели в python (машинное обучение))
Здесь каждый слой применяется последовательно. Внимание: в PyTorch часто используют nn.LogSoftmax вместе с nn.NLLLoss или nn.CrossEntropyLoss (которая включает softmax).
Вариант 1: Класс на основе nn.Module
Позволяет определить произвольные операции в методе forward, поддерживает динамические графы.
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.relu = nn.ReLU()
self.drop = nn.Dropout(0.2)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.drop(x)
x = self.fc2(x)
return x
model = Net()статистическая библиотека python (статистическая библиотека python (scipy, statsmodels))
Типичная ошибка:
неверное наследование (забытьsuper(Net, self).__init__()), что приводит к отсутствию параметров. Также важно правильно определить forward и вернуть тензор.
Вариант 2: Использование nn.ModuleList
Позволяет хранить несколько слоев в списке и применять их в цикле, удобно для глубоких сетей с повторяющимися блоками.
class DeepNet(nn.Module):
def __init__(self):
super().__init__()
self.layers = nn.ModuleList([
nn.Linear(784, 256),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(256, 128),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(128, 10)
])
def forward(self, x):
for layer in self.layers:
x = layer(x)
return x
Этот подход упрощает создание вариативных архитектур, но требует внимания к порядку слоев.
Проблемы в PyTorch:
- Размерности: тензоры должны быть в формате (batch, features). Для изображений часто нужно использовать
viewилиflatten. - Устройство: модель и данные должны находиться на одном устройстве (CPU/GPU). Используйте
.to(device). - Функция потерь:
CrossEntropyLossожидает logits, а не softmax. Поэтому в последнем слое обычно не ставят активацию, или используютLogSoftmax.
Расширенные примеры создания и обучения нейронных сетей
Пример 1: Полный цикл обучения в TensorFlow (Keras)
Рассмотрим полный процесс: подготовка данных, создание модели, компиляция, обучение и оценка. Используем датасет MNIST.
import tensorflow as tf
from tensorflow.keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 784).astype('float32') / 255
x_test = x_test.reshape(-1, 784).astype('float32') / 255
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.2)
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f'Test accuracy: {test_acc:.4f}')
Epoch 1/5 1500/1500 [==============================] - 3s 2ms/step - loss: 0.2970 - accuracy: 0.9140 - val_loss: 0.1566 - val_accuracy: 0.9548 Epoch 2/5 1500/1500 [==============================] - 2s 2ms/step - loss: 0.1429 - accuracy: 0.9579 - val_loss: 0.1180 - val_accuracy: 0.9641 ... Test accuracy: 0.9770
Пояснение:
данные нормализованы, модель используетsparse_categorical_crossentropy так как метки целые. validation_split позволяет отслеживать переобучение.
Пример 2: Полный цикл обучения в PyTorch
Аналогичный процесс, но с ручным циклом обучения и DataLoader.
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from torchvision import datasets, transforms
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Lambda(lambda x: x.view(-1))
])
train_data = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST(root='./data', train=False, transform=transform)
train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
test_loader = DataLoader(test_data, batch_size=32, shuffle=False)
model = nn.Sequential(
nn.Linear(784, 128),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(128, 10)
)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters())
for epoch in range(5):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}: loss={loss.item():.4f}')
model.eval()
correct = 0
total = 0
with torch.no_grad():
for data, target in test_loader:
output = model(data)
_, predicted = torch.max(output, 1)
total += target.size(0)
correct += (predicted == target).sum().item()
print(f'Test accuracy: {100 * correct / total:.2f}%')
Epoch 1: loss=0.2895 Epoch 2: loss=0.1219 Epoch 3: loss=0.0932 Epoch 4: loss=0.0715 Epoch 5: loss=0.0612 Test accuracy: 97.15%
Пояснение:
используетсяCrossEntropyLoss, которая внутри применяет softmax, поэтому в последнем слое нет активации. Режимы model.train() и model.eval() важны для Dropout и BatchNorm.
Пример 3: Использование обратных вызовов (callbacks) в TensorFlow
Callbacks позволяют сохранять лучшую модель, останавливать обучение при отсутствии улучшений.
import tensorflow as tf
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
# Предположим модель и данные готовы
model = ... # та же Sequential модель
callbacks = [
EarlyStopping(patience=3, restore_best_weights=True),
ModelCheckpoint('best_model.h5', save_best_only=True)
]
history = model.fit(x_train, y_train, epochs=20, validation_data=(x_test, y_test), callbacks=callbacks)
# Лучшая модель будет загружена автоматически благодаря restore_best_weights
Epoch 1/20: loss=0.1800 - val_loss=0.1200 Epoch 2/20: loss=0.1000 - val_loss=0.1050 ... Early stopping at epoch 7: val_loss did not improve for 3 epochs.
Пример 4: Работа с GPU в PyTorch
Перенос модели и данных на GPU ускоряет обучение.
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device) # Net - класс, определенный ранее
data, target = data.to(device), target.to(device)
# Далее обучение как обычно
Примечание:
необходимо убедиться, что все тензоры и модель находятся на одном устройстве, иначе возникнет ошибка.