论文代码学习—HiFi-GAN(3)——模型损失函数loss解析
文章目录
- 引言
- 正文
- 生成器损失函数
- 最小二乘损失函数
- 梅尔频谱图损失函数
- 特征匹配损失函数
- 生成器最终损失函数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

- λ 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 = 0for dr, dg in zip(fmap_r, fmap_g):for rl, gl in zip(dr, dg):# 遍历每一层特征图,计算特征损失,做差,求绝对值,求均值loss += torch.mean(torch.abs(rl - gl))# 根据经验,特征损失函数的权重为10return loss*2def generator_loss(disc_outputs):# 生成器的损失函数# disc_outputs是鉴定器的输出loss = 0gen_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 = 0r_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
相关文章:
论文代码学习—HiFi-GAN(3)——模型损失函数loss解析
文章目录 引言正文生成器损失函数最小二乘损失函数梅尔频谱图损失函数特征匹配损失函数生成器最终损失函数loss生成器loss对应代码 鉴定器损失函数鉴定器损失函数代码 总结引用 引言 这里翻译了HiFi-GAN这篇论文的具体内容,具体链接。这篇文章还是学到了很多东西&a…...
CLion中avcodec_receive_frame()问题
1. 介绍 在提取音视频文件中音频的PCM数据时,使用avcodec_receive_frame()函数进行解码时,遇到了一些问题,代码在Visual Studio 2022中运行结果符合预期,但是在CLion中运行时,获取的AVFrame有错误,和VS中获…...
Linux安装操作(Mac版本)
Parallels Desktop的简介 Parallels Desktop是Mac平台上的虚拟机软件,也是Mac平台最好的虚拟机软件之一。它允许用户在Mac OS X系统上同时运行其他操作系统,例如Windows、Linux等。Parallels Desktop为Mac用户提供了使用其他操作系统和软件的便利性&…...
Linux(四)--包软件管理器与Linux上软件的下载示例
一.包软件管理器【yum和apt】 1.先来学习使用yum命令。yum:RPM包软件管理器,用于自动化安装配置Linux软件,并可以自动解决依赖问题。通过yum命令我们可以轻松实现软件的下载,查找,卸载与更新等管理软件的操作。 最常用…...
HTML <param> 标签
实例 向 HTML 代码添加一个对象: <object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"><param name="BorderStyle" value="1" /><param nam…...
基于ARM+FPGA (STM32+ Cyclone 4)的滚动轴承状态监测系统
状态监测系统能够在故障早期及时发现机械设备的异常状态,避免故障的 进一步恶化造成不必要的损失,滚动轴承是机械设备的易损部件,本文对以滚动 轴承为研究对象的状态监测系统展开研究。现有的监测技术多采用定时上传监 测数据,…...
二、数据结构10:堆 模板题+算法模板(堆排序,模拟堆)
文章目录 算法模板堆题目代码模板堆的原理down操作理解:up操作理解建堆操作关于heap_swap中存的映射数组理解(模拟堆题目中用到) 模板题堆排序原题链接题目思路题解 模拟堆原题链接题目思路题解 算法模板 堆题目代码模板 // h[N]存储堆中的…...
W6100-EVB-PICO做DNS Client进行域名解析
前言 在上一章节中我们用W6100-EVB-PICO通过dhcp获取ip地址(网关,子网掩码,dns服务器)等信息,给我们的开发板配置网络信息,成功的接入网络中,那么本章将教大家如何让我们的开发板进行DNS域名解…...
【linux-网络】4层转发方法-iptable以及nginx
1.背景 有时候远程或者某些业务需要做转发就会用到iptables或者nginx,或者ss都可以 根据自己的情况去适配。 2.方法: 1)iptables -把linux内核转发功能打开 echo "net.ipv4.ip_forward1" >> /etc/sysctl.conf -出入转发…...
vue复制文案,复制图片,黏贴图片
vue 实现复制文案,复制图片,在微信聊天框,黏贴为图片 //安装 cnpm i clipboard-all //引用 import clipboard from clipboard-all<!-- row.url 图片路径 --><div ref"foo" class"hidden"><img :src"…...
Web应急思路
Web应急思路 找到webshell --> 确定攻击者IP --> 回溯攻击者操作 --> 梳理整个攻击过程 1.寻找webshell方法 1.文件内容中的恶意函数 2.web日志中的webshell特征 3.贴合web业务中的URL来分析web日志 4.源码版本管理对比,注重修改或新增的脚本文件 5.统计…...
shell脚本清理redis模糊匹配的多个key,并计算释放内存大小
#!/bin/bash# 定义Redis服务器地址和端口 REDIS_HOST"localhost" REDIS_PORT6380# 获取Redis当前内存使用量(以字节为单位) function get_redis_memory_usage() {redis-cli -h $REDIS_HOST -p $REDIS_PORT INFO memory | grep "used_memo…...
python-MySQL数据库建表语句(需要连接数据库)转存为Excel文档-工作小记
将create table XXXXXX 转为指定Excel文档。该脚本适用于数据库表结构本地文档记录 呈现效果 代码 # -*- coding:utf-8 -*- # Time : 2023/8/2 15:14 # Author: 水兵没月 # File : MySQL建表_2_excel.py import reimport mysql.connector import pandas as pd db 库名 mydb …...
iOS Block介绍
文章目录 一、Block定义二、block为什么用copy修饰三、block使用时的注意事项四、使用 block时什么情况会发生引用循环,如何解决?五、在block内如何修改block外部变量?六、__block与__weak的区别 一、Block定义 目的就是能够直接存储一个代码…...
小程序安全性加固:如何保护用户数据和防止恶意攻击
第一章:引言 在当今数字化时代,移动应用程序的使用已经成为人们日常生活中的重要组成部分。小程序作为一种轻量级的应用程序形式,受到了广泛的欢迎。然而,随着小程序的流行,安全性问题也日益凸显。用户数据泄露和恶意攻…...
Ubuntu的tar命令详解
在 Ubuntu 中压缩文件夹可以使用 tar 命令。tar 可以将多个文件或文件夹打成一个包,并可选是否进行压缩,最常用的压缩方式是 gzip 和 bzip2。 常用的 tar 命令参数如下: -c:创建新的 tar 包; -x:解压 tar…...
使用elementplus实现文本框的粘贴复制
需求: 文本框仅用于显示展示数据并且用户可以进行复制,并不会进行修改和编辑, 注意点: 1.首先且文本为多行。所以不能使用普通的el-input,这种一行超出就会隐藏了,如果多行超出行数也会隐藏(…...
计算机毕设 深度学习卫星遥感图像检测与识别 -opencv python 目标检测
文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长…...
devops(前端)
1.前言 前端的打包流程和后端的流程是一样的,只是打包的环境和制作的镜像有所不同,前端需要使用nodejs环境打包,镜像也是使用nginx镜像,因为用的是k8s的pod运行镜像,还需要使用configmap挂载nginx的配置,一…...
SpringBoot中MongoDB的使用
SpringBoot中MongoDB的使用 MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居 多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoD…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
