主要依赖的库:pytorch,torchvision
torchvision用于导入自带的数据,类型Tensor了解。
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解_ZZY_dl的博客-CSDN博客_f.softmax函数
防止过拟合。dropout
import torch
import torch.nn as nn
import torch.autograd as autograd
m = nn.Dropout(p=0.8)
n = nn.Dropout2d(p=0.8)
input = autograd.Variable(torch.randn(1, 2, 6, 3)) ## 对dim=1维进行随机置为0
print(m(input))
print('****************************************************')
print(n(input))
input
Tensor数组变形操作
a = torch.arange(1, 17)
a.view(4, 4) #
a.view(-1,4).shape
import torch
import torch.utils.data as Data
'''
批训练,把数据变成一小批一小批数据进行训练。
DataLoader用来包装所使用的数据,每次抛出一批数据
'''
BATCH_SIZE = 5
x = torch.linspace(1, 11, 11)
y = torch.linspace(11, 1, 11)
print(x)
print(y)
# 把数据放在数据库中
torch_dataset = Data.TensorDataset(x, y)
loader = Data.DataLoader(
# 从数据库中每次抽出batch size个样本
dataset=torch_dataset,
batch_size=BATCH_SIZE,
shuffle=True,
# num_workers=2,
)
训练
梯度初始化为零,把loss关于weight的导数变成0
optimizer.zero_grad() # 梯度初始化为零,把loss关于weight的导数变成0
output = model(data) # forward:将数据传入模型,前向传播求出预测的值
loss = F.cross_entropy(output, target) # 求loss
loss.backward() # backward:反向传播求梯度
optimizer.step() # optimizer:更新所有参数
对于多分类问题,可以采用以下 负对数似然函数进行loss计算
loss = F.nll_loss(output, target)# 求loss
#F.nll_loss(y_pred,y_test)#负对数似然函数
#多分类任务,NLLLoss 函数输入 input 之前,
#需要对 input 进行 log_softmax 处理,
#即将 input 转换成概率分布的形式,并且取对数,底数为 e
#loss = F.nll_loss(y_pred, y_test)
loss = F.nll_loss(output, target)# 求loss
在训练模型时会在前面加上:
model.train()
在测试模型时在前面使用:
model.eval()
如果不写这两个程序也可以运行,这两个方法是针对在网络训练和测试时采用不同方式的情况,比如Batch Normalization
和Dropout
。
训练时是针对每个min-batch的,是一批样本数据,,但是在测试中往往是针对单张图片,是单独的样本数据,视为min-batch就是一张图片,一个单独的样本。由于网络训练完毕后参数都是固定的,因此每个批次的均值和方差都是不变的,因此直接结算所有batch的均值和方差。
所有Batch Normalization的训练和测试时的操作不同。
with torch.no_grad()语句
【pytorch系列】 with torch.no_grad():用法详解_大黑山修道的博客-CSDN博客_torch.no_grad():
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭/线程中锁的自动获取和释放等。
首先从requires_grad讲起:
requires_grad
在pytorch中,tensor有一个requires_grad参数,如果设置为True,则反向传播时,该tensor就会自动求导。tensor的requires_grad的属性默认为False,若一个节点(叶子变量:自己创建的tensor)requires_grad被设置为True,那么所有依赖它的节点requires_grad都为True(即使其他相依赖的tensor的requires_grad = False)
当requires_grad设置为False时,反向传播时就不会自动求导了,因此大大节约了显存或者说内存。
with torch.no_grad的作用
在该模块下,所有计算得出的tensor的requires_grad都自动设置为False。
x1 = torch.randn(10, 5, requires_grad = True)
y1 = torch.randn(10, 5, requires_grad = True)
z1 = torch.randn(10, 5, requires_grad = True)
with torch.no_grad():
w1 = x1 + y1 + z1
print('w1.requires_grad is',w1.requires_grad)
print('w1.grad_fn is',w1.grad_fn)
print('w1.requires_grad is',w1.requires_grad)
#网络预测
def test():
network.eval()#预测时使用
test_loss = 0#损失率
correct = 0#正确率
with torch.no_grad():
for data, target in test_loader:
output = network(data)# forward:将数据传入模型,前向传播求出预测的值
test_loss += F.nll_loss(output, target, reduction='sum').item()## 求loss并累加
pred = output.data.max(1, keepdim=True)[1]#soft max
correct += pred.eq(target.data.view_as(pred)).sum()
output.data.max(1, keepdim=True)[1]
output.data.max(1, keepdim=True)[1]中的1表示,找第2维的最大值;[1]表示,output.data.max(2, keepdim=True)会返回一个数组,第一个是output数组中第2维度的最大值是多少,第二个是最大值的位置在哪里
找第一维度的最大值predict = output.data.max(0, keepdim=True)[1]
找第三维度的最大值predict = output.data.max(2, keepdim=True)[1]
torch.max()的用法 predict1 = torch.max(output, 2, keepdim=True)[1],结果与output.data.max(1, keepdim=True)[1] 一模一样
深度学习训练Torch使用到的模块汇总_手口一斤的博客-CSDN博客_torch模块
view与view_as区别
Pytorch之view及view_as_啧啧啧biubiu的博客-CSDN博客_view_as
Pytorch常用函数_Saul Zhang的博客-CSDN博客_pred.t()
torch.eq()函数
比较两向量是否相等,两个向量的维度必须一致,如果相等,对应维度上的数为1,若果不相等则对应位置上的元素为0.
怎么编写一个自定义的网络,参考下面的
pytorch教程之nn.Module类详解——使用Module类来自定义模型_LoveMIss-Y的博客-CSDN博客_torch.nn.module
梯度下降法,学习权重,基本公式如下,在纯梯度下降法中, 用处的一阶导数值近似得到,对于梯度下降法的优化,只能从两个角度去优化,分别就是学习率和,前者称为自适应学习率算法改进,后者称为动量法。对于大量的数据,往往取一个小样本计算,取得到的梯度均值,据此作为的近似。在torch中的实现参考下面的链接。
PyTorch学习之 torch.optim 的6种优化器及优化算法介绍_Line_Walker的博客-CSDN博客_lr_decay
Windows配置pytorch+CUDA
PyTorch配置CUDA_chenqiyyy的博客-CSDN博客_pytorch配置cuda
记录一些文档
https://handbook.pytorch.wiki/index.html
Pytorch中文百科
https://pytorch.apachecn.org/#/docs/1.7/19
https://docs.pytorch.wiki/en/
python得到当前文件夹下所有文件夹、文件,代码
import os
i=0
file_dir = r"C:/Users/86182/data_wx/mobilenetv3-master/data/splitData/test"
a = os.walk(file_dir)
b = None
for root, dirs, files in os.walk(file_dir):
print('i',i)
i += 1
#print('root',root) #当前目录路径
#print('dir',dirs) #当前路径下所有子目录
print('files',files) #当前路径下所有非目录子文件
print('b',b)