Pytorch学习笔记-第七章

【研一小白的白话理解】pytorch-CycleGAN-and-pix2pix pytorch-CycleGAN-and-pix2pix博客简述项目整体理解GAN合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 博客简述 这是我第一次在csdn上写博客,开学研一,自己开始自学深度学习,本篇博客内容主要是针对基于pytor 阅读详情


记录一下个人学习和使用Pytorch中的一些问题。强烈推荐 《深度学习框架PyTorch:入门与实战》.写的非常好而且作者也十分用心,大家都可以看一看,本文为学习第七章GAN生成动漫头像的学习笔记。

主要分析实现代码里面main,model,visualize这3个代码文件完成整个项目模型结构定义,训练及生成,还有输出展示的整个过程。

model文件

整个模型结构是经典的生成器-判别器架构,model文件也只有这两个类,分别用于生成和判别图片。

生成器

生成器是从无到有,从一个噪声扩充数据到指定的大小,所以其中的网络层是反卷积层。除了第一层的输入通道数为参数设置之外,其他各层与判别器对称,可以从1x1x opt.nz的噪音,生成一个3x96x96的图片

class NetG(nn.Module):
    """
    生成器定义
    """

    def __init__(self, opt):
        super(NetG, self).__init__()
        ngf = opt.ngf  # 生成器feature map数

        self.main = nn.Sequential(
            # 输入是一个nz维度的噪声,我们可以认为它是一个1*1*nz的feature map
            nn.ConvTranspose2d(opt.nz, ngf * 8, 4, 1, 0, bias=False),
            nn.BatchNorm2d(ngf * 8),
            nn.ReLU(True),
            # 上一步的输出形状:(ngf*8) x 4 x 4

            nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),
            nn.BatchNorm2d(ngf * 4),
            nn.ReLU(True),
            # 上一步的输出形状: (ngf*4) x 8 x 8

            nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False),
            nn.BatchNorm2d(ngf * 2),
            nn.ReLU(True),
            # 上一步的输出形状: (ngf*2) x 16 x 16

            nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),
            nn.BatchNorm2d(ngf),
            nn.ReLU(True),
            # 上一步的输出形状:(ngf) x 32 x 32

            nn.ConvTranspose2d(ngf, 3, 5, 3, 1, bias=False),
            nn.Tanh()  # 输出范围 -1~1 故而采用Tanh
            # 输出形状:3 x 96 x 96
        )

判别器

正常的一个卷积网络,从3x96x96的图片得最后一个为真实样本的概率值。

class NetD(nn.Module):
    """
    判别器定义
    """

    def __init__(self, opt):
        super(NetD, self).__init__()
        ndf = opt.ndf
        self.main = nn.Sequential(
            # 输入 3 x 96 x 96
            nn.Conv2d(3, ndf, 5, 3, 1, bias=False),
            nn.LeakyReLU(0.2, inplace=True),
            # 输出 (ndf) x 32 x 32

            nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
            nn.BatchNorm2d(ndf * 2),
            nn.LeakyReLU(0.2, inplace=True),
            # 输出 (ndf*2) x 16 x 16

            nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
            nn.BatchNorm2d(ndf * 4),
            nn.LeakyReLU(0.2, inplace=True),
            # 输出 (ndf*4) x 8 x 8

            nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
            nn.BatchNorm2d(ndf * 8),
            nn.LeakyReLU(0.2, inplace=True),
            # 输出 (ndf*8) x 4 x 4

            nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),
            #约束到(0,1)
            nn.Sigmoid()  # 输出一个数(概率)
        )

visualize文件

整个文件就一个用于可视化的类,在Visdom的基础上,加工出几个更方便使用的函数。
类内包含了一个visdom对象,借助__getattr__函数使得想要调用visdom原生接口的函数也可以obj.func而不用obj.visdom.func

def __getattr__(self, name):
       '''
       self.function 等价于self.vis.function
       自定义的plot,image,log,plot_many等除外
       '''
       return getattr(self.vis, name)

文件自定义的接口为:一次性画多个点,以及一次性网格展示整个batch的图片。但是一次性展示整个batch图片这个函数好像没有使用,而且有点疑惑它这部分代码为什么输入的batch数据没有RGB通道。

def img_grid(self, name, input_3d):
        """
        一个batch的图片转成一个网格图,i.e. input(36,64,64)
        会变成 6*6 的网格图,每个格子大小64*64
        """
        self.img(name, tv.utils.make_grid(
            input_3d.cpu()[0].unsqueeze(1).clamp(max=1, min=0)))
            #疑惑为什么要假设输入的数据是BxHxW而没有颜色通道

main文件

该文件为主体文件,模型的各种参数也放在该文件的config类中。

数据处理

需要准备一些现成的动漫头像最为材料,供网络去学习模仿,就按一般图片的处理方式即可。因为现成数据的标签都是1,可以用默认的dataset而不进行额外处理,之后计算损失直接把target设为全1。

# 数据
    transforms = tv.transforms.Compose([
        tv.transforms.Resize(opt.image_size),
        tv.transforms.CenterCrop(opt.image_size),
        tv.transforms.ToTensor(),
        tv.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
    ])

    dataset = tv.datasets.ImageFolder(opt.data_path, transform=transforms)
    dataloader = t.utils.data.DataLoader(dataset,
                                         batch_size=opt.batch_size,
                                         shuffle=True,
                                         num_workers=opt.num_workers,
                                         drop_last=True
                                         )

训练

定义好生成器,判别器以及对应的优化器和误差计算函数之后开始模型的训练。

判别器

对于判别器而言需要分别出真实图像和生成的假图像,所以它的训练需要让两者的误分类损失最小,两者的损失都需要优化。

生成器

对于生成器而言,目标是让判别器误分类生成的假图像,所以它的损失函数是假图像的预测概率和真实图像标签(非我们定义假图像标签,而是我们定义的真实图像的标签)的误差。

生成结果

当生成器和判别器之间达到我们预先设定的条件,训练轮数足够或者平衡时,就可以说模型训练完成,可以查看输出的生成结果了。
为了得到好的结果,我们还是要同时用到生成器和判别器了,用一批随机噪声送入训练好的生成器,把生成的结果用判别器打个分,得分最高的(预测最接近真实标签的)就可以作为好结果输出了。

def generate(**kwargs):
    """
    随机生成动漫头像,并根据netd的分数选择较好的
    """
    for k_, v_ in kwargs.items():
        setattr(opt, k_, v_)
    
    device=t.device('cuda') if opt.gpu else t.device('cpu')

    netg, netd = NetG(opt).eval(), NetD(opt).eval()
    noises = t.randn(opt.gen_search_num, opt.nz, 1, 1).normal_(opt.gen_mean, opt.gen_std)
    noises = noises.to(device)

    map_location = lambda storage, loc: storage
    netd.load_state_dict(t.load(opt.netd_path, map_location=map_location))
    netg.load_state_dict(t.load(opt.netg_path, map_location=map_location))
    netd.to(device)
    netg.to(device)


    # 生成图片,并计算图片在判别器的分数
    fake_img = netg(noises)
    scores = netd(fake_img).detach()

    # 挑选最好的某几张
    indexs = scores.topk(opt.gen_num)[1]
    result = []
    for ii in indexs:
        result.append(fake_img.data[ii])
    # 保存图片
    tv.utils.save_image(t.stack(result), opt.gen_img, normalize=True, range=(-1, 1))
龙良曲pytorch基础课程学习笔记 什么是Pytorch? PyTorch 是一个基于 Python 的科学计算包,主要定位两类人群: NumPy 的替代品,可以利用 GPU 的性能进行计算 深度学习研究平台拥有足够的灵活性和速度 开始学习 tensor对象 在 TensorFlow 中,数据不是以整数,浮点数或者字符串形式存在的,而是被封装在一个叫做 tensor 的对象中。Tensor是张量的意思,张量包含了0到任意维度的量... 阅读详情

相关推荐

《PyTorch深度学习实践》学习笔记 【2】

《PyTorch深度学习实践》学习笔记 【2】 学习资源: 《PyTorch深度学习实践》完结合集 二、线性模型 2.1 概念: 2.1.1 数据集和测试集 ​ 数据集拿到后一般划分为两部分,训练集和测试集,然后使用训练集的数据来训练模型,用测试集上的误差作为最终模型在应对现实场景中的泛化误差。 ​ 一般来说,测试集在训练的时候是不能偷看的。 我们可以使用训练集的数据来训练模型,然后用测试集上的误差作为最终模型在应对现实场景中的泛化误差。有了测试集,我们想要验证模型的最终效果,只需将训练好的模型在测

Pin_BOY的博客 8836

深度学习框架PyTorch入门与实践:第七章 AI插画师:生成对抗网络

生成对抗网络(Generative Adversarial Net,GAN)是近年来深度学习中一个十分热门的方向,卷积网络之父、深度学习元老级人物LeCun Yan就曾说过“GAN is the most interesting idea in the last 10 years in machine learning”。尤其是近两年,GAN的论文呈现井喷的趋势,GitHub上有人收集了各种各样的GAN变种、应用、研究论文等,其中有名称的多达数百篇**[[the-gan-zoo]](https://gith

u011436316的博客 3303

Pytorch学习笔记总结

PyTorch学习笔记整理,内容参考多个多个优秀Pytorch学习资源,适合深度学习pytorch学习者学习。(开篇词)PyTorch 学习笔记 - PyTorch 学习笔记;动手学CV-Pytorch:动手学CV-Pytorch;Pytorch 中文文档:主页 - PyTorch中文文档;Pytorch Tutorials...

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 8751

基于PyTorch的深度学习入门教程(七)——PyTorch重点综合实践

前言 PyTorch提供了两个主要特性: (1) 一个n维的Tensor,与numpy相似但是支持GPU运算。 (2) 搭建和训练神经网络的自动微分功能。 我们将会使用一个全连接的ReLU网络作为实例。该网络有一个隐含层,使用梯度下降来训练,目标是最小化网络输出和真实输出之间的欧氏距离。目录 Tensors(张量) Warm-up:numpy PyTorch:Tensors Autogra

雁回晴空的博客专栏 9865

PyTorch学习笔记:PyTorch初体验

PyTorch学习笔记:PyTorch初体验 一、在Anaconda里安装PyTorch 1、进入虚拟环境mlcc 2、安装PyTorch 二、在PyTorch创建张量 1、启动mlcc环境下的Spyder,导入PyTorch,查看版本号 2、使用pytorch创建张量 创建一个未初始化的3×5矩阵: 创建一个随机初始化的3×5矩阵: 创建一个零元素的长整...

howard2005的专栏 819

pytorch-CycleGAN-and-pix2pix

pytorch-CycleGAN-and-pix2pix

[Pytorch系列-75]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - CycleGAN网络结构与代码实现详解

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_优快云博客 本文网址: 第1章 网络的定义 1.1 网络结构 相对于基础型的GAN网络,CycleGAN增加了一个核心的还原网络,导致相关的训练也跟着发生了相应的变化,因此还原网络是核心。 还原是双向的,不仅仅是真实输入图片-》Fake图片-》真实输入图片的还原。还包括真实的输出图片 -> Fake图片 -》真实的输出图片的还原。 CycleGAN一共有4个网络:G_A2B, D_A2B, G_B2A,

文火冰糖(王文兵)的博客 2万+

pytorch-CycleGAN-and-pix2pix-master

pytorch-CycleGAN-and-pix2pix-master的一个代码

[Pytorch系列-65]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - 无监督图像生成CycleGan的基本原理

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_优快云博客 本文网址: 目录 第1章 什么是CycleGan网络的图像转换 1.1 项目在github上的源代码 1.2图像转换实例 1.3图像转换的总体共性 第2章CycleGan图像转换的基本原理 2.1CycleGan网络的目标 2.2 CycleGAN名称的由来 2.3CycleGan网络的基本架构 2.4CycleGan网络的基本工作过程 2.5CycleGan网络的训练 -生成...

文火冰糖(王文兵)的博客 1万+

LVGL 离线字体转换lv_font_conv本地安装

LVGL FONT CONV 离线版本

liu132641的专栏 3386

告别编译噩梦:Vcpkg+Cmake一站式集成Tesseract-OCR C++开发环境(Windows)

本文详细介绍了如何在Windows系统上使用Vcpkg和CMake快速集成Tesseract-OCR C++开发环境,解决传统编译过程中的依赖问题。通过一键安装和自动化配置,开发者可以高效搭建OCR识别系统,支持中英文识别,并提供了常见问题的解决方案和进阶技巧。

weixin_29009339的博客 231

动手学深度学习pytorch学习笔记 —— 第七章

动手学深度学习 - 7.现代卷积神经网络 — AlexNet,VGG,NiN,GoogLeNet,Inception

lwangqqq的博客 1240

TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

文章目录TCP介绍三次握手四次挥手滑动窗口拥塞避免算法 TCP介绍 三次握手 四次挥手

热爱编程的菜鸟 1万+

《深入浅出PyTorch》学习笔记——第七章:PyTorch可视化

《深入浅出PyTorch》学习笔记——第七章:PyTorch可视化

a131529的博客 1275

车载毫米波雷达实战:用MATLAB复现DDMA-MIMO雷达的Empty-band算法(附代码解析)

本文详细介绍了车载毫米波雷达中DDMA-MIMO技术的实战应用,重点解析了Empty-band算法的原理与MATLAB实现。通过搭建仿真环境,文章深入探讨了发射天线通道解调与相位法速度解模糊两大核心难题的解决方案,并提供了完整的代码解析,为雷达算法工程师提供了从理论到实践的清晰指南。

hill8的博客 558

of_graph_get_remote_port

isp { compatible = "isp"; core@0 { id = <0>; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; ...

wmzjzwlzs的专栏 1164

《深入浅出Pytorch》第七章学习笔记

一、可视化网络结构 本节我们将介绍如何使用torchinfo来可视化网络结构。 1. 使用print函数打印模型基础信息 import torchvision.models as models model = models.resnet18() print(model) print(model),只能得出基础构件的信息,既不能显示出每一层的shape,也不能显示对应参数量的大小。 2.使用torchinfo可视化网络结构 安装方法 # 安装方法一 pip ...

m0_37262134的博客 2622

详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署

YOLO(You Only Look Once)系列算法因其高效、准确等特点而备受瞩目。由2023年Ultralytics公司发布了YOLO的最新版本YOLOv8是结合前几代YOLO的基础上的一个融合改进版。本文YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出/部署,从网络结构的讲解从模型的网络结构讲解到模型的部署都有详细介绍,同时在本专栏中还包括YOLOv8模型系列的改进包括个人提出的创新点,传统卷积、注意力机制、损失函数的修改教程,能够帮助你的论文获得创新点。

Snu77的博客 8万+

第七章:PyTorch可视化 学习笔记

架构(summary) ↘卷积核(grid) → torchinfo / make_grid / matshow特征图(hook) ↗↘训练过程(tb) → SummaryWriter → tensorboard↗实验对比(wb) → wandb.init / log / sweep。

weixin_72250436的博客 730

YOLO26科研升级:BiFPN双向特征金字塔,让多尺度特征融合精度再突破

在目录下,新建AddModules文件夹,将bifpn.py放入其中。

LXY_LOVE36的博客 558

华为昇腾(Ascend)开发考试原题目解析 (2024) (题库一)——HCIP-AI-Ascend Developer——第一部分

给出一段代码如下,以下哪个选项描述错误?...A.中的语句由 MindSpore 接管,有语法限制B. 算子在中定义,并用来建立网络C.__init__()中的语句由 Python 解析执行D. 网络定义必须继承基类nn.Cell正确答案: B__init__()用于定义算子和网络层。所有需要用到的层(如卷积层、全连接层等)都应该在这里进行实例化。这部分代码由Python解释器执行。用于构建前向计算图。它调用在__init__()中定义好的算子和层来描述数据的流向。

qq_38334677的博客 1053

PyTorch 详细学习笔记 第七章:调试与可解释性

第七章摘要:调试与可解释性 本章介绍了深度神经网络调试的核心工具和技术,重点讲解了PyTorch中的Hook机制。前向Hook(register_forward_hook)用于监控模型各层的激活值分布、形状和异常情况;后向Hook(tensor.register_hook)则用于追踪梯度流,诊断梯度消失/爆炸问题。文章通过具体代码示例演示了如何实现这两种Hook,并强调了使用后及时移除Hook的重要性。此外,还介绍了异常检测机制(torch.autograd.set_detect_anomaly)和数值溢出

qq_38334677的博客 953

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

pytorch之学习笔记

Pytorch学习笔记 本文主要是参考B站视频小土堆的pytorch基础教程,如想加深理解可以自行前去观看,讲的挺好的,很基础 一、环境配置 数据包、显卡等环境配置, 根据视频提示进行环境测试, 经过测试发现本地环境是可用的 二、torch学习 1、两个工具函数: 用于探索Python或pytorch中的工具包 dir():能让我们知道工具箱中有什么东西 help():告诉我们工具的使用方法 2、pycharm 和 jupyter的区别 3、pytorch如何加载数据 注:类中–init-- (sel

weixin_44216612的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Pytorch入门】小土堆PyTorch入门教程完整学习笔记(详细笔记并附练习代码 ipynb文件)

【Pytorch入门】小土堆PyTorch入门教程完整学习笔记(详细笔记 文末附练习代码 ipynb文件)

几度热忱的博客 3万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

PyTorch学习笔记(一):PyTorch环境安装

本章详细介绍Pytorch安装教学,具体可参考:windows10下CUDA11.1、cuDNN8.0、tensorflow-gpu2.4.1安装教程以及问题解决方法_Win10中CUDA、cuDNN的安装与卸载 Pytorch详细安装-强推!

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 1万+

Pytorch学习笔记

文章目录配置环境机器学习中的分类与回归问题PyTorch的基本概念Tensor的类型Tensor的创建Tensor的属性 配置环境 安装pip sudo apt-get install python3-pip 安装显卡驱动 安装cuda10.1 安装cuDNN7.6.5 使用sudo dpkg -i命令 安装torch和torchversion,见pytorch官网 验证是否安装成功: 机器学习中的分类与回归问题 PyTorch的基本概念 Tensor:张量,任意维度的数据 Variable:变量

很好的坏人 6287
上一篇: Pytorch学习笔记-第六章
下一篇: Pytorch学习笔记-第八章
Sigyc
博客等级 码龄11年 23粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值