Автор|Д-Р ВАЙБХАВ КУМАР Компилировать|ВКонтакте Источник|Аналитика в Диамаге
Существует множество популярных вариантов искусственных нейронных сетей, которые можно использовать для решения задач обучения с учителем и без учителя. Автоэнкодеры также являются разновидностью нейронных сетей, которые в основном используются для решения задач обучения без учителя.
Когда у них есть несколько скрытых слоев в архитектуре, они называются глубокими автоэнкодерами. Эти модели могут применяться в различных приложениях, включая реконструкцию изображений.
При реконструкции изображения они изучают представление шаблона входного изображения и реконструируют новое изображение, которое соответствует шаблону исходного входного изображения. Реконструкция изображения имеет много важных применений, особенно в области медицины, где необходимо извлекать декодированные изображения без шума из существующих неполных или зашумленных изображений.
В этой статье мы продемонстрируем реализацию глубокого автоэнкодера в PyTorch для реконструкции изображений. Эта модель глубокого обучения будет обучаться на рукописных цифрах MNIST и восстанавливать изображения цифр после изучения представления входного изображения.
автоэнкодер
Автоэнкодеры — это варианты искусственных нейронных сетей, которые часто используются для обучения эффективному кодированию данных без присмотра.
Обычно они учатся по схеме обучения представлению, где изучают кодирование набора данных. Сеть восстанавливает входные данные очень похожим образом, изучая представление входных данных. Базовая структура автоэнкодера показана ниже.
Архитектура обычно включает входной слой, выходной слой и один или несколько скрытых слоев, соединяющих входной и выходной слои. Выходной слой имеет то же количество узлов, что и входной слой, потому что он восстанавливает входные данные.
В общем случае имеется только один скрытый слой, но в случае глубинных автоэнкодеров скрытых слоев несколько. Это увеличение глубины снижает вычислительные затраты на представление определенных функций, а также уменьшает объем обучающих данных, необходимых для изучения определенных функций. Области его применения включают обнаружение аномалий, обработку изображений, поиск информации, поиск лекарств и т. д.
Реализация глубоких автоэнкодеров в PyTorch
Сначала мы импортируем все необходимые библиотеки.
import os
import torch
import torchvision
import torch.nn as nn
import torchvision.transforms as transforms
import torch.optim as optim
import matplotlib.pyplot as plt
import torch.nn.functional as F
from torchvision import datasets
from torch.utils.data import DataLoader
from torchvision.utils import save_image
from PIL import Image
Теперь мы определим значения гиперпараметров.
Epochs = 100
Lr_Rate = 1e-3
Batch_Size = 128
Следующие функции будут использоваться для преобразований изображений, требуемых моделью PyTorch.
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
Используя приведенный ниже фрагмент кода, мы загрузим набор данных рукописных цифр MNIST и подготовим его для дальнейшей обработки.
train_set = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_set = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
train_loader = DataLoader(train_set, Batch_Size=Batch_Size, shuffle=True)
test_loader = DataLoader(test_set, Batch_Size=Batch_Size, shuffle=True)
Давайте посмотрим некоторую информацию об обучающих данных и их классах.
print(train_set)
print(train_set.classes)
На следующем шаге мы определим класс Autoencoder, используемый для определения модели.
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
#编码器
self.enc1 = nn.Linear(in_features=784, out_features=256) # Input image (28*28 = 784)
self.enc2 = nn.Linear(in_features=256, out_features=128)
self.enc3 = nn.Linear(in_features=128, out_features=64)
self.enc4 = nn.Linear(in_features=64, out_features=32)
self.enc5 = nn.Linear(in_features=32, out_features=16)
#解码器
self.dec1 = nn.Linear(in_features=16, out_features=32)
self.dec2 = nn.Linear(in_features=32, out_features=64)
self.dec3 = nn.Linear(in_features=64, out_features=128)
self.dec4 = nn.Linear(in_features=128, out_features=256)
self.dec5 = nn.Linear(in_features=256, out_features=784) # Output image (28*28 = 784)
def forward(self, x):
x = F.relu(self.enc1(x))
x = F.relu(self.enc2(x))
x = F.relu(self.enc3(x))
x = F.relu(self.enc4(x))
x = F.relu(self.enc5(x))
x = F.relu(self.dec1(x))
x = F.relu(self.dec2(x))
x = F.relu(self.dec3(x))
x = F.relu(self.dec4(x))
x = F.relu(self.dec5(x))
return x
Теперь мы создадим модель Autoencoder как объект класса Autoencoder, определенного выше.
model = Autoencoder()
print(model)
Теперь мы определим функцию потерь и метод оптимизации.
criterion = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=Lr_Rate)
Следующая функция активирует среду CUDA.
def get_device():
if torch.cuda.is_available():
device = 'cuda:0'
else:
device = 'cpu'
return device
Приведенная ниже функция создаст каталог для хранения результатов.
def make_dir():
image_dir = 'MNIST_Out_Images'
if not os.path.exists(image_dir):
os.makedirs(image_dir)
Используя функцию ниже, мы сохраним реконструированный образ, созданный моделью.
def save_decod_img(img, epoch):
img = img.view(img.size(0), 1, 28, 28)
save_image(img, './MNIST_Out_Images/Autoencoder_image{}.png'.format(epoch))
Функция ниже будет вызываться для обучения модели.
def training(model, train_loader, Epochs):
train_loss = []
for epoch in range(Epochs):
running_loss = 0.0
for data in train_loader:
img, _ = data
img = img.to(device)
img = img.view(img.size(0), -1)
optimizer.zero_grad()
outputs = model(img)
loss = criterion(outputs, img)
loss.backward()
optimizer.step()
running_loss += loss.item()
loss = running_loss / len(train_loader)
train_loss.append(loss)
print('Epoch {} of {}, Train Loss: {:.3f}'.format(
epoch+1, Epochs, loss))
if epoch % 5 == 0:
save_decod_img(outputs.cpu().data, epoch)
return train_loss
Следующая функция проверит реконструкцию изображения обученной модели.
def test_image_reconstruct(model, test_loader):
for batch in test_loader:
img, _ = batch
img = img.to(device)
img = img.view(img.size(0), -1)
outputs = model(img)
outputs = outputs.view(outputs.size(0), 1, 28, 28).cpu().data
save_image(outputs, 'MNIST_reconstruction.png')
break
Перед обучением модель будет помещена в среду CUDA, и будет создан каталог для хранения полученных изображений с использованием функций, определенных выше.
device = get_device()
model.to(device)
make_dir()
Теперь модель будет обучаться.
train_loss = training(model, train_loader, Epochs)
После успешного обучения мы будем визуализировать потери во время обучения.
plt.figure()
plt.plot(train_loss)
plt.title('Train Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.savefig('deep_ae_mnist_loss.png')
Мы будем визуализировать некоторые изображения, сохраненные во время обучения.
Image.open('/content/MNIST_Out_Images/Autoencoder_image0.png')
Image.open('/content/MNIST_Out_Images/Autoencoder_image50.png')
Image.open('/content/MNIST_Out_Images/Autoencoder_image95.png')
На последнем этапе мы проверим нашу модель автоэнкодера для восстановления изображения.
test_image_reconstruct(model, testloader)
Image.open('/content/MNIST_reconstruction.png')
Итак, мы видим, что с начала процесса обучения модель автоэнкодера начинает реконструировать изображения. После первой эпохи качество реконструкции не очень хорошее, и оно не улучшается до 50 эпох.
После полного обучения мы видим, что на изображениях, созданных после 95 эпох и тестирования, он может создавать изображения, которые точно соответствуют исходным входным изображениям.
По значению потерь мы можем знать, что эпоха может быть установлена на 100 или 200.
После длительного периода обучения ожидается получение более четких реконструированных изображений. Однако с помощью этой демонстрации мы можем понять, как реализовать глубокий автоэнкодер для реконструкции изображений в PyTorch.
использованная литература:
- Совит Ранджан Рат, «Реализация глубокого автоэнкодера в PyTorch»
- Абиен Фред Агарап, «Реализация автоэнкодера в PyTorch»
- Рейхане Аскари, «Авто кодировщики»
Оригинальная ссылка:аналитика Индия mag.com/Handan-on-so…