首页 > 编程问答 >生成 512x512 照片的模型

生成 512x512 照片的模型

时间:2024-08-05 16:01:34浏览次数:12  
标签:python tensorflow machine-learning deep-learning generative-adversarial-network

我怎样才能让这个模型生成 512x512 像素或更大的图像?现在它生成 64x64px 图像。我尝试更改模型中的一些值,但没有成功。这些卷积层(尤其是 Conv2D 和 Conv2DTranspose)如何工作?我不明白如何在这些层中调整图像的大小。

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tqdm import tqdm
import numpy as np
import matplotlib.pyplot as plt

cd /content/drive/MyDrive

dataset = keras.preprocessing.image_dataset_from_directory(
    directory = 'Humans', label_mode = None, image_size = (64,64), batch_size = 32,
    shuffle = True
).map(lambda x: x/255.0)

discriminator = keras.models.Sequential(
    [
        keras.Input(shape = (64,64,3)),
        layers.Conv2D(64, kernel_size = 4, strides = 2, padding = 'same'),
        layers.LeakyReLU(0.2),
        layers.Conv2D(128, kernel_size = 4, strides = 2, padding = 'same'),
        layers.LeakyReLU(0.2),
        layers.Conv2D(128, kernel_size = 4, strides = 2, padding = 'same'),
        layers.LeakyReLU(0.2),
        layers.Flatten(),
        layers.Dropout(0.2),
        layers.Dense(1,activation = 'sigmoid')
    ]
)

latent_dim = 128
generator = keras.models.Sequential(
    [
        layers.Input(shape = (latent_dim,)),
        layers.Dense(8*8*128),
        layers.Reshape((8,8,128)),
        layers.Conv2DTranspose(128, kernel_size = 4, strides = 2, padding = 'same'),
        layers.LeakyReLU(0.2),
        layers.Conv2DTranspose(256, kernel_size = 4, strides = 2, padding = 'same'),
        layers.LeakyReLU(0.2),
        layers.Conv2DTranspose(512, kernel_size = 4, strides = 2, padding = 'same'),
        layers.LeakyReLU(0.2),
        layers.Conv2D(3, kernel_size = 5,padding = 'same',activation = 'sigmoid')
    ]
)

opt_gen = keras.optimizers.Adam(1e-4)
opt_disc = keras.optimizers.Adam(1e-4)
loss_fn = keras.losses.BinaryCrossentropy()

for epoch in range(500):
  for idx, real in enumerate(tqdm(dataset)):
    batch_size = real.shape[0]
    random_latent_vectors = tf.random.normal(shape = (batch_size,latent_dim))
    fake = generator(random_latent_vectors)

    if idx % 50 == 0:
      img = keras.preprocessing.image.array_to_img(fake[0])
      img.save(f'gen_images/generated_img{epoch}_{idx}_.png')

    with tf.GradientTape() as disc_tape:
      loss_disc_real = loss_fn(tf.ones((batch_size,1)), discriminator(real))
      loss_disc_fake = loss_fn(tf.zeros(batch_size,1), discriminator(fake))
      loss_disc = (loss_disc_real+loss_disc_fake)/2

    grads = disc_tape.gradient(loss_disc, discriminator.trainable_weights)

    opt_disc.apply_gradients(
        zip(grads, discriminator.trainable_weights)
    )

    with tf.GradientTape() as gen_tape:
      fake = generator(random_latent_vectors)
      output = discriminator(fake)
      loss_gen = loss_fn(tf.ones(batch_size,1),output)

    grads = gen_tape.gradient(loss_gen, generator.trainable_weights)
    opt_gen.apply_gradients(
        zip(grads, generator.trainable_weights)
    )

我尝试更改图像大小和转换层中的一些值,但它不起作用。


你几乎成功了!图像大小的增加方式是正确的,但你漏掉了一个生成器模型中的一个小细节。

你在生成器中使用 strides=2 Conv2DTranspose 层,这会导致图像大小在每一层翻倍。从一个 8x8x128 的张量开始,你得到 16x16、32x32,最后是 64x64。你需要再添加一个 Conv2DTranspose 层来达到 128x128,然后是 256x256,最后是 512x512。

下面是修改后的生成器模型:

latent_dim = 128
generator = keras.models.Sequential(
    [
        layers.Input(shape = (latent_dim,)),
        layers.Dense(8*8*128),
        layers.Reshape((8,8,128)),
        layers.Conv2DTranspose(128, kernel_size=4, strides=2, padding='same'),
        layers.LeakyReLU(0.2),
        layers.Conv2DTranspose(256, kernel_size=4, strides=2, padding='same'),
        layers.LeakyReLU(0.2),
        layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding='same'),
        layers.LeakyReLU(0.2),
        layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding='same'),  # 添加新层
        layers.LeakyReLU(0.2),
        layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding='same'),  # 添加新层
        layers.LeakyReLU(0.2),
        layers.Conv2D(3, kernel_size=5, padding='same', activation='sigmoid')
    ]
)

在这个修改后的模型中,我们添加了两个 Conv2DTranspose 层,每个层的 strides=2 。这样,图像大小会从 8x8 逐渐增加到 512x512。

以下是关于 Conv2D Conv2DTranspose 层如何工作以及它们如何影响图像大小的简要说明:

  • Conv2D : 此层执行卷积运算,通常会降低图像大小。 strides 参数决定了卷积核在图像上移动的步长。 strides=2 会将图像大小减半。
  • Conv2DTranspose : 此层执行转置卷积,通常用于增加图像大小。它通过在输入数据中添加零值(也称为上采样)来实现这一点,然后执行卷积。 strides 参数控制上采样的程度。 strides=2 会将图像大小翻倍。

在你的代码中,你使用 Conv2D 层作为鉴别器的一部分,并使用 Conv2DTranspose 层作为生成器的一部分。鉴别器会降低图像大小以提取特征,而生成器会增加图像大小以生成更大的图像。

通过向生成器添加额外的 Conv2DTranspose 层,你就可以生成 512x512 像素的图像。请记住,生成更高分辨率的图像可能需要更多的计算资源和训练时间。

标签:python,tensorflow,machine-learning,deep-learning,generative-adversarial-network
From: 78831225

相关文章

  • 【Python学习手册(第四版)】学习笔记14-迭代器和列表解析(一)
    个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。本文主要以通俗易懂的语言介绍迭代器(文件迭代、手动迭代iter和next等),列表解析式包括基础知识包括写法、文件上使用列表解析、扩展列表解析语法等,对列表解析不懂的同学着重推荐......
  • 如何获取部署在 Azure 应用服务上并通过 Microsoft 身份提供商进行身份验证的 Python
    我使用PythonDash包构建了一个Web应用程序,并将该应用程序部署在Azure应用服务上。Web应用程序当前通过Azure门户的应用程序服务使用Microsoft身份提供程序进行身份验证。但是如何获取登录用户的详细信息呢?在本地运行时如何验证我的Web应用程序?我当前的登录流......
  • 使用 Python 打印此图案
    1010101010101010使用python打印此我已经尝试过defprint_pattern(rows):foriinrange(rows):start_char='1'ifi%2==0else'0'pattern=''.join(start_charifj%2==0else('0'ifs......
  • python discord bot nextcord 斜线命令 更改语言
    我想根据用户的不和谐语言更改斜杠命令的名称。如果语言是韩语/서버如果语言是英语/服务器像这样。我可以使用ctx.locale更改里面的内容,但我也想更改名称和描述。我应该怎么办?当我问ChatGPT时,他们说的很奇怪,谷歌上也没有任何信息。但是有一个机器人可以根据语言......
  • 学习Python的书籍推荐--《Python编程从入门到实践》
    版权信息:书名:Python编程:从入门到实践(第3版)作者:[美]埃里克·马瑟斯(EricMatthes)译者:袁国忠评价:1.北京邮电大学副教授陈光老师是这样评价的:    编程教学之道,一是重在实践,二是循序渐进一一通过巧妙的实战项目,激发和保持学习的热情,让学习渐入佳境。在这两方......
  • 我可以将 Python 与 javascript 结合起来用于网站或应用程序吗
    我不知道如果j添加Python和javascript可以吗我尝试过。但决定在继续之前询问一下是否可以继续但是如果我只使用javascript还是只使用python会更好吗?我只需要建议或答案将Python与Javascript结合用于网站或应用程序不仅完全可行,而且也是一种非常常见的做法!二者......
  • Python 网络抓取与请求和美丽的汤被需要 javascript 阻止
    我正在尝试从网站上抓取文本。我使用简单的代码:requests.get(url_here)。我的代码直到最近才有效。现在,当我使用请求时,我收到一条消息,而不是获取网站的文本:“该网站需要启用JavaScript!您使用的浏览器不支持JavaScript,或者已关闭JavaScript。“我已验证我的浏览器确实......
  • python实现局域网及广域网私人聊天(Socket库局域网应用)
    引言在当今这个数字化时代,即时通讯已成为我们日常生活的一部分。无论是通过手机还是电脑,人们都在寻找更高效、更私密的沟通方式。想象一下,在你自己的局域网内,与朋友或同事建立一个专属的聊天室,无需担心数据泄露或者被第三方监听。本文将引导你从零开始,利用Python和Socket库......
  • 使用 python 抓取网页
    我有以下网页</div><ahref="https://www.emag.ro/laptop-lenovo-thinkbook-15-iil-cu-procesor-intel-core-i7-1065g7-pana-la-3-90-ghz-15-6-full-hd-16gb-512gb-ssd-intel-iris-plus-graphics-free-dos-mineral-grey-20sm003jrm/pd/DKBK1TMBM/#reviews-section&......
  • Python:需要有关类方法的帮助
    我有一个类“Duck”和“Dog”,如下所示:classDuck:defquack(self):print("quack")classDog:defbark(self):print("Ijustbark")以两种方式定义了另一个类并启动:case:1classItQuacks:def__init__(self,animal):......