Эта статья находится в официальном руководстве по PyTorch: How to Build Neural Networks. Создайте простую нейронную сеть на основе torch.nn, подмодуля, предназначенного для построения нейронных сетей в PyTorch.
Запустите кодовую лабораторию для полного руководства
Нейронные сети состоят из слоев/модулей, которые выполняют операции с данными. torch.nn предоставляет все модули, необходимые для построения нейронных сетей.
Каждый модуль в PyTorch является подклассом nn.module. В следующих разделах мы построим нейронную сеть для классификации 10 категорий.
Создайте нейронную сеть
Нейронные сети состоят из слоев/модулей, которые выполняют операции с данными. torch.nn предоставляет все модули, необходимые для построения нейронных сетей. Каждый модуль в PyTorch является подклассом nn.module. В следующих разделах мы построим нейронную сеть для классификации 10 категорий.
import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
Загрузить тренировочное оборудование
Мы хотим иметь возможность обучать наши модели на аппаратных ускорителях, таких как графические процессоры. Вы можете использовать torch.cuda, чтобы определить, доступен ли графический процессор.
device = 'cuda' if torch.cuda.is_available() else 'cpu' #检测gpu是否可用,不可用使用cpu
print('Using {} device'.format(device)) #输出使用设备类型
определить класс
Определяем нейросеть через nn.Module и инициализируем нейросеть в __init__. Каждый подкласс nn.Module реализует операции над входными данными в прямом методе.
class NeuralNetwork(nn.Module):
def __init__(self): #定义网络结构
super(NeuralNetwork, self).__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
nn.ReLU()
)
def forward(self, x): #前向传播
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
Модель должна быть создана и перемещена в графический процессор, прежде чем ее можно будет использовать.
model = NeuralNetwork().to(device) #实例化模型
print(model)
Чтобы создать сложное нелинейное отображение между входом и выходом модели, требуется нелинейная функция активации.
Они вводят нелинейность после линейных преобразований, помогая нейронным сетям изучать широкий спектр сложных отображений. В этой модели мы используем nn.ReLU между линейными слоями, другие функции активации также могут использоваться для введения нелинейности.
X = torch.rand(1, 28, 28, device=device) #生成(1,28,28)的数据
logits = model(X) #向模型输入数据
pred_probab = nn.Softmax(dim=1)(logits) #调用softmax 将预测值映射为(0,1)间的概率
y_pred = pred_probab.argmax(1) #最大概率对应分类
print(f"Predicted class: {y_pred}")
Описание каждого слоя нейронной сети
Затем мы разбираем сеть, чтобы подробно описать функцию каждого слоя.
Для иллюстрации возьмем в сеть мини-партию из 3 образцов изображений размером 28x28.
input_image = torch.rand(3,28,28) #生成(3,28,28)的数据
print(input_image.size())
nn.Свести слой
Слой Flatten используется для того, чтобы сделать многомерные входные данные одномерными, что часто используется при переходе от сверточного слоя к полносвязному слою.
Слой nn.Flatten, который может преобразовывать каждое изображение 28x28 в 784 () непрерывный массив значений пикселей (пакетное измерение остается равным 3).
flatten = nn.Flatten()
flat_image = flatten(input_image) #(3,28,28)转换为(3,784)
print(flat_image.size())
nn.Линейный слой
Слой nn.Linear, линейный слой, представляет собой модуль, который линейно преобразует входные данные с использованием весов и смещений.
layer1 = nn.Linear(in_features=28*28, out_features=20) #输入(3,28*28) 输出(3,20)
hidden1 = layer1(flat_image)
print(hidden1.size())
слой nn.ReLU
Чтобы создать сложное нелинейное отображение между входом и выходом модели, требуется нелинейная функция активации. Они вводят нелинейность после линейных преобразований, помогая нейронным сетям изучать широкий спектр сложных отображений.
В этой модели мы используем nn.ReLU между линейными слоями, другие функции активации также могут использоваться для введения нелинейности.
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
nn.Последовательный слой
Последний линейный слой нейронной сети возвращает логиты, т.е. диапазон значений междуисходное значение в . После того, как эти значения передаются модулю nn.Softmax, логит масштабируется доВ интервале он представляет прогнозируемую вероятность модели для каждого класса.
Параметр dim указывает позицию, в которой выполняется операция в каждом измерении, а результат операции прибавляется к 1.
softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)
структура выходной модели
Многие слои в нейронной сети параметризованы, т. е. имеют связанные веса и смещения, которые итеративно оптимизируются во время обучения.
Подклассы nn.Module автоматически отслеживают все поля, определенные внутри объекта модели, и используют методы модели parameters() или named_parameters() для доступа ко всем параметрам.
Мы можем перебирать каждый параметр модели и выводить его размер и значение.
print("Model structure: ", model, "\n\n")
for name, param in model.named_parameters():
print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")
конечный результатДоступ к полному руководству