• Implement GAN from scratch


    GANs from Scratch 1: A deep introduction. With code in PyTorch and TensorFlow

    修改文章代码中的错误后的代码如下:

    import torch
    from torch import nn, optim
    from torch.autograd.variable import Variable
    from torchvision import transforms, datasets
    import matplotlib.pyplot as plt
    
    DATA_FOLDER = 'D:/WorkSpace/Data/torchvision_data'
    
    def mnist_data():
        compose = transforms.Compose(
            [transforms.ToTensor(),
             # transforms.Normalize((.5, .5, .5), (.5, .5, .5))
             transforms.Normalize([0.5], [0.5]) # MNIST只有一个通道
            ])
        return datasets.MNIST(root=DATA_FOLDER, train=True, transform=compose)
    
    # Load data
    data = mnist_data()
    # Create loader with data, so that we can iterate over it
    data_loader = torch.utils.data.DataLoader(data, batch_size=64, shuffle=True)
    # Num batches
    num_batches = len(data_loader)
    
    
    class DiscriminatorNet(torch.nn.Module):
        """
        A three hidden-layer discriminative neural network
        """
    
        def __init__(self):
            super(DiscriminatorNet, self).__init__()
            n_features = 784
            n_out = 1
    
            self.hidden0 = nn.Sequential(
                nn.Linear(n_features, 1024),
                nn.LeakyReLU(0.2),
                nn.Dropout(0.3)
            )
            self.hidden1 = nn.Sequential(
                nn.Linear(1024, 512),
                nn.LeakyReLU(0.2),
                nn.Dropout(0.3)
            )
            self.hidden2 = nn.Sequential(
                nn.Linear(512, 256),
                nn.LeakyReLU(0.2),
                nn.Dropout(0.3)
            )
            self.out = nn.Sequential(
                torch.nn.Linear(256, n_out),
                torch.nn.Sigmoid()
            )
    
        def forward(self, x):
            x = self.hidden0(x)
            x = self.hidden1(x)
            x = self.hidden2(x)
            x = self.out(x)
            return x
    
    
    def images_to_vectors(images):
        return images.view(images.size(0), 784)
    
    
    def vectors_to_images(vectors):
        return vectors.view(vectors.size(0), 1, 28, 28)
    
    
    class GeneratorNet(torch.nn.Module):
        """
        A three hidden-layer generative neural network
        """
    
        def __init__(self):
            super(GeneratorNet, self).__init__()
            n_features = 100
            n_out = 784
    
            self.hidden0 = nn.Sequential(
                nn.Linear(n_features, 256),
                nn.LeakyReLU(0.2)
            )
            self.hidden1 = nn.Sequential(
                nn.Linear(256, 512),
                nn.LeakyReLU(0.2)
            )
            self.hidden2 = nn.Sequential(
                nn.Linear(512, 1024),
                nn.LeakyReLU(0.2)
            )
    
            self.out = nn.Sequential(
                nn.Linear(1024, n_out),
                nn.Tanh()
            )
    
        def forward(self, x):
            x = self.hidden0(x)
            x = self.hidden1(x)
            x = self.hidden2(x)
            x = self.out(x)
            return x
    
    
    # Noise
    def noise(size):
        n = Variable(torch.randn(size, 100))
        if torch.cuda.is_available(): return n.cuda()
        return n
    
    discriminator = DiscriminatorNet()
    generator = GeneratorNet()
    if torch.cuda.is_available():
        discriminator.cuda()
        generator.cuda()
    
    # Optimizers
    d_optimizer = optim.Adam(discriminator.parameters(), lr=0.0002)
    g_optimizer = optim.Adam(generator.parameters(), lr=0.0002)
    
    # Loss function
    loss = nn.BCELoss()
    
    # Number of steps to apply to the discriminator
    d_steps = 1  # In Goodfellow et. al 2014 this variable is assigned to 1
    # Number of epochs
    num_epochs = 200
    
    def real_data_target(size):
        '''
        Tensor containing ones, with shape = size
        '''
        data = Variable(torch.ones(size, 1))
        if torch.cuda.is_available(): return data.cuda()
        return data
    
    def fake_data_target(size):
        '''
        Tensor containing zeros, with shape = size
        '''
        data = Variable(torch.zeros(size, 1))
        if torch.cuda.is_available(): return data.cuda()
        return data
    
    
    def train_discriminator(optimizer, real_data, fake_data):
        # Reset gradients
        optimizer.zero_grad()
    
        # 1.1 Train on Real Data
        prediction_real = discriminator(real_data)
        # Calculate error and backpropagate
        error_real = loss(prediction_real, real_data_target(real_data.size(0)))
        error_real.backward()
    
        # 1.2 Train on Fake Data
        prediction_fake = discriminator(fake_data)
        # Calculate error and backpropagate
        error_fake = loss(prediction_fake, fake_data_target(real_data.size(0)))
        error_fake.backward()
    
        # 1.3 Update weights with gradients
        optimizer.step()
    
        # Return error
        return error_real + error_fake, prediction_real, prediction_fake
    
    
    def train_generator(optimizer, fake_data):
        # 2. Train Generator
        # Reset gradients
        optimizer.zero_grad()
        # Sample noise and generate fake data
        prediction = discriminator(fake_data)
        # Calculate error and backpropagate
        error = loss(prediction, real_data_target(prediction.size(0)))
        error.backward()
        # Update weights with gradients
        optimizer.step()
        # Return error
        return error
    
    num_test_samples = 16
    test_noise = noise(num_test_samples)
    
    for epoch in range(num_epochs):
        for n_batch, (real_batch,_) in enumerate(data_loader):
    
            # 1. Train Discriminator
            real_data = Variable(images_to_vectors(real_batch))
            if torch.cuda.is_available(): real_data = real_data.cuda()
            # Generate fake data
            fake_data = generator(noise(real_data.size(0))).detach()
            # Train D
            d_error, d_pred_real, d_pred_fake = train_discriminator(d_optimizer,
                                                                    real_data, fake_data)
    
            # 2. Train Generator
            # Generate fake data
            fake_data = generator(noise(real_batch.size(0)))
            # Train G
            g_error = train_generator(g_optimizer, fake_data)
    
            # Display Progress
        print('epoch ', epoch, ': ','d_error is ', d_error, 'g_error is ', g_error)
        if (epoch) % 20 == 0:
            test_images = vectors_to_images(generator(test_noise)).data.cpu()
            fig = plt.figure()
            for i in range(len(test_images)):
                ax = fig.add_subplot(4, 4, i+1)
                ax.imshow(test_images[i][0], cmap=plt.cm.gray)
            plt.show()
    
  • 相关阅读:
    spark机器学习从0到1主成分分析-PCA (八)
    spark机器学习从0到1奇异值分解-SVD (七)
    spark机器学习从0到1决策树(六)
    spark机器学习从0到1支持向量机SVM(五)
    spark机器学习从0到1逻辑斯蒂回归之(四)
    spark机器学习从0到1基本的统计工具之(三)
    spark机器学习从0到1基本数据类型之(二)
    spark机器学习从0到1介绍入门之(一)
    python之感知器-从零开始学深度学习
    机器学习算法及代码实现–支持向量机
  • 原文地址:https://www.cnblogs.com/ZeroTensor/p/10851877.html
Copyright © 2020-2023  润新知