BN和神经网络调优

人工智能44

抵扣说明:

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

Original: https://blog.csdn.net/zikyou/article/details/124303372
Author: 你好爱python
Title: BN和神经网络调优



相关阅读1

Title: Leetcode Python笔记

  • enumerate(iterable, start=0) 枚举方法, iterable参数必须是一个序列(sequence),迭代器(iterator)或者一些其他的可供迭代的对象(object)。start参数为下标起始位置,默认为0。enumerate() 将可迭代的对象组合成索引序列,同时列出索引和对应数据。常用于for循环当中。 官方代码举例:
>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

等同于:

1 def enumerate(sequence, start=0):
2     n = start
3     for elem in sequence:
4         yield n, elem
5         n += 1

用于for循环:

1 for i,j in enumerate(seasons):
2     print(i,j)

输出:

0 Spring
1 Summer
2 Fall
3 Winter

(2020/4/9出现于两数之和,在python中用字典模拟hash表,牺牲空间复杂度换取时间复杂度)
* 关于列表的操作 添加/合并:

list.append(obj) 在列表末尾添加对象
list.extend(seq) 在列表末尾添加seq序列的所有元素,实现列表的合并
+ 操作符: 列表使用"+"相加实现列表的合并,效果同extend()
list.insert(index, obj) 将指定对象插入到列表中指定位置处

删除:

list.pop([index=-1]) 将列表指定位置的元素弹出(默认最后一个),并且返回值为弹出的元素
list.remove(obj) 将列表中的第一个obj删除

(2020/4/11无重复字符的最长子串,用暴力解法会超出时间限制,用动态规划解决)

Original: https://www.cnblogs.com/AICROC/p/12672129.html
Author: 生于思考
Title: Leetcode Python笔记

相关阅读2

Title: 北京大学慕课:Tensorflow笔记 9.1真实复杂场景手写英文体识别(复现笔记)

北京大学慕课:Tensorflow笔记 9.1真实复杂场景手写英文体识别(复现笔记)

慕课地址:
https://www.icourse163.org/learn/PKU-1002536002?tid=1206591210#/learn/announce

实验代码:
https://github.com/zlsdu/ocr-handwriting-recognition

前言

本人最近需要做ocr相关任务,看到这个项目,想尝试运行试试,下面简单记录一下。

一、配置

  • 系统:Win10
  • 显卡:1660Ti
  • python3.7
  • tensorboard==1.15.0
  • tensorflow==1.15.0
  • tensorflow-estimator==1.15.1
  • tensorflow-gpu==1.15.0
  • CUDA10.0
  • cudnn7

(只列出了主要配置,一些需要的库缺少的话,直接pip install)

二、准备工作

运行process1.py和process2.py来准备数据集:

python process1.py
python process1.py

三、训练模型

python train_model.py

刚开始:
BN和神经网络调优

后来:
BN和神经网络调优

四、测试模型

python test_model.py

图片:
BN和神经网络调优
识别结果:
BN和神经网络调优

补充:

1. 过程中遇到的问题1:某地址不存在

原因分析

文件夹不存在,所以无法在该文件夹里创建文件。

解决方案

根据提示,创建文件夹。
PS:要是我没记错,创建的文件夹有:

train_img
train_txt
test_img
test_txt

2. 过程中遇到的问题2:在执行line=line[0]时下标超出范围

原因分析

访问列表下标为0的元素还能超出范围,就只能是这个列表为空。所以根据代码逻辑,这个line为空是训练集中某个标注(.txt文件)为空。

解决方案

debug后能发现出错的文件。将这个.txt文件与对应的.png文件删除。
PS:我删除了的文件有:

train_img\3_80301602_1.png
train_txt\3_80301602_1.txt
train_img\3_80301604_1.png
train_txt\3_80301604_1.txt

3. 过程中遇到的问题3:已经解压装有模型的压缩包后,restore模型时仍找不到这个模型的文件

原因分析

解压时,我选择了解压到...(E),然后这个导致了解压出来的文件夹有双层,所以模型的地址不正确导致无法restore模型。

解决方案

有两种办法:

  1. 打开装有模型的那两层文件夹,将模型文件放到上一层目录
    or
  2. 修改代码中模型的地址,多加一层文件夹名称

我选择的是第一种方法。

4. 数据集问题

在测试过程中,发现数据的标签存在一些错误,例如:
BN和神经网络调优
↑这里可以看出原图片中写着about my good friend,但标签里写的是about my send friend。

Original: https://blog.csdn.net/xswl5148/article/details/124001736
Author: Limulの小白笔记
Title: 北京大学慕课:Tensorflow笔记 9.1真实复杂场景手写英文体识别(复现笔记)

相关阅读3

Title: 音频基础 2

02|如何量化分析语音信号?

语音的基本特征

语音按照发音原理可以分为清音和浊音,语音的音调、能量分布等信息可以用基频、谐波、共振峰等特征来分析。为了更好地分析语音,先来看看语音是如何产生的?

浊音和清音

可以结合下图的人体发音器官结构示意图来看一下语音是如何产生的。

BN和神经网络调优

声道就是声音传播所通过的地方。发音的声道主要是指三个腔体,即咽腔、口腔和鼻腔。而语音是由声源和声道共同作用产生的。按照声源的不同把语音分成以下两类:

第一类是 声带振动作为声源产生的声音,把它们叫做浊音。比如拼音中的 "a,o,e" 等。

第二类是 由气体在经过唇齿等狭小区域由于空气与腔体摩擦而产生的声音,把它们叫做清音。比如拼音中的 "shi、chi、xi" 等。那么清音和浊音的声源不同在频谱上有什么样的差异呢?先来看看语音的频谱图。
BN和神经网络调优

标题语音的频谱图时域图(上)和频域图(下)

上图中显示的是"实时音视频互动"这几个字的音频信号的时域图和频域图(频谱图)。 时域就是信号幅度和时间的关系,而频域指的是能量与时间和频率的关系

频域更方便观察不同频率的能量分布。可以看到浊音,比如最后两个字"互动"是明显的有规律的能量分布,即低频能量大于高频且有明显的能量比较集中的地方,如频谱图中的亮线。而"实时"和"视"这几个字,都有 "sh" 这个由牙齿间高速气流产生的清音。清音在频谱上显示为比较均匀的分布。在 13kHz 的高频,清音也有不少的能量。

根据这个简单的分布规律已经可以 从频谱上分辨清浊音了。接下来再来看看,还能从有明显能量分布的浊音的频谱中得到哪些信息。

基频

在发浊音的时候,声带会振动从而产生一个声波,把这个声波叫做基波,并且 把基波的频率叫做基频(一般用 F0 来表示)。 这个基频其实就可以对应到我们平时所说的音调。比如,唱歌音调比较高,其实就是声音基频比较高。一般来说,男生的正常说话基频在 100~200Hz 之间,而女生的则会高一些,在 140~240Hz 之间。这就是为什么女生的声音听起来比男生的尖锐一些。基频会随年龄变化而变化,比如小孩的基频比较高,可以达到 300Hz,而年龄越大则基频会越来越低。基频的能量对应的是浊音频谱中频率最低的亮线。

谐波

声带振动产生的基波,在传输过程中会在声道表面反复碰撞反射,从而产生许多频率倍数于基频的声波,通常把这些声波叫做谐波。按照谐波频率从低到高,依次叫 1 次谐波,2 次谐波等等。下图中可以看一下基频信号和谐波信号在时域上的样子。
BN和神经网络调优

基波与谐波

谐波频率和基频是浊音能量集中的地方,这也就是为什么我们能看见浊音的频谱是一个栅格的形状。

共振峰

一个 200Hz 基频的浊音,大部分的能量都分布在 200Hz 以及 200Hz 的整数倍的频率上。那么是什么决定了哪个谐波的能量高、哪个谐波的能量低呢?

由于高次谐波是由低次谐波在腔体表面碰撞反射得到的,并且碰撞反射会导致能量的衰减,但在看频谱图的时候发现谐波信号并不是从低到高依次衰减的。这是为什么呢?

这是因为在这个浊音的产生过程中,声源的振动信号通过声道时,声道本身也会发生共鸣,与声道共振频率相近的能量会被增强,远离声道共振频率的部分则会被衰减,从而谐波的能量就组成了一组高低起伏的形状包络, 把这些包络中的巅峰位置叫做共振峰。比如下图中英文单词 father 中的 "a" 这个音可以看到明显的三个共振峰,频率分别为 750Hz、1100Hz、2600Hz。
BN和神经网络调优

共振峰示意图

频率从低到高分别用 F1、F2、F3 等来表示第一共振峰、第二共振峰、第三共振峰等。

从图中可以看到,发不同的音,比如 "a、i、u" 等,共振峰的位置和峰值都是不一样的。这是因为之前说的声道的三个腔体随发音的不同,开合、形状都会发生变化。从而形成了不同的腔体共振频率。所以,共振峰的位置和幅度就和发音可以一一对应起来了。这其实也是语音识别背后的原理之一,即 通过共振峰的位置和能量分布来识别音频代表的语音

语音信号的分析

现在对语音是怎么产生的已经能够理解了,那接下来分别从时域、频域这两个方面来介绍几个常用的语音分析的方法。因为窗函数常作为时域或频域实时分析的前处理步骤,所以在介绍这些语音分析方法之前,先介绍一下窗函数。

窗函数

分析音频时域或频域特征随时间的变化时,需要按照时间把音频截断成一个个小片段,每个小片段也就是我们说的音频帧。比如 10ms 的切片为 1 帧。

但如果直接截断信号则会导致频谱泄漏,即出现不该有的频谱分量。比如,对一个 50Hz 的单频信号直接截断,可能会出现 60Hz、200Hz 的能量分量。因此, 一般采用加窗,即在原有信号中乘一个两端为 0 的窗信号,来减少截断信号时的频谱泄漏。常用的窗函数有 Haning(汉宁窗)、Hamming(汉明窗)、Blackman(布莱克曼窗)等。在时域上加窗(Haning)的过程如图所示:
BN和神经网络调优

时域加窗过程

可以看到上图加窗的过程其实就是输入信号乘以窗函数,得到了一个两边小、中间高的新信号。

时域分析

了解了窗函数,现在来看看时域分析。在时域上主要介绍两个指标,短时能量和短时平均过零率。

短时能量

由于语音的能量随时间的变化较快,比如能量小的时候可能就是没有在说话,而能量大的地方可能是语音中重读的地方。因此,短时能量常被用来判断语音的起止位置或者韵律。短时能量分析的定义如公式所示:

BN和神经网络调优

其中,x 代表采样点,w 代表窗函数。 第 n 个点的短时能量 En​ 就是由加窗后的采样信号的平方和来表示的。由于不涉及频谱分析,因此这里的窗可以使用简单的矩形窗。短时能量主要有以下 3 个方面的应用:

  1. 可以用来区分清浊音。一般来说,清音部分的能量比浊音部分的能量要小很多。

  2. 可以用来区分有声段和无声段。比如,可以设置一个能量阈值作为判断该语音段是否为静音段的条件。

  3. 能量的起伏在语音识别里也被用于判断韵律(比如重读音节)的特征。

短时平均过零率

短时平均过零率,顾名思义,就是每帧内信号通过零值的次数。连续的音频信号是围绕 0 值上下波动的,并且表现为音频信号正负号随时间不断切换。短时平均过零率可以通过下列公式来计算。

BN和神经网络调优

其中,N 为一帧中包含的信号点数,sgn 为符号函数,x 为音频采样点。

如果是 正弦信号,例如基频和谐波信号,它们的短时平均过零率,就是 信号的频率除以两倍的采样频率

短时平均过零率在一定程度上可以表示语音信号的频率信息。由于清音的频率集中的范围要高于浊音,所以浊音的过零率要低于清音,从而 可以初步用短时平均过零率来判断清浊音。

除了判断清浊音。还可以 将短时能量和短时平均过零率结合起来判断语音起止点的位置。在背景噪声较小的情况下,短时能量比较准确;但当背景噪声比较大时,短时平均过零率有较好的效果。因此,一般的音频识别系统就是通过这两个参数相结合,来判断待检测语音是否真的开始。

频域分析

上面讲了基于时域的两种语音分析方法,接下来学习基于频域的两种语音分析方法:短时傅里叶变换和梅尔谱。

短时傅里叶变换

短时傅里叶变换(Short-time Fourier Transform)是音频频域分析最常用的方法之一,简称 STFT。那它有什么作用呢?在分析音频信号时经常会使用到频谱图,那你知道这个频谱图是怎么得到的吗?

结合短时傅里叶变换的步骤(如下图所示),也许你就明白了:

首先,对时域信号加滑动窗,在把音频切成若干个短帧的同时,防止频谱泄漏(窗可以使用汉宁窗)。

然后,对每一帧做快速傅里叶变换(Fast Fourier Transform,简称 FFT),把时域信号转换为复数频域信号。
BN和神经网络调优

短时傅里叶变换示意图

上图 中的 Hop Length 代表滑动窗移动一次的距离,并且 Overlap Length 就是两个相邻滑动窗重叠的范围。

清楚了这些,就可以回答刚才的问题了。其实呢, 是把短时傅里叶变换的结果对复数频域信号求模,并取对数转换成分贝(dB),然后用热力图的形式展示出来,这样就能得到频谱图。频谱图的横坐标为时间,纵坐标为频率,并且 热力图中的颜色代表每个频点在当前时刻的能量大小。这样就可以通过频谱图来观察每个时刻的语音能量分布了。

梅尔谱(Mel spectrum)

上面通过短时傅里叶变换得到的频谱图通常也叫做声谱、线性谱或者语谱。

由于心理和听力系统的构造,其实人耳对以 Hz 为单位的频率并不是很敏感。比如,人类很难区分 500Hz 和 510Hz 的声音。我们平时能区分的音调都是以指数排列的。比如,我们说的高八度其实就是把原有频率乘以 2。因此,用对数的频率坐标来表示可以更好地反映人的实际听感。

除此之外,人耳对不同频率声音大小的感知也是不同的。如下图所示,红线代表人耳感知到的响度和实际声压的对应关系,人耳感知的响度一般用 phon(方)来表示。
BN和神经网络调优

人耳音量感知等响曲线

由上图可以看到,人类在 4kHz 的频率对声音的响度比较敏感,而在两端的高频和低频则需要更强的声压,人类才能感知。这其实和人类的进化有关,4kHz 多为猛兽的叫声能量分布范围,所以人耳对这类危险的频率较为警觉。

因此,为了结合人耳对频率的感知。需要使用对数的频率坐标,且通过分配滤波器组对频谱图的能量按照听感重新分配,于是就有了梅尔谱等表示形式。

Mel 谱的计算步骤分为下面几步:

首先,对语音信号进行预加重(平衡高低频能量);

然后,语音信号通过 STFT 得到频率谱;

最后,通过三角滤波器组对频率谱逐帧进行滤波。

三角滤波器组如图 8 所示。可以看到三角滤波器组把频率划分成了若干个频段。敏感的频段滤波器分布比较密集,而不敏感的频段比较稀疏,这样就能更好地表征人耳的实际听感。
BN和神经网络调优

梅尔谱中的三角滤波器

梅尔谱以及对梅尔谱再进一步求倒谱系数得到的 MFCC(梅尔倒谱系数),经常被用于语音识别、声音事件识别等领域。其实类似的基于人耳实际听感的表示还有Bark 谱、Gamma Tone Filter 等,这里就不一一赘述了。

小结

语音根据发音原理的不同可分为清音和浊音,并且根据它们在频谱图上的分布规律,可以从频谱上分辨清浊音。

只有浊音才有基频和谐波。将发浊音时声带振动产生的声音叫基波,并且将基波的频率叫做基频。基频对应我们平时所说的音调,而谐波是频率倍数于基频的声波。

共振峰表示发音受腔体形状影响。共振峰的位置和幅度可以和发音一一对应,从而可以通过共振峰的位置和能量分布来识别音频代表的语音。

在做音频分析的时候需要对音频信号进行截断,而这会导致频谱泄漏。加窗可防止频谱泄漏。

短时能量和短时平均过零率是时域分析的常见指标。它们可用于判断清、浊音以及语音的起止位置。

频域分析常使用短时傅里叶变换和梅尔谱等方法,并且梅尔谱更能反映人耳的实际听感。

Original: https://blog.csdn.net/qq_37756660/article/details/123465314
Author: Rye
Title: 音频基础 2