论文代码学习—HiFi-GAN(3)——模型损失函数loss解析

news2024/11/19 8:37:32

文章目录

    • 引言
    • 正文
      • 生成器损失函数
        • 最小二乘损失函数
        • 梅尔频谱图损失函数
        • 特征匹配损失函数
        • 生成器最终损失函数loss
        • 生成器loss对应代码
      • 鉴定器损失函数
        • 鉴定器损失函数代码
    • 总结
    • 引用

引言

  • 这里翻译了HiFi-GAN这篇论文的具体内容,具体链接。
  • 这篇文章还是学到了很多东西,从整体上说,学到了生成对抗网络的构建思路,包括生成器和鉴定器。细化到具体实现的细节,如何 实现对于特定周期的数据处理?在细化,膨胀卷积是如何实现的?这些通过文章,仅仅是了解大概的实现原理,但是对于代码的实现细节并不是很了解。如果要加深印象,还是要结合代码来具体看一下实现的细节。
  • 本文主要围绕具体的代码实现细节展开,对于相关原理,只会简单引用和讲解。因为官方代码使用的是pytorch,所以是通过pytorch展开的。
  • 关于模型其他部分的介绍,链接如下
    • 论文代码学习(1)—HiFi-GAN——生成器generator代码
    • 论文代码学习—HiFi-GAN(2)——鉴别器discriminator代码

正文

  • 关于模型的损失函数,这里总共有两部分损失函数,分别是生成器损失函数和鉴定器损失函数。其中生成器的损失函数,有分为三部分,分别是常规的对抗生成损失、针对特征匹配的损失函数和针对梅尔频谱图的损失函数,后两者是作者自己的加上去的。

生成器损失函数

  • 对于生成器损失函数,作者分成了三个部分,分别是基本损失函数、针对特征匹配的损失函数以及梅尔损失函数。

最小二乘损失函数

  • 不同于一般的GAN网络使用交叉熵损失函数,这里使用的是最小二乘损失函数,借此来避免梯度丢失的现象。

  • 最小二乘损失函数

    • 用于衡量模型预测值和真实值的差异,具体特点如下
      • 平方项:通过平方差异,扩大误差,模型更加关注于难以拟合的样本
      • 连续可微:连续可微,可以有效找到最小值
      • 非负:损失函数的值始终非负

在这里插入图片描述

  • 生成器的损失函数的目的是为了使得生成的数据,经过鉴定器判定,和真的差不多。
  • 具体的公式如下
    • s s s是梅尔频谱图,输入的条件变量
    • x x x是真实数据
    • D ( x ) D(x) D(x)是鉴定器对于输入结果的评分,越逼真越接近1
    • G ( s ) G(s) G(s)是生成器根据梅尔频谱图生成的结果

在这里插入图片描述

  • 在上式子中,损失函数越小越好,生成器的效果越好,鉴定器,会将其分辨为1,做差,越靠近零,效果越好。

梅尔频谱图损失函数

  • 除了考虑基本的损失函数,这里还增加梅尔频谱图损失函数,用来提高训练效果和生成音频的分辨率,主要是抓住了梅尔频谱图对于感知能力的重视。
  • 定义
    • 计算合成的波形图和实际波形图的对应采样点的L1距离
  • 参数说明
    • ∅ \varnothing 表示将波形图转为mel频谱图
  • 效果:
    • 帮助生成器生成和输入相关的实际波形
    • 是的对抗训练阶段能够快速稳定下来

在这里插入图片描述

特征匹配损失函数

  • 特征匹配损失函数是用来衡量真实样本和生成样本在鉴定器上提取出来的特征的差异程度。不同于上一个mel频谱图的特征衡量,这里是直接衡量鉴定器生成的中间特征的差异程度。

  • 定义

    • 计算真实样本和生成样本分别在鉴定器上生成的中间特征的L1距离
  • 参数说明

    • T T T表示为鉴定器的层数
    • D i D^i Di N i N_i Ni分别表示第i层的特征值和特征的数量。
  • 效果

    • 从鉴定器特征角度使得生成器的样本更加逼真
      在这里插入图片描述
  • 注意

    • 这里并不是单单一个层的特征,是鉴定器上每一层的输出特征的L1距离累加和的平均值。

生成器最终损失函数loss

  • 生成器最终的损失函数,是上述三个损失函数之和,并且特征匹配损失函数和mel频谱图损失函数,加上对应的权重,具体如下
    • λ f m = 2 \lambda_{fm} = 2 λfm=2 λ m e l = 45 \lambda_{mel} = 45 λmel=45
      在这里插入图片描述

生成器loss对应代码

def feature_loss(fmap_r, fmap_g):
    # 特征损失函数
    # fmap_r是真实音频信号的特征图,fmap_g是生成音频信号的特征图
    loss = 0
    for dr, dg in zip(fmap_r, fmap_g):
        for rl, gl in zip(dr, dg):
            # 遍历每一层特征图,计算特征损失,做差,求绝对值,求均值
            loss += torch.mean(torch.abs(rl - gl))

    # 根据经验,特征损失函数的权重为10
    return loss*2


def generator_loss(disc_outputs):
    # 生成器的损失函数
    # disc_outputs是鉴定器的输出
    loss = 0
    gen_losses = []
    for dg in disc_outputs:
        l = torch.mean((1-dg)**2)
        gen_losses.append(l)
        loss += l
    # loss是生成器的总损失,用于反向传播来更新生成器的参数
    # gen_losses是生成器的损失列表,用于记录鉴定器中每一个元素对应的损失,可以用于调试设备
    return loss, gen_losses

  • 结合代码来看,并没有将mel频谱图损失记录在内,这里仅仅包含了两个损失函数,generator_loss实现了最小二乘损失函数,feature_loss计算了鉴定器每一层的匹配的损失函数。

在这里插入图片描述

  • 她是把mel频谱图损失定义在训练过程中了.

鉴定器损失函数

  • 我们鉴定器的训练目标:
    • 能够将真实数据鉴定为真,标记为1
    • 能够将生成器生成的数据鉴定为假,标记为0
  • 所以,鉴定器的损失函数应该从两方面进行考虑,分别是鉴定生成数据和鉴定真实数据。
  • 具体的公式如下
    • s s s是梅尔频谱图,输入的条件变量
    • x x x是真实数据
    • D ( x ) D(x) D(x)是鉴定器对于输入结果的评分,越逼真越接近1
    • G ( s ) G(s) G(s)是生成器根据梅尔频谱图生成的结果

在这里插入图片描述

鉴定器损失函数代码

def discriminator_loss(disc_real_outputs, disc_generated_outputs):
    # 鉴定器的损失函数
    # disc_real_outputs是真实音频信号的鉴定器的输出
    # disc_generated_outputs是生成音频信号的鉴定器的输出
    loss = 0
    r_losses = []
    g_losses = []
    for dr, dg in zip(disc_real_outputs, disc_generated_outputs):
        # 计算真实音频信号的损失
        r_loss = torch.mean((1-dr)**2)
        # 计算生成音频信号的损失
        g_loss = torch.mean(dg**2)
        # 将两个损失相加
        loss += (r_loss + g_loss)
        # 记录各个鉴定器的损失
        r_losses.append(r_loss.item())
        g_losses.append(g_loss.item())

    return loss, r_losses, g_losses
  • 这个损失函数实现起来还是比较容易的,只需要分别计算两种数据的损失,然后累加求和即可

总结

  • 总的来说,这是第一次接触对抗生成学习,知道了对于鉴定器和生成器要分别定义,损失函数也是分别定义的。除此之外,他们的损失函数也是相互调用的。值得学习。
  • 下部分将讲述关于train文件具体内容,这个是模型的具体训练文件,定义了模型的前向传播和反向传播的过程。

引用

  • chatGPT-plus
  • HiFi-GAN demo
  • HiFi-GAN: Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P1429 平面最近点对(加强版)

题目 思路 详见加强加强版 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn4e510; pair<int,int> a[maxn]; int n; double d1e16; pair<int,int> vl[maxn],vr[maxn]; void read() { cin>>n;for(int i1;i<…

angular2+ 打包信息控制台打印

问题由来&#xff1a;在多人合作进行项目构建的工作环境下&#xff0c;个人完成了某些功能更新到测试环境时&#xff0c;可能会有覆盖他人更新内容的情况&#xff0c;所以这个时候我们就需要知道最后包的版本号&#xff0c;打包人和打包时间&#xff0c;这些信息能够有效的去定…

JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

详细画的图片 https://www.processon.com/diagraming/64c8aa11c07d99075d934311 官方网址 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 相关概念 年轻代是所有新对象被分配和老化的地方。当年轻代填满时&#xff0c;这会导致minor …

Java中支持可变参数详解

Java中支持可变参数详解 意思就是&#xff1a;参数的个数可以根据需要写&#xff0c;你可以写1个、2个、3个、、、、他们都被保存到一个参数的数组中。 但是这些参有一些约束&#xff1a;他们必须是同类型的&#xff0c;比如都是String字符串类型。 同时&#xff0c;可变参数…

jenkins使用gitlab标签发布

关于jenkins git parameter使用gitlab标签发布和分支发布的用法 手动配置的我就不说了&#xff0c;点点点就行&#xff0c;主要是说一下在pipeline里如何使用 通过分支拉取gitlab仓库代码 pipeline {agent anyenvironment {}parameters {gitParameter(branch: , branchFilte…

CAE模拟和分析产品组件CEETRON SDK:提供网格划分、求解、后处理等功能!

Tech Soft 3D经过两年多的时间对VKI&#xff08;Visual Kinematics Inc.&#xff09;和CEETRON&#xff08;Ceetron AS&#xff09;原有的产品线进行代码规整、文档编写和产品重组&#xff0c;发布了全新的CAE产品组件套包CEETRON SDKS。 通过将HOOPS和CEETRON组件进行融合&am…

基于S3存储的笔记应用Notea

什么是 Notea &#xff1f; Notea 是存储在 S3 上的自托管笔记应用程序&#xff0c;Notea 不需要数据库。笔记存储在 AWS S3 存储桶或兼容的 API 中。这意味着您可以使用 MinIO&#xff08;自托管&#xff09;、阿里云 OSS&#xff08;如 AWS S3&#xff09;或 NAS 来存储您的数…

SpringBoot 实现数据加密脱敏(注解 + 反射 + AOP)

SpringBoot 实现数据加密脱敏&#xff08;注解 反射 AOP&#xff09; 场景&#xff1a;响应政府要求&#xff0c;商业软件应保证用户基本信息不被泄露&#xff0c;不能直接展示用户手机号&#xff0c;身份证&#xff0c;地址等敏感信息。 根据上面场景描述&#xff0c;我们…

功率放大器的种类有哪三种类型

功率放大器是一种能将输入信号转换为更高功率输出的电子设备。在电子工程和音频领域中&#xff0c;功率放大器通常被分为三种类型&#xff1a;A类、B类和AB类。下面安泰电子将详细介绍这三种类型的功率放大器及其特点。 A类功率放大器 A类功率放大器是一种基本的线性功率放大器…

# windows安装gcc、g++、pthread

目录 windows安装gcc、g、pthreadSTEP 1 &#xff1a;下载mingw文件STEP 2&#xff1a;安装.exeSTEP 3&#xff1a;环境变量配置STEP 4&#xff1a;确认MinGw的安装成功STEP 5&#xff1a;安装gccSTEP 6&#xff1a;安装gSTEP 7&#xff1a;查看gccSTEP 8&#xff1a;安装pthre…

城市内涝 | 复杂城市排水管网系统快速建模、管网水力性能专题图制作、城市内涝一维二维耦合模拟、海绵城市关键控制指标计算

随着计算机的广泛应用和各类模型软件的发展&#xff0c;将排水系统模型作为城市洪灾评价与防治的技术手段已经成为防洪防灾的重要技术途径。本次培训将聚焦于综合利用GIS及CAD等工具高效地进行大规模城市排水系统水力模型的建立&#xff0c;利用SWMM实现排水系统水力模拟。讲解…

怎么学习CSS相关技术知识? - 易智编译EaseEditing

学习CSS技术是前端开发中的重要一环&#xff0c;它用于控制网页的样式和布局&#xff0c;使网页更加美观和易于使用。以下是学习CSS技术的几个方面&#xff1a; 基本语法和选择器&#xff1a; 了解CSS的基本语法&#xff0c;学习如何使用选择器来选择HTML元素并应用样式。 样…

elementUi el-radio神奇的:label与label不能设置默认值

问题:最近项目遇到一个奇葩的问题:红框中列表的单选按钮无法根据需求设置默认选中,但是同样是设置开启状态的单选框可以设置默认状态 原因:开始同样是和开启/关闭状态一样也把红框中列表的默认值设置为数字模式,但是由于后台返回值、与label绑定值的类型不同导致设置红框…

问道管理:补仓什么意思?怎么补仓可以降低成本?

补仓这个术语我们在理财出资中经常听到&#xff0c;例如基金补仓&#xff0c;股票补仓。那么&#xff0c;补仓什么意思&#xff1f;怎样补仓能够降低成本&#xff1f;问道管理为我们预备了相关内容&#xff0c;以供参阅。 补仓什么意思&#xff1f; 股票补仓是指出资者在某一只…

机房断网断电监测网关支持远程告警

RTU5028E网络故障监测终端是一款功能强大且方便实用的设备&#xff0c;集合了断网、断电、网线故障报警功能。它支持同时监测多达7台网络设备&#xff0c;可以帮助用户快速定位远程网络设备离线的原因。此外&#xff0c;它还具备自动重启和远程重启网络设备的功能&#xff0c;为…

ODOO16运输费用摊入采购成本,总账和收发表一致?

产品的采购成本准确的计算是怎样的呢&#xff1f;在《会计准则》中有规定&#xff1a; “第三章 计量 ... 第六条 存货的采购成本&#xff0c;包括购买价款、相关税费、运输费、装卸费、保险费以及其他可归属于存货采购成本的费用。” 可见存货的采购成本包含的信息是很多&am…

【java】对象和类

java对象和类 面向对象对象和类属性方法静态包构建对象 面向对象 所谓的面向对象&#xff0c;其实就是分析问题时&#xff0c;以问题所涉及到的事或物为中心的分析方式。 比如在写小学作文里《美好的一天》&#xff0c;一种写法是记录几点起床&#xff0c;几点吃饭&#xff0…

GPTCache 悬赏令!寻找最佳捉虫猎手,豪华赏格等你来拿!

号外号外&#xff01;GPTCache 全宇宙寻找最佳捉虫猎手&#xff01;捉虫数量越多&#xff0c;奖品越丰厚&#xff01; GPTCache 是为 AIGC 应用搭建的全新缓存&#xff0c;典型的应用场景是大模型&#xff0c;它采用语义缓存技术&#xff0c;能够存储 LLM 响应&#xff0c;从而…

将Visio和Excel导出成没有白边的PDF文件

1、VISIO如何无白边导出pdf格式 在使用Latex时&#xff0c;要导入矢量图eps格式。但是VISIO无法输出eps格式&#xff0c;这就需要将其导出为pdf。但是导出pdf时&#xff0c;往往会有大量的白边。VISIO无白边导出pdf格式的方法如下&#xff1a; 1.文件——开发工具——显示sha…

物联网||不一样的点灯实验(2)|通过使用CMSIS库函数实现点灯实验-学习笔记(12)

文章目录 通过使用CMSIS库函数实现点灯实验1 如何使用CMIS库2 如何利用CMSIS库操作IO 两种实现方法的比较课后作业:完整代码&#xff1a;LED.C:test.c:led.h: 通过使用CMSIS库函数实现点灯实验 1 如何使用CMIS库 #####如何使用此驱动#####[. .](#)启用GPIO AHB时钟使用以下函数…