用来生成二维矩阵的dcgan

这篇具有很好参考价值的文章主要介绍了用来生成二维矩阵的dcgan。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有大量二维矩阵作为样本,为连续数据。数据具有空间连续性,因此用卷积网络,通过dcgan生成二维矩阵。因为是连续变量,因此损失采用nn.MSELoss()。文章来源地址https://www.toymoban.com/news/detail-722877.html

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from DemDataset import create_netCDF_Dem_trainLoader
import torchvision
from torch.utils.tensorboard import SummaryWriter

batch_size=16
#load data
dataloader = create_netCDF_Dem_trainLoader(batch_size)

# Generator with Conv2D structure
class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.model = nn.Sequential(
            nn.ConvTranspose2d(100, 512, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.ConvTranspose2d(512, 512, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(512),
            nn.ReLU(),
            nn.ConvTranspose2d(512, 256, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(256),
            nn.ReLU(),
            nn.ConvTranspose2d(256, 128, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),
            nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),
            nn.ConvTranspose2d(64, 32, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(),
            nn.ConvTranspose2d(32, 1, kernel_size=4, stride=2, padding=1),
            nn.Tanh()
        )

    def forward(self, z):
        img = self.model(z)
        return img

# Discriminator with Conv2D structure
class Discriminator(nn.Module):
    def __init__(self):
        super(Discriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(1, 32, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),
            nn.Conv2d(32, 64, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),
            nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),
            nn.Conv2d(128, 256, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),
            nn.Conv2d(256, 512, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),
            nn.Conv2d(512, 512, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),
            nn.Conv2d(512, 1, kernel_size=4, stride=2, padding=1),
        )

    def forward(self, img):
        validity = self.model(img)
        return validity

# Initialize GAN components
generator = Generator()
discriminator = Discriminator()


# Define loss function and optimizers
criterion = nn.MSELoss()
optimizer_G = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))
optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
generator.to(device)
discriminator.to(device)

writer_real = SummaryWriter(f"logs/real")
writer_fake = SummaryWriter(f"logs/fake")
step = 0

# Training loop
num_epochs = 200
for epoch in range(num_epochs):
    for batch_idx, real_data in enumerate(dataloader):
        real_data = real_data.to(device)

        # Train Discriminator
        optimizer_D.zero_grad()
        real_labels = torch.ones(real_data.size(0), 1).to(device)
        fake_labels = torch.zeros(real_data.size(0), 1).to(device)
        z = torch.randn(real_data.size(0), 100, 1, 1).to(device)
        fake_data = generator(z)
        real_pred = discriminator(real_data)
        fake_pred = discriminator(fake_data.detach())
        d_loss_real = criterion(real_pred, real_labels)
        d_loss_fake = criterion(fake_pred, fake_labels)
        d_loss = d_loss_real + d_loss_fake
        d_loss.backward()
        optimizer_D.step()

        # Train Generator
        optimizer_G.zero_grad()
        z = torch.randn(real_data.size(0), 100, 1, 1).to(device)
        fake_data = generator(z)
        fake_pred = discriminator(fake_data)
        g_loss = criterion(fake_pred, real_labels)
        g_loss.backward()
        optimizer_G.step()

        # Print progress
        if batch_idx % 100 == 0:
            print(f"[Epoch {epoch}/{num_epochs}] [Batch {batch_idx}/{len(dataloader)}] [D loss: {d_loss.item():.4f}] [G loss: {g_loss.item():.4f}]")
            with torch.no_grad():
                    img_grid_real = torchvision.utils.make_grid(
                        fake_data#, normalize=True,

                    )

                    img_grid_fake = torchvision.utils.make_grid(
                        real_data#, normalize=True
                    )

                    writer_fake.add_image("fake_img", img_grid_fake, global_step=step)
                    writer_real.add_image("real_img", img_grid_real, global_step=step)

                    step += 1

# After training, you can generate a 2D array by sampling from the generator
z = torch.randn(1, 100, 1, 1).to(device)
generated_array = generator(z)

到了这里,关于用来生成二维矩阵的dcgan的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【机器学习/深度学习】数学基础——矩阵求导

    A矩阵对B矩阵求导,实质是矩阵A中的每个元素对矩阵B中的每个元素进行求导。 广义上,矩阵可以认为是一个单独的标量(矩阵中只有一个元素)、一个向量(m 1矩阵或者1 n矩阵)。那么矩阵对矩阵求导实际上可以分为以下几种: 标量对向量求导 向量对标量求导 向量对向量

    2024年02月04日
    浏览(37)
  • 机器学习&&深度学习——机器翻译(序列生成策略)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——seq2seq实现机器翻译(详细实现与原理推导) 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 上一节已经实现了机器翻译的模型训练和预测,逐个预测输出序列, 直

    2024年02月12日
    浏览(29)
  • 【机器学习300问】9、梯度下降是用来干嘛的?

            当你和我一样对自己问出这个问题后,分析一下!其实我首先得知道梯度下降是什么,也就它的定义。其次我得了解它具体用在什么地方,也就是使用场景。最后才是这个问题,梯度下降有什么用?怎么用?         所以我按照这个思路给大家讲讲我自己是怎么理解

    2024年01月21日
    浏览(30)
  • 基于深度学习、机器学习,对抗生成网络,OpenCV,图像处理,卷积神经网络计算机毕业设计选题指导

    开发一个实时手势识别系统,使用卷积神经网络(CNN)和深度学习技术,能够识别用户的手势并将其映射到计算机操作,如控制游戏、音量调整等。这个项目需要涵盖图像处理、神经网络训练和实时计算等方面的知识。 利用深度学习模型,设计一个人脸识别系统,可以识别人

    2024年02月07日
    浏览(59)
  • 生成式AI系列 —— DCGAN生成手写数字

    数据请在访问链接获取:欢迎关注本人仓库

    2024年02月12日
    浏览(34)
  • 第G2周:人脸图像生成(DCGAN)

    第G2周:人脸图像生成(DCGAN)) 🍨 本文为🔗365天深度学习训练营 中的学习记录博客 🍖 原作者:K同学啊 电脑系统:Windows 10 语言环境:Python 3.8.5 编译器:Spyder 1、导入第三方库 2、设置超参数 3、导入数据 4.1 初始化权重 4.2 定义生成器 4.3 定义鉴别器 对GAN有更深的理解,同

    2024年04月13日
    浏览(21)
  • 对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例

    🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:对抗生成网络GAN系列——GAN原理及手写数字生成小案例 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞👍🏼、收藏⭐、留言📩 本节已录制视频:DCGAN简介及人脸图像生成案例🧨🧨🧨 ​  

    2024年01月16日
    浏览(30)
  • MATLAB将二维数据生成一维是按列排序,矩阵操作笔记,附代码

    matlab和Fortran二维数组按列优先存储 学习一定要敢想敢做!

    2024年02月07日
    浏览(31)
  • (微信机器人)小程序转二维码,给微信机器人发送小程序生成二维码,打开H5页面跳转到小程序

    最早知道这个需求的时候是一个朋友说的,然后研究了一番,后来发现也没那么难,符合相关的规范就可以了。 本来就有获取微信appid和pagepath的功能了,感觉转成二维码应该不难。 主要是符合这个要求,目录 | 微信开放文档 1、在需要调用 JS 接口的页面引入如下 JS 文件:

    2024年02月14日
    浏览(37)
  • 图、邻接矩阵、广度与深度优先、生成树

    最近突然被问到这个问题,于是复习一下,用最通俗的语言解释。 无向图 :如下左图各个顶点之间用不带箭头的边连接的图;相应的右图就是 有向图                 可以理解为表示上述图中顶点与顶点之间是否有直接相连的边(有则是1,无则是0),描述这种关系的二维

    2024年02月04日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包