目录
- 相应模块
- 1. librosa——音频处理库
- 2. os——文件/目录方法
- 3. pyworld——语音合成系统WORLD
- 4. glob——查找文件路径
- 5. argparse——命令行参数解析包
- 6. shlex,subprocess——分割字符串
- 7. zipfile——解压/压缩文件
- 8. datetime——日期时间
- 9. iter 与next,以及 yield ——迭代器与生成器
- 10. ast
- 11. torch.view(),torch.size()
- 12. torch.cat
- 13. matplotlib
- 14. config.yaml
- 15. repeat()
- 17. 模型训练时损失出现Nan,解决方案
- 18. torch.unsqueeze,unsqueeze_
- 19. Python中函数 eval 和 ast.literal_eval 的区别详解
- 20. LabelBinarizer 标签二值化,one-hot标签,LabelBinarizer().fit(),LabelBinarizer().fit_transform()
- 21. pytorch中的numel函数
- 22. pytorch中优化器optimizer.param_groups[0]是什么意思
- 23. numpy.asarray
- 24. torch.randperm()
- 25. torch关于获取损失值,loss,loss.data,loss.datach(),loss.item()
相应模块
import librosa
import numpy as np
import os
import pyworld
import pyworld as pw
import glob
import argparse
import shlex, subprocess
import zipfile
from datetime import datetime
from collections import OrderedDict
# OrderedDict是有序字典,“有序”是指它可以记住向字典里添加元素的顺序。
self.layers = OrderedDict()
1. librosa——音频处理库
librosa语音信号处理
音频处理库—librosa的安装与使用
安装指令:conda install -c conda-forge librosa
>>>wav, sr = librosa.load(filename, sr=None) # librosa 音频读取函数load( ),sr采样率参数
>>>y, index = librosa.effects.trim(wav, top_db=15) # 移除开始和结尾的静音
1.1 librosa.util.find_files
2. os——文件/目录方法
>>>os.path.exists(path)
>>> os.makedirs(path)
2.1 os.path.basename()
用到os.path.basename(),返回path最后的文件名。若path以/或\结尾,那么就会返回空值
eg:
path=’/a/b/c/CSDN’
os.path.basename(path)=CSDN
3. pyworld——语音合成系统WORLD
4. glob——查找文件路径
glob.glob() 函数
glob.glob() 函数接受通配模式作为输入,并返回所有匹配的文件名和路径名列表
allwavs_cnt = glob.glob(f'{dataset}/*/*.wav')
5. argparse——命令行参数解析包
argparse基本用法
argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数
# ArgumentParser类生成一个parser对象
# 通过对象的add_argument函数来增加参数,这里增加了两个参数
# 其中'--name'表示一个参数,default参数表示我们在运行命令时若没有提供参数,程序会将此值当做参数值
# 当'-'和'--'同时出现的时候,系统默认后者为参数名,前者不是,但是在命令行输入的时候没有这个区分
import argparse
def main():
parser = argparse.ArgumentParser(description="Demo of argparse")
parser.add_argument('-n','--name', default=' Li ')
parser.add_argument('-y','--year', default='20')
args = parser.parse_args()
print(args)
name = args.name
year = args.year
print('Hello {} {}'.format(name,year))
if __name__ == '__main__':
main()
# 文件名为:demo.py
# 方法一,执行命令:python demo.py # 使用默认参数
# 方法二,执行命令:python demo.py --name Zhangsan --year 30 # 传入参数
# 执行命令:python demo.py -h 可以查看帮助信息
6. shlex,subprocess——分割字符串
Python shlex 模块
shlex 模块最常用的是 split() 函数,用来分割字符串,通常与 subprocess 结合使用
>>>train_comm = shlex.split(train_comm) # shlex 模块最常用的是 split() 函数,用来分割字符串,通常与 subprocess 结合使用
>>>subprocess.run(train_comm) # subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
7. zipfile——解压/压缩文件
"""
#解压
zfile=zipfile.ZipFile("../test.zip","r")
zfile.extractall()
"""
with zipfile.ZipFile(zip_filepath) as zf:
zf.extractall(dest_dir)
print("Extraction complete!")
8. datetime——日期时间
9. iter 与next,以及 yield ——迭代器与生成器
迭代器有两个基本的方法:iter() 和 next()。
https://www.runoob.com/python3/python3-iterator-generator.html
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
10. ast
https://blog.csdn.net/ma89481508/article/details/56017697
11. torch.view(),torch.size()
PyTorch中view的用法
torch x = x.view(x.size(0),-1)的理解
import torch
a = torch.rand(2, 3)
print(a)
print(a.size(), a.size(0), a.size(1)) # size()返回tensor中元素的数量,size(0)表示第1维, size(1)表示第2维
print(a.view(6)) # 第1维6个元素
print(a.view(1, 6)) # 把原先tensor中的数据按照行优先的顺序重新定义维数,第1维1个元素,第2维6个元素
b = a.view(a.size(0), a.size(1),1,1) # 第1维a.size(0)个元素,第2维a.size(1)个元素,第3维和第4为分别1个元素
print(b)
"""
tensor([[0.7983, 0.6932, 0.8069],
[0.6720, 0.2980, 0.9417]])
torch.Size([2, 3]) 2 3
tensor([0.7983, 0.6932, 0.8069, 0.6720, 0.2980, 0.9417])
tensor([[0.7983, 0.6932, 0.8069, 0.6720, 0.2980, 0.9417]])
tensor([[[[0.7983]],
[[0.6932]],
[[0.8069]]],
[[[0.6720]],
[[0.2980]],
[[0.9417]]]])
"""
12. torch.cat
通过 help((torch.cat)) 可以查看 cat 的用法
cat(seq,dim,out=None)
其中 seq表示要连接的两个序列,以元组的形式给出,例如:seq=(a,b), a,b 为两个可以连接的序列
dim 表示以哪个维度连接,dim=0, 横向连接
dim=1,纵向连接
import torch
x0_data = torch.randn((2, 2))
print("x0_data:")
print(x0_data)
print("-----------------------------------------------------")
x1_data = torch.randn((2, 2))
print("x1_data:")
print(x1_data)
print("-----------------------------------------------------")
# dim=1
y1_data = torch.cat((x0_data, x1_data), dim=1)
print("x_data:")
print(y1_data)
print('x_data的形状:', y1_data.shape)
print("-----------------------------------------------------")
# dim=0
y1_data = torch.cat((x0_data, x1_data), dim=0)
print("x_data:")
print(y1_data)
print('x_data的形状:', y1_data.shape)
13. matplotlib
matplotlib subplots 调整子图间矩:
plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
wspace=None, hspace=None)
- 参数说明:
top、bottom、left、right:整个图距离上下左右边框的距离
wspace、hspace:这个才是调整各个子图之间的间距
wspace:调整子图之间的横向间距
hspace:调整子图之间纵向间距
14. config.yaml
-
安装Python包:pyyaml
-
YAML简介:https://blog.csdn.net/fengbingchun/article/details/88090609
-
在Python中可以通过pyyaml来解析或生成yaml文件,以下是yaml测试文件(config.yml):
# config file:
---
blog:
name: csdn
id: fengbingchun
url: https://blog.csdn.net/fengbingchun
commands:
version:
- g++ --version
- cmake --version
value1: true
value2: false
number1: 123
number2: !!str 123
github:
- https://github.com/fengbingchun
- Repositories NN_Test Face_Test
Messy_Test CUDA_Test
data1: |
There once
was a
short man
data2: >
There once
was a
short man
date1: 2019-03-03
step: &id001 # defines anchor label &id001
instrument: Lasik 2000
pulseEnergy: 5.4
step2: *id001 # refers to the first step (with anchor &id001)
...
- python测试代码:
import sys
import yaml
def main():
print("#### test start ####")
f = open("config.yml")
content = yaml.load(f)
print(content)
print("#### test end ####")
if __name__ == "__main__":
main()
输出:
{'blog': {'name': 'csdn', 'id': 'fengbingchun', 'url': 'https://blog.csdn.net/fengbingchun'}, 'commands': {'version': ['g++ --version', 'cmake --version']}, 'value1': True, 'value2': False, 'number1': 123, 'number2': '123', 'github': ['https://github.com/fengbingchun', 'Repositories NN_Test Face_Test Messy_Test CUDA_Test'], 'data1': 'There once\nwas a\n short man\n', 'data2': 'There once was a\n short man\n', 'date1': datetime.date(2019, 3, 3), 'step': {'instrument': 'Lasik 2000', 'pulseEnergy': 5.4}, 'step2': {'instrument': 'Lasik 2000', 'pulseEnergy': 5.4}}
15. repeat()
15.1 numpy.repeat
numpy.**repeat**(a, repeats, axis=None)
功能:
将矩阵A按照给定的axis将每个元素重复repeats次数
参数:
a:输入矩阵, repeats:每个元素重复的次数, axis:需要重复的维度
返回值:
输出矩阵
>>> np.repeat(3, 4)
array([3, 3, 3, 3]) #每个元素重复4次
>>> x = np.array([[1,2],[3,4]])
>>> np.repeat(x, 2)
array([1, 1, 2, 2, 3, 3, 4, 4]) #每个元素重复两次
>>> np.repeat(x, 3, axis=1)
array([[1, 1, 1, 2, 2, 2],
[3, 3, 3, 4, 4, 4]]) #每个元素按照列重复3次
>>> np.repeat(x, [1, 2], axis=0)
array([[1, 2],
[3, 4],
[3, 4]]) #第1行元素重复1次,第2行元素重复2次
15.2 numpy.repeat
PyTorch:repeat方法的使用
import torch
x0_data = torch.randn((2, 2))
print("x0_data:")
print(x0_data)
print("-----------------------------------------------------")
c_tmp = x0_data.repeat(1, 2)
print("c_tmp:")
print(c_tmp)
print(c_tmp.size())
print("-----------------------------------------------------")
c_tmp = x0_data.repeat(2, 1)
print("c_tmp:")
print(c_tmp)
print(c_tmp.size())
print("-----------------------------------------------------")
17. 模型训练时损失出现Nan,解决方案
- 损失出现问题:
- 损失为nan的原因
-
学习率过大,导致
其他原因,参考:警惕!损失Loss为Nan或者超级大的原因 -
解决方式
降低学习率
18. torch.unsqueeze,unsqueeze_
- torch.unsqueeze 详解
torch.unsqueeze(input, dim, out=None)
- **作用:**扩展维度
返回一个新的张量,对输入的既定位置插入维度 1
import torch
print("输出:x")
x = torch.linspace(-1, 1, 5)
print(x)
print(x.dim())
print("------unsqueeze(), dim=1 ------, x → x1")
print("输出:x1")
x1 = torch.unsqueeze(x, dim=1)
print(x1)
print(x1.dim())
print("------unsqueeze(), dim=0 ------, x → x2")
print("输出:x2")
x2 = torch.unsqueeze(x, dim=0)
print(x2)
print(x2.dim())
print("------squeeze(), dim=0 ------, x2 → x3")
print("输出:x3")
x3 = torch.squeeze(x2, dim=0)
print(x3)
print(x3.dim())
print("------squeeze(), dim=1 ------, x1 → x3")
print("输出:x4")
x4 = torch.squeeze(x1, dim=1)
print(x4)
print(x4.dim())
- unsqueeze_和 unsqueeze 的区别
unsqueeze_ 和 unsqueeze 实现一样的功能,区别在于 unsqueeze_ 是 in_place 操作,即 unsqueeze 不会对使用 unsqueeze 的 tensor 进行改变,想要获取 unsqueeze 后的值必须赋予个新值,unsqueeze_ 则会对自己改变。
19. Python中函数 eval 和 ast.literal_eval 的区别详解
一、eval 函数
Python中,如果要将字符串型的 list,tuple,dict 转变成原有的类型呢 ?
这个时候你自然会想到eval
eval函数在 Python 中做数据类型的转换还是很有用的。
它的作用就是把数据还原成它本身或者是能够转化成的数据类型。
https://blog.csdn.net/nanhuaibeian/article/details/102143356?
20. LabelBinarizer 标签二值化,one-hot标签,LabelBinarizer().fit(),LabelBinarizer().fit_transform()
from sklearn.preprocessing import LabelBinarizer
speakers = ['SF1', 'SF2', 'TM1', 'TM2']
x = LabelBinarizer()
Y = LabelBinarizer().fit(speakers)
Z = LabelBinarizer().fit_transform(speakers)
对于标称型数据来说,preprocessing.LabelBinarizer
是一个很好用的工具。比如可以把yes和no转化为0和1,或是把incident和normal转化为0和1。当然,对于两类以上的标签也是适用的。这里举一个简单的例子,说明将标签二值化以及其逆过程。
示例1:
from sklearn.preprocessing import LabelBinarizer
import random
# help(preprocessing.LabelBinarizer)#取消注释可以查看详细用法
# 标签矩阵
speakers = ['SF1', 'SF2', 'TM1', 'TM2']
# 将标签矩阵二值化
lb = LabelBinarizer()
# 返回标签矩阵
dummY = lb.fit_transform(speakers)
print(dummY)
# qiu-11-5: 返回一个实例对象
spk_enc = LabelBinarizer().fit(speakers)
print(spk_enc)
speaker = ['SF1', 'SF2', 'TM1', 'TM2']
target = random.choice([x for x in speakers if x != speaker])
print(target)
label_t = spk_enc.transform([target])[0] # 调用实例对象中对应的标签
label_t2 = spk_enc.transform([target]) # 调用实例对象中对应的标签
print(label_t)
print(label_t2)
结果1:
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]]
LabelBinarizer()
TM1
[0 0 1 0]
[[0 0 1 0]]
示例2:
# -*- coding: UTF-8 -*-
from sklearn import preprocessing
from sklearn import tree
# help(preprocessing.LabelBinarizer)#取消注释可以查看详细用法
# 特征矩阵
featureList=[[1,0],[1,1],[0,0],[0,1]]
# 标签矩阵
labelList=['yes', 'no', 'no', 'yes']
# 将标签矩阵二值化
lb = preprocessing.LabelBinarizer()
dummY=lb.fit_transform(labelList)
# print(dummY)
"""
[[1]
[0]
[0]
[1]]
"""
# 模型建立和训练
clf = tree.DecisionTreeClassifier()
clf = clf.fit(featureList, dummY)
p=clf.predict([[0,1]])
print(p) # [1]
# 逆过程
yesORno=lb.inverse_transform(p)
print(yesORno) # ['yes']
21. pytorch中的numel函数
获取tensor中一共包含多少个元素
import torch
x = torch.randn(3,3)
print("number elements of x is ",x.numel())
y = torch.randn(3,10,5)
print("number elements of y is ",y.numel())
输出:
number elements of x is 9
number elements of y is 150
22. pytorch中优化器optimizer.param_groups[0]是什么意思
optimizer.param_groups:是长度为2的list,其中的元素是2个字典;
optimizer.param_groups[0]:长度为6的字典,包括[‘amsgrad’, ‘params’, ‘lr’, ‘betas’, ‘weight_decay’, ‘eps’]这6个参数
optimizer.param_groups[1]:好像是表示优化器的状态的一个字典
pytorch 入门 修改学习率
知识点1、访问optimizer的参数,并修改
知识点2、多个模型下修改参数
知识点3、修改指定epoch下的参数
import numpy as np
import torch
from torch import nn
import torch.nn.functional as F
from torch.autograd import Variable
from torchvision.datasets import CIFAR10
from jc_utils import resnet
from torchvision import transforms as tfs
from datetime import datetime
知识点1
optimizer.param_groups[0][‘lr’] 如果把模型分为好几块,【0】就代表第一块,一般只有一块,[‘lr’]这里是字典 通过这种方式可以访问到optimizer内部的参数,从而做到更改
net = resnet(3, 10)
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, weight_decay=1e-4)
print('learning rate:{}'.format(optimizer.param_groups[0]['lr']))
print('weight decay:{}'.format(optimizer.param_groups[0]['weight_decay']))
optimizer.param_groups[0]['lr'] = 1e-5
print('learning rate:{}'.format(optimizer.param_groups[0]['lr']))
知识点2
如果有多层,可以for一下,全部修改
for param_group in optimizer.param_groups:
param_group['lr'] = 1e-1
知识点3
修改指定epoch的学习率pytorch 入门 修改学习率
23. numpy.asarray
24. torch.randperm()
torch.randperm(n):将0~n-1(包括0和n-1)随机打乱后获得的数字序列,函数名是random permutation缩写
实例:
import torch
label = torch.randperm(10)
print(label) # tensor([0, 9, 4, 5, 1, 3, 6, 8, 2, 7])
25. torch关于获取损失值,loss,loss.data,loss.datach(),loss.item()
import torch
from torch.autograd import Variable
loss_f = torch.nn.MSELoss()
x = Variable(torch.randn(100, 100), requires_grad=True)
y = Variable(torch.randn(100, 100), requires_grad=True)
loss = loss_f(x, y)
loss.backward()
print("loss: ", loss)
print("loss.data: ", loss.data)
print("loss.detach(): ", loss.detach())
print("loss.item(): ", loss.item())
结果:
loss: tensor(2.0196, grad_fn=<MeanBackward0>)
loss.data: tensor(2.0196)
loss.detach(): tensor(2.0196)
loss.item(): 2.0196409225463867