深度学习的图像生成

news/2025/2/10 9:09:10/

以下将分别使用 PyTorch 和 TensorFlow 实现基于深度学习的图像生成,这里主要介绍生成对抗网络(GAN)和变分自编码器(VAE)两种经典模型。

使用 PyTorch 实现简单的 GAN 进行图像生成

1. 安装必要的库
pip install torch torchvision numpy matplotlib
2. 代码实现
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.datasets as datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np# 定义超参数
batch_size = 64
lr = 0.0002
num_epochs = 5
latent_dim = 100
image_size = 64# 数据加载和预处理
transform = transforms.Compose([transforms.Resize(image_size),transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])dataset = datasets.MNIST(root='./data', train=True,download=True, transform=transform)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size,shuffle=True)# 定义生成器
class Generator(nn.Module):def __init__(self):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(latent_dim, 256),nn.LeakyReLU(0.2),nn.Linear(256, 512),nn.LeakyReLU(0.2),nn.Linear(512, image_size * image_size),nn.Tanh())def forward(self, z):img = self.model(z)img = img.view(img.size(0), 1, image_size, image_size)return img# 定义判别器
class Discriminator(nn.Module):def __init__(self):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(image_size * image_size, 512),nn.LeakyReLU(0.2),nn.Linear(512, 256),nn.LeakyReLU(0.2),nn.Linear(256, 1),nn.Sigmoid())def forward(self, img):img_flat = img.view(img.size(0), -1)validity = self.model(img_flat)return validity# 初始化生成器和判别器
generator = Generator()
discriminator = Discriminator()# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer_G = optim.Adam(generator.parameters(), lr=lr)
optimizer_D = optim.Adam(discriminator.parameters(), lr=lr)# 训练模型
for epoch in range(num_epochs):for i, (real_images, _) in enumerate(dataloader):# 训练判别器optimizer_D.zero_grad()real_labels = torch.ones(real_images.size(0), 1)fake_labels = torch.zeros(real_images.size(0), 1)# 计算判别器对真实图像的损失real_output = discriminator(real_images)d_real_loss = criterion(real_output, real_labels)# 生成假图像z = torch.randn(real_images.size(0), latent_dim)fake_images = generator(z)# 计算判别器对假图像的损失fake_output = discriminator(fake_images.detach())d_fake_loss = criterion(fake_output, fake_labels)# 总判别器损失d_loss = d_real_loss + d_fake_lossd_loss.backward()optimizer_D.step()# 训练生成器optimizer_G.zero_grad()fake_output = discriminator(fake_images)g_loss = criterion(fake_output, real_labels)g_loss.backward()optimizer_G.step()print(f'Epoch [{epoch + 1}/{num_epochs}], D_loss: {d_loss.item():.4f}, G_loss: {g_loss.item():.4f}')# 生成一些图像进行可视化
z = torch.randn(16, latent_dim)
generated_images = generator(z).detach().cpu()fig, axes = plt.subplots(4, 4, figsize=(4, 4))
for i in range(4):for j in range(4):axes[i, j].imshow(generated_images[i * 4 + j].squeeze(0), cmap='gray')axes[i, j].axis('off')
plt.show()
3. 代码解释
  • 数据加载和预处理:使用 torchvision 加载 MNIST 数据集,并进行图像大小调整、归一化等预处理操作。
  • 生成器和判别器
    • 生成器接收一个随机噪声向量,通过全连接层生成图像。
    • 判别器接收图像,判断其是真实图像还是生成的假图像。
  • 训练过程
    • 交替训练判别器和生成器,判别器的目标是正确区分真实图像和假图像,生成器的目标是生成能够欺骗判别器的假图像。
  • 可视化:训练完成后,生成一些图像并进行可视化展示。

使用 TensorFlow 实现简单的 VAE 进行图像生成

1. 安装必要的库
pip install tensorflow numpy matplotlib
2. 代码实现
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt# 加载 MNIST 数据集
(train_images, _), (_, _) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
train_images /= 255.# 定义超参数
latent_dim = 2
batch_size = 128
epochs = 50# 定义编码器
class Sampling(layers.Layer):def call(self, inputs):z_mean, z_log_var = inputsbatch = tf.shape(z_mean)[0]dim = tf.shape(z_mean)[1]epsilon = tf.keras.backend.random_normal(shape=(batch, dim))return z_mean + tf.exp(0.5 * z_log_var) * epsilonencoder_inputs = tf.keras.Input(shape=(28, 28, 1))
x = layers.Conv2D(32, 3, activation='relu', strides=2, padding='same')(encoder_inputs)
x = layers.Conv2D(64, 3, activation='relu', strides=2, padding='same')(x)
x = layers.Flatten()(x)
x = layers.Dense(256, activation='relu')(x)
z_mean = layers.Dense(latent_dim, name='z_mean')(x)
z_log_var = layers.Dense(latent_dim, name='z_log_var')(x)
z = Sampling()([z_mean, z_log_var])encoder = tf.keras.Model(encoder_inputs, [z_mean, z_log_var, z], name='encoder')# 定义解码器
decoder_inputs = tf.keras.Input(shape=(latent_dim,))
x = layers.Dense(7 * 7 * 64, activation='relu')(decoder_inputs)
x = layers.Reshape((7, 7, 64))(x)
x = layers.Conv2DTranspose(64, 3, activation='relu', strides=2, padding='same')(x)
x = layers.Conv2DTranspose(32, 3, activation='relu', strides=2, padding='same')(x)
decoder_outputs = layers.Conv2DTranspose(1, 3, activation='sigmoid', padding='same')(x)decoder = tf.keras.Model(decoder_inputs, decoder_outputs, name='decoder')# 定义 VAE 模型
outputs = decoder(encoder(encoder_inputs)[2])
vae = tf.keras.Model(encoder_inputs, outputs, name='vae')# 定义损失函数
reconstruction_loss = tf.keras.losses.binary_crossentropy(encoder_inputs, outputs)
reconstruction_loss = tf.reduce_sum(reconstruction_loss, axis=[1, 2, 3])
kl_loss = -0.5 * (1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var))
kl_loss = tf.reduce_sum(kl_loss, axis=1)
vae_loss = tf.reduce_mean(reconstruction_loss + kl_loss)vae.add_loss(vae_loss)
vae.compile(optimizer='adam')# 训练模型
vae.fit(train_images, epochs=epochs, batch_size=batch_size)# 生成一些图像进行可视化
n = 15
digit_size = 28
figure = np.zeros((digit_size * n, digit_size * n))
grid_x = np.linspace(-4, 4, n)
grid_y = np.linspace(-4, 4, n)[::-1]for i, yi in enumerate(grid_y):for j, xi in enumerate(grid_x):z_sample = np.array([[xi, yi]])x_decoded = decoder.predict(z_sample)digit = x_decoded[0].reshape(digit_size, digit_size)figure[i * digit_size: (i + 1) * digit_size,j * digit_size: (j + 1) * digit_size] = digitplt.figure(figsize=(10, 10))
plt.imshow(figure, cmap='Greys_r')
plt.axis('off')
plt.show()
3. 代码解释
  • 数据加载和预处理:加载 MNIST 数据集,并将图像像素值归一化到 [0, 1] 范围。
  • 编码器和解码器
    • 编码器将输入图像编码为均值和方差,然后通过采样层生成潜在变量。
    • 解码器将潜在变量解码为图像。
  • VAE 模型:将编码器和解码器组合成 VAE 模型,并定义了重构损失和 KL 散度损失。
  • 训练过程:使用 Adam 优化器训练 VAE 模型。
  • 可视化:训练完成后,在潜在空间中采样生成一些图像并进行可视化展示。

注意事项

  • 训练深度学习模型需要一定的计算资源,建议在 GPU 上运行以提高训练速度。
  • 可以尝试调整超参数和模型结构,以获得更好的图像生成效果。

http://www.ppmy.cn/news/1570818.html

相关文章

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目,新建 2.新建目录 3.选择目标机器,直接搜索at89c52选择,然后点击OK 4.是否添加起吊文件,一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键,添加…

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表,它只能在固定的一端(栈顶)进行出栈、压栈操作,具有后进先出的特点。 2、栈概念的例题 答案为 C,以C为例进行讲解: 第一个出栈的是3,那么 1、…

Linux 创建进程 fork()、vfork() 与进程管理

Linux 创建进程 fork、vfork、进程管理 一、Linux的0号、1号、2号进程二、Linux的进程标识三、fork() 函数1、基本概念2、函数特点3、用法以及应用场景(1)父子进程执行不同的代码(2)进程执行另一个程序 4、工作原理 四、vfork() 函…

个人毕业设计--基于HarmonyOS的旅行助手APP的设计与实现(挖坑)

在行业混了短短几年,却总感觉越混越迷茫,趁着还有心情学习,把当初API9 的毕业设计项目改成API13的项目。先占个坑,把当初毕业设计的文案搬过来 摘要:HarmonyOS(鸿蒙系统)是华为公司推出的面向全…

Spring Boot整合DeepSeek实现AI对话

本篇博文会分为DeepSeek开放平台上的API,以及本地私有化部署DeepSeek R1模型两种方式来整合使用,本地化私有部署可以参考这篇博文:DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型 Spring AI Spring AI 是由 Spring(一个广…

我们来学人工智能 -- 将Ollama已下载的模型从C盘迁出

题记 未配置OLLAMA_MODELS系统变量导致模型下载到了C盘 迁移步骤 退出ollama 配置OLLAMA_MODELS系统变量 OLLAMA_MODELS:D:\ollama\models 直接将C盘下的models目录剪切到指定目录 检查 cmd命令窗口退出重新打开

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

基于深度学习的人工智能量化衰老模型构建与全流程应用研究

一、引言 1.1 研究背景与意义 1.1.1 人口老龄化现状与挑战 人口老龄化是当今全球面临的重要社会趋势之一,其发展态势迅猛且影响深远。根据联合国的相关数据,1980 年,全球 65 岁及以上人口数量仅为 2.6 亿,到 2021 年,这一数字已翻番,达到 7.61 亿,而预计到 2050 年,…