import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# Define the autoencoder architecture
class Autoencoder(nn.Module):
def __init__(self):
super(Autoencoder, self).__init__()
self.encoder = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Conv2d(16, 8, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2)
)
self.decoder = nn.Sequential(
nn.ConvTranspose2d(8, 16,
kernel_size=3,
stride=2,
padding=1,
output_padding=1),
nn.ReLU(),
nn.ConvTranspose2d(16, 3,
kernel_size=3,
stride=2,
padding=1,
output_padding=1),
nn.Sigmoid()
)
def forward(self, x):
x = self.encoder(x)
x = self.decoder(x)
return x
# Initialize the autoencoder
model = Autoencoder()
# Define transform
transform = transforms.Compose([
transforms.Resize((64, 64)),
transforms.ToTensor(),
])
# Load dataset
train_dataset = datasets.Flowers102(root='flowers',
split='train',
transform=transform,
download=True)
test_dataset = datasets.Flowers102(root='flowers',
split='test',
transform=transform)
# Define the dataloader
train_loader = torch.utils.data.DataLoader(dataset=train_dataset,
batch_size=128,
shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset,
batch_size=128)
# Move the model to GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
model.to(device)
# Define the loss function and optimizer
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# Train the autoencoder
num_epochs = 50
for epoch in range(num_epochs):
for data in train_loader:
img, _ = data
img = img.to(device)
optimizer.zero_grad()
output = model(img)
loss = criterion(output, img)
loss.backward()
optimizer.step()
if epoch % 5== 0:
print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
# Save the model
torch.save(model.state_dict(), 'conv_autoencoder.pth')