您的位置:首页 > 新闻 > 会展 > 灯具设计网站推荐_企业专业建站_商业网站_网络营销知识

灯具设计网站推荐_企业专业建站_商业网站_网络营销知识

2025/2/25 4:14:35 来源:https://blog.csdn.net/testManger/article/details/145536690  浏览:    关键词:灯具设计网站推荐_企业专业建站_商业网站_网络营销知识
灯具设计网站推荐_企业专业建站_商业网站_网络营销知识

以下将分别使用 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 上运行以提高训练速度。
  • 可以尝试调整超参数和模型结构,以获得更好的图像生成效果。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com