Сверточные нейронные сети (CNN) стали краеугольным камнем революции глубокого обучения в компьютерном зрении и значительно повлияли на классификацию изображений, обнаружение объектов и многие другие области. За прошедшие годы CNN превратились из простых нейронных сетей с прямой связью в сложные модели, которые могут обрабатывать изображения, видео и трехмерные данные с высокой точностью.

Ранние CNN

На заре CNN основное внимание уделялось созданию моделей, которые могли бы выполнять классификацию изображений. Одной из первых успешных CNN была LeNet-5, представленная в 1998 году Яном Лекуном. Эта модель состояла из нескольких сверточных слоев и слоев объединения, за которыми следовали несколько полносвязных слоев. Модель была обучена на наборе данных MNIST и достигла самых современных результатов на тот момент.

Вот простая реализация сверточной нейронной сети (CNN) в PyTorch:

import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5) # 3 input channels, 6 output channels, kernel size of 5x5
        self.pool = nn.MaxPool2d(2, 2) # max pooling layer with kernel size of 2x2 and stride of 2
        self.conv2 = nn.Conv2d(6, 16, 5) # 6 input channels, 16 output channels, kernel size of 5x5
        self.fc1 = nn.Linear(16 * 5 * 5, 120) # fully connected layer with 120 output units
        self.fc2 = nn.Linear(120, 84) # fully connected layer with 84 output units
        self.fc3 = nn.Linear(84, 10) # fully connected layer with 10 output units (number of classes)
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x))) # apply activation function after first convolution and pooling layer
        x = self.pool(F.relu(self.conv2(x))) # apply activation function after second convolution and pooling layer
        x = x.view(-1, 16 * 5 * 5) # flatten the tensor to a 1D vector
        x = F.relu(self.fc1(x)) # apply activation function after first fully connected layer
        x = F.relu(self.fc2(x)) # apply activation function after second fully connected layer
        x = self.fc3(x) # final output of the model
        return x

В этой реализации используются два сверточных слоя, два полносвязных слоя и функции активации ReLU. Метод forward определяет прямой проход модели и принимает входной тензор x и возвращает выходной тензор после прохождения его через слои модели. Выходной тензор имеет форму (batch_size, num_classes), где batch_size — количество выборок в пакете, а num_classes — количество классов для прогнозирования.

АлексНет

В 2012 году Алекс Крижевский, Илья Суцкевер и Джеффри Хинтон представили AlexNet, которая считается важной вехой в истории глубокого обучения. AlexNet стала первой моделью, победившей в конкурсе ImageNet Large Scale Visual Recognition Challenge (ILSVRC), и показала, что глубокие нейронные сети могут превзойти традиционные алгоритмы компьютерного зрения. AlexNet состоял из 8 слоев, включая 5 сверточных и 3 полносвязных слоя.

Вот реализация PyTorch архитектуры AlexNet.

import torch.nn as nn
import torch.nn.functional as F
class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 96, 11, stride=4, padding=2)
        self.pool1 = nn.MaxPool2d(3, stride=2)
        self.conv2 = nn.Conv2d(96, 256, 5, padding=2)
        self.pool2 = nn.MaxPool2d(3, stride=2)
        self.conv3 = nn.Conv2d(256, 384, 3, padding=1)
        self.conv4 = nn.Conv2d(384, 384, 3, padding=1)
        self.conv5 = nn.Conv2d(384, 256, 3, padding=1)
        self.pool3 = nn.MaxPool2d(3, stride=2)
        self.fc1 = nn.Linear(256 * 6 * 6, 4096)
        self.fc2 = nn.Linear(4096, 4096)
        self.fc3 = nn.Linear(4096, num_classes)
    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = self.pool1(x)
        x = F.relu(self.conv2(x))
        x = self.pool2(x)
        x = F.relu(self.conv3(x))
        x = F.relu(self.conv4(x))
        x = F.relu(self.conv5(x))
        x = self.pool3(x)
        x = x.view(x.shape[0], -1)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, 0.5)
        x = F.relu(self.fc2(x))
        x = F.dropout(x, 0.5)
        x = self.fc3(x)
        return x

Архитектура AlexNet состоит из пяти сверточных слоев, трех полносвязных слоев и двух слоев максимального пула. Функция активации ReLU используется после каждого сверточного и полносвязного слоя. Модель также использует отсев со скоростью 0,5, чтобы предотвратить переоснащение. Метод forward определяет прямой проход модели и принимает входной тензор x и возвращает выходной тензор после прохождения его через слои модели. Выходной тензор имеет форму (batch_size, num_classes), где batch_size — количество выборок в пакете, а num_classes — количество классов для прогнозирования.

VGGNet

В 2014 году Группа визуальной геометрии (VGG) Оксфордского университета представила VGGNet, которая стала первой моделью, использующей концепцию очень глубоких CNN. VGGNet состояла из 16 или 19 слоев, включая 13 или 16 сверточных слоев и 3 полносвязных слоя. VGGNet добилась самых современных результатов в различных тестах компьютерного зрения и вдохновила на создание многих последующих моделей.

from keras.applications import VGG16
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D

# Load the pre-trained VGG16 model
base_model = VGG16(weights='imagenet', include_top=False)

# Freeze the layers of the pre-trained model to prevent overfitting
for layer in base_model.layers:
    layer.trainable = False

# Add a global average pooling layer to reduce the dimensionality of the features
x = base_model.output
x = GlobalAveragePooling2D()(x)

# Add a fully connected layer with a softmax activation to perform classification
predictions = Dense(10, activation='softmax')(x)

# Build the final model
model = Model(inputs=base_model.input, outputs=predictions)

# Compile the model with a categorical crossentropy loss and an Adam optimizer
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Train the model on your data
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))

Обратите внимание, что этот код предполагает, что вы уже загрузили данные обучения и проверки (x_train, y_train, x_val, y_val) и установили количество классов в своей задаче классификации (10 в этом примере).

Реснет

В 2015 году Microsoft Research представила ResNet (Residual Network), которая считается прорывом в разработке очень глубоких CNN. ResNet ввел понятие остаточных соединений, что позволило модели обойти проблему исчезающих градиентов, с которой столкнулись при обучении очень глубоких сетей. ResNet состоял из 152 слоев и показал самые современные результаты в различных тестах компьютерного зрения.

from keras.applications import ResNet50
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D

# Load the pre-trained ResNet50 model
base_model = ResNet50(weights='imagenet', include_top=False)

# Freeze the layers of the pre-trained model to prevent overfitting
for layer in base_model.layers:
    layer.trainable = False

# Add a global average pooling layer to reduce the dimensionality of the features
x = base_model.output
x = GlobalAveragePooling2D()(x)

# Add a fully connected layer with a softmax activation to perform classification
predictions = Dense(10, activation='softmax')(x)

# Build the final model
model = Model(inputs=base_model.input, outputs=predictions)

# Compile the model with a categorical crossentropy loss and an Adam optimizer
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Train the model on your data
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))

Обратите внимание, что этот код предполагает, что вы уже загрузили данные обучения и проверки (x_train, y_train, x_val, y_val) и установили количество классов в своей задаче классификации (10 в этом примере).

Начало

В 2014 году Google представил Inception, семейство CNN, в которых использовалась концепция модулей Inception для достижения самых современных результатов в наборе данных ImageNet. Начальные модули объединили операции свертки и объединения в одном модуле, чтобы уменьшить количество параметров и вычислительные затраты. Начальные модели были очень популярны в сообществе глубокого обучения и использовались во многих приложениях компьютерного зрения.

from keras.applications import InceptionV3
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D

# Load the pre-trained InceptionV3 model
base_model = InceptionV3(weights='imagenet', include_top=False)

# Freeze the layers of the pre-trained model to prevent overfitting
for layer in base_model.layers:
    layer.trainable = False

# Add a global average pooling layer to reduce the dimensionality of the features
x = base_model.output
x = GlobalAveragePooling2D()(x)

# Add a fully connected layer with a softmax activation to perform classification
predictions = Dense(10, activation='softmax')(x)

# Build the final model
model = Model(inputs=base_model.input, outputs=predictions)

# Compile the model with a categorical crossentropy loss and an Adam optimizer
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Train the model on your data
model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))

Обратите внимание, что этот код предполагает, что вы уже загрузили данные обучения и проверки (x_train, y_train, x_val, y_val) и установили количество классов в своей задаче классификации (10 в этом примере).

Реализация PyTorch

Все эти модели могут быть реализованы на Python с использованием популярных библиотек глубокого обучения, таких как PyTorch. PyTorch предоставляет высокоуровневые API-интерфейсы для создания и обучения моделей глубокого обучения и упрощает реализацию этих моделей с нуля.

Присоединяйтесь к путешествию, чтобы открыть для себя нерассказанные истории, скрытые в данных, подпишитесь сейчас, чтобы быть в курсе последних идей и тенденций в мире науки о данных.