Pas encore de compte ?
L'encodeur automatique linéaire se compose uniquement de couches linéaires.
Construisons un encodeur automatique simple pour MNIST dans PyTorch où l'encodeur et le décodeur sont constitués d'une couche linéaire.
Tout d'abord, les données sont transmises à un encodeur qui crée une représentation compressée de l'entrée.
Ensuite, cette représentation est passée à travers un décodeur pour reconstruire les données d'entrée.
Testé sous Anaconda et Python 3.7
import torch.nn as nn import torch.nn.functional as F class Autoencoder(nn.Module): def __init__(self, encoding_dim): super(Autoencoder, self).__init__() ## Encoder ## # linear layer (784 -> encoding_dim) self.fc1 = nn.Linear(28 * 28, encoding_dim) ## Decoder ## # linear layer (encoding_dim -> input size) self.fc2 = nn.Linear(encoding_dim, 28*28) def forward(self, x): x = F.relu(self.fc1(x)) # output layer (sigmoid for scaling from 0 to 1) x = F.sigmoid(self.fc2(x)) return x encoding_dim = 32 model = Autoencoder(encoding_dim) import torch import numpy as np from torchvision import datasets import torchvision.transforms as transforms from matplotlib import pyplot as plt # load the training and test datasets train_data = datasets.MNIST(root='data', train=True, download=True, transform=transforms.ToTensor()) test_data = datasets.MNIST(root='data', train=False, download=True, transform=transforms.ToTensor()) batch_size = 20 train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size) test_loader = torch.utils.data.DataLoader(test_data, batch_size=batch_size) # loss function criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) n_epochs = 20 for epoch in range(1, n_epochs+1): train_loss = 0.0 for data in train_loader: images, labels = data # flatten images images = images.view(images.size(0), -1) optimizer.zero_grad() # forward pass outputs = model(images) # calculate the loss loss = criterion(outputs, images) # backward pass + optimization loss.backward() optimizer.step() # update running training loss train_loss += loss.item()*images.size(0) # print avg training statistics train_loss = train_loss/len(train_loader) print('Epoch: {} \tTraining Loss: {:.6f}'.format( epoch, train_loss)) dataiter = iter(test_loader) images, labels = dataiter.next() images_flatten = images.view(images.size(0), -1) # get sample outputs output = model(images_flatten) images = images.numpy() output = output.view(batch_size, 1, 28, 28) output = output.detach().numpy() # plot the first ten input images and then reconstructed images fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(25,4)) for images, row in zip([images, output], axes): for img, ax in zip(images, row): ax.imshow(np.squeeze(img), cmap='gray') ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False)
Source : https://iq.opengenus.org/autoencoder/
Bienvenu, je m’appelle Eric Soupet et je suis l'administrateur du site elodees.com. elodees.com est un état de l'art de l'Intelligence Artificielle et se veut collaboratif, vous pouvez dès à présent proposer du contenu tels que des articles, des événements, des tutoriels, ... alors n'hésitez pas !
Crédit des images de la plate-forme : Pixabay - Pixabay License | Pexels - Pexels License