pytorch GAN生成对抗网络实例

GAN(Generative Adversarial Networks)是一种深度学习模型,用于生成与训练数据相似的新数据。在PyTorch中,我们可以使用GAN来生成图像、音频等数据。以下是使用PyTorch实现GAN的完整攻略,包括两个示例说明。

1. 实现简单的GAN

以下是使用PyTorch实现简单的GAN的步骤:

  1. 导入必要的库

python
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

  1. 定义生成器和判别器

```python
# 定义生成器
class Generator(nn.Module):
def init(self):
super(Generator, self).init()
self.fc1 = nn.Linear(100, 128)
self.fc2 = nn.Linear(128, 784)

   def forward(self, x):
       x = torch.relu(self.fc1(x))
       x = torch.sigmoid(self.fc2(x))
       return x

# 定义判别器
class Discriminator(nn.Module):
def init(self):
super(Discriminator, self).init()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 1)

   def forward(self, x):
       x = torch.relu(self.fc1(x))
       x = torch.sigmoid(self.fc2(x))
       return x

```

  1. 定义训练函数

```python
def train(num_epochs, batch_size, learning_rate):
# 加载数据
train_loader = torch.utils.data.DataLoader(
dataset=torchvision.datasets.MNIST(root='./data', train=True, transform=torchvision.transforms.ToTensor(), download=True),
batch_size=batch_size, shuffle=True)

   # 初始化生成器和判别器
   G = Generator()
   D = Discriminator()

   # 定义损失函数和优化器
   criterion = nn.BCELoss()
   optimizer_G = torch.optim.Adam(G.parameters(), lr=learning_rate)
   optimizer_D = torch.optim.Adam(D.parameters(), lr=learning_rate)

   # 训练模型
   for epoch in range(num_epochs):
       for i, (images, _) in enumerate(train_loader):
           # 训练判别器
           real_labels = torch.ones(batch_size, 1)
           fake_labels = torch.zeros(batch_size, 1)

           # 计算判别器对真实数据的损失
           outputs = D(images.view(batch_size, -1))
           d_loss_real = criterion(outputs, real_labels)

           # 计算判别器对生成数据的损失
           z = torch.randn(batch_size, 100)
           fake_images = G(z)
           outputs = D(fake_images)
           d_loss_fake = criterion(outputs, fake_labels)

           # 计算判别器总损失
           d_loss = d_loss_real + d_loss_fake

           # 反向传播和优化
           optimizer_D.zero_grad()
           d_loss.backward()
           optimizer_D.step()

           # 训练生成器
           z = torch.randn(batch_size, 100)
           fake_images = G(z)
           outputs = D(fake_images)
           g_loss = criterion(outputs, real_labels)

           # 反向传播和优化
           optimizer_G.zero_grad()
           g_loss.backward()
           optimizer_G.step()

       # 打印损失
       print('Epoch [{}/{}], d_loss: {:.4f}, g_loss: {:.4f}'
             .format(epoch+1, num_epochs, d_loss.item(), g_loss.item()))

   # 保存模型
   torch.save(G.state_dict(), 'G.ckpt')
   torch.save(D.state_dict(), 'D.ckpt')

```

  1. 训练模型并生成图像

```python
# 训练模型
train(num_epochs=200, batch_size=100, learning_rate=0.0002)

# 加载模型
G = Generator()
G.load_state_dict(torch.load('G.ckpt'))

# 生成图像
z = torch.randn(10, 100)
fake_images = G(z)
for i in range(10):
plt.imshow(fake_images[i].detach().numpy().reshape(28, 28), cmap='gray')
plt.show()
```

运行上述代码,即可训练GAN并生成图像。

2. 实现DCGAN

DCGAN(Deep Convolutional Generative Adversarial Networks)是一种使用卷积神经网络的GAN模型,用于生成更高质量的图像。以下是使用PyTorch实现DCGAN的步骤:

  1. 导入必要的库

python
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

  1. 定义生成器和判别器

```python
# 定义生成器
class Generator(nn.Module):
def init(self):
super(Generator, self).init()
self.fc1 = nn.Linear(100, 77256)
self.conv1 = nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, output_padding=1)
self.bn1 = nn.BatchNorm2d(128)
self.conv2 = nn.ConvTranspose2d(128, 64, kernel_size=3, stride=1, padding=1)
self.bn2 = nn.BatchNorm2d(64)
self.conv3 = nn.ConvTranspose2d(64, 1, kernel_size=3, stride=2, padding=1, output_padding=1)

   def forward(self, x):
       x = torch.relu(self.fc1(x))
       x = x.view(-1, 256, 7, 7)
       x = torch.relu(self.bn1(self.conv1(x)))
       x = torch.relu(self.bn2(self.conv2(x)))
       x = torch.sigmoid(self.conv3(x))
       return x

# 定义判别器
class Discriminator(nn.Module):
def init(self):
super(Discriminator, self).init()
self.conv1 = nn.Conv2d(1, 64, kernel_size=3, stride=2, padding=1)
self.conv2 = nn.Conv2d(64, 128, kernel_size=3, stride=2, padding=1)
self.bn2 = nn.BatchNorm2d(128)
self.conv3 = nn.Conv2d(128, 256, kernel_size=3, stride=2, padding=1)
self.bn3 = nn.BatchNorm2d(256)
self.fc1 = nn.Linear(25644, 1)

   def forward(self, x):
       x = torch.relu(self.conv1(x))
       x = torch.relu(self.bn2(self.conv2(x)))
       x = torch.relu(self.bn3(self.conv3(x)))
       x = x.view(-1, 256*4*4)
       x = torch.sigmoid(self.fc1(x))
       return x

```

  1. 定义训练函数

```python
def train(num_epochs, batch_size, learning_rate):
# 加载数据
transform = torchvision.transforms.Compose([
torchvision.transforms.Resize(64),
torchvision.transforms.ToTensor(),
torchvision.transforms.Normalize((0.5,), (0.5,))
])
train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

   # 初始化生成器和判别器
   G = Generator()
   D = Discriminator()

   # 定义损失函数和优化器
   criterion = nn.BCELoss()
   optimizer_G = torch.optim.Adam(G.parameters(), lr=learning_rate, betas=(0.5, 0.999))
   optimizer_D = torch.optim.Adam(D.parameters(), lr=learning_rate, betas=(0.5, 0.999))

   # 训练模型
   for epoch in range(num_epochs):
       for i, (images, _) in enumerate(train_loader):
           # 训练判别器
           real_labels = torch.ones(batch_size, 1)
           fake_labels = torch.zeros(batch_size, 1)

           # 计算判别器对真实数据的损失
           outputs = D(images)
           d_loss_real = criterion(outputs, real_labels)

           # 计算判别器对生成数据的损失
           z = torch.randn(batch_size, 100)
           fake_images = G(z)
           outputs = D(fake_images.detach())
           d_loss_fake = criterion(outputs, fake_labels)

           # 计算判别器总损失
           d_loss = d_loss_real + d_loss_fake

           # 反向传播和优化
           optimizer_D.zero_grad()
           d_loss.backward()
           optimizer_D.step()

           # 训练生成器
           z = torch.randn(batch_size, 100)
           fake_images = G(z)
           outputs = D(fake_images)
           g_loss = criterion(outputs, real_labels)

           # 反向传播和优化
           optimizer_G.zero_grad()
           g_loss.backward()
           optimizer_G.step()

       # 打印损失
       print('Epoch [{}/{}], d_loss: {:.4f}, g_loss: {:.4f}'
             .format(epoch+1, num_epochs, d_loss.item(), g_loss.item()))

   # 保存模型
   torch.save(G.state_dict(), 'G.ckpt')
   torch.save(D.state_dict(), 'D.ckpt')

```

  1. 训练模型并生成图像

```python
# 训练模型
train(num_epochs=200, batch_size=64, learning_rate=0.0002)

# 加载模型
G = Generator()
G.load_state_dict(torch.load('G.ckpt'))

# 生成图像
z = torch.randn(10, 100)
fake_images = G(z)
for i in range(10):
plt.imshow(fake_images[i].detach().numpy().reshape(64, 64), cmap='gray')
plt.show()
```

运行上述代码,即可训练DCGAN并生成图像。

以上就是使用PyTorch实现GAN和DCGAN的完整攻略,包括两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch GAN生成对抗网络实例 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • pytorch部署到jupyter中的问题及解决方案

    PyTorch部署到Jupyter中的问题及解决方案 在使用PyTorch进行深度学习开发时,我们通常会使用Jupyter Notebook进行代码编写和调试。然而,在将PyTorch部署到Jupyter中时,可能会遇到一些问题。本文将介绍一些常见的问题及其解决方案,并演示两个示例。 示例一:PyTorch无法在Jupyter中使用GPU 在Jupyter中…

    PyTorch 2023年5月15日
    00
  • [python][pytorch]多GPU下的模型保存与加载

    说明 在模型训练的时候,往往使用的是多GPU的环境;但是在模型验证或者推理阶段,往往使用单GPU甚至CPU进行运算。那么中间有个保存和加载的过程。下面来总结一下。 多GPU进行训练 首先设置可见的GPU数量,有两种方式可以声明: 在shell脚本中声明: export CUDA_VISIBLE_DEVICES=0,1,2,3 在py文件中声明 os.envi…

    PyTorch 2023年4月8日
    00
  • pytorch 3 activation 激活函数

    2.3 Activation Function import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.pyplot as plt # fake data x = torch.linspace(-5, 5, 200) …

    2023年4月8日
    00
  • Pytorch关于Dataset 的数据处理

    PyTorch关于Dataset的数据处理 在PyTorch中,Dataset是一个抽象类,用于表示数据集。它提供了一种统一的方式来处理数据,使得我们可以轻松地加载和处理数据。在本文中,我们将详细介绍如何使用PyTorch中的Dataset类来处理数据,并提供两个示例来说明其用法。 1. 创建自定义Dataset 要创建自定义Dataset,需要继承PyTo…

    PyTorch 2023年5月15日
    00
  • Pytorch中.new()的作用详解

    PyTorch中.new()的作用详解 在PyTorch中,.new()是一个非常有用的方法,它可以用来创建一个新的Tensor,同时可以指定新Tensor的形状、数据类型、设备等属性。本文将详细介绍.new()的用法和示例。 1. .new()的基本用法 .new()的基本用法如下: new_tensor = tensor.new(size=None, d…

    PyTorch 2023年5月15日
    00
  • 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码

    PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉、自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen NLP,用于概率图模型的Pyro,扩展了PyTorch的功能。通过学习《深度学习入门之PyTorch》,可以从机器学习和深度学习的基础理论入手,从零开始学习 Py…

    PyTorch 2023年4月7日
    00
  • ubuntu16.04安装Anaconda+Pycharm+Pytorch

    1.更新驱动 (1)查看驱动版本  1 ubuntu-drivers devices    (2)安装对应的驱动  1 sudo apt install nvidia-430 已经安装过了,若未安装,会进行安装.  参考:https://zhuanlan.zhihu.com/p/59618999 2.安装Anaconda  https://www.anaco…

    2023年4月8日
    00
  • new_zeros() pytorch版本的转换方式

    PyTorch中new_zeros()函数的用法 new_zeros()是PyTorch中的一个函数,用于创建一个指定形状的全零张量。以下是new_zeros()函数的用法: torch.Tensor.new_zeros(size, dtype=None, device=None, requires_grad=False) 其中,size是张量的形状,dty…

    PyTorch 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部