cnn 部分初级代码

主要依赖的库: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,
)

训练

optimizer.zero_grad() 功能

梯度初始化为零,把loss关于weight的导数变成0

每个batch必定执行的操作步骤

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)


 

cnn 部分初级代码_第1张图片

#网络预测
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

cnn 部分初级代码_第2张图片

cnn 部分初级代码_第3张图片

Pytorch常用函数_Saul Zhang的博客-CSDN博客_pred.t()

 torch.eq()函数
比较两向量是否相等,两个向量的维度必须一致,如果相等,对应维度上的数为1,若果不相等则对应位置上的元素为0.

怎么编写一个自定义的网络,参考下面的

pytorch教程之nn.Module类详解——使用Module类来自定义模型_LoveMIss-Y的博客-CSDN博客_torch.nn.module

梯度下降法,学习权重,基本公式如下w_{i+1}=w_i+\eta \Delta w,在纯梯度下降法中, \Delta ww_i处的一阶导数值近似得到,对于梯度下降法的优化,只能从两个角度去优化,分别就是学习率\eta\Delta w,前者称为自适应学习率算法改进,后者称为动量法。对于大量的数据,往往取一个小样本计算,取得到的梯度均值,据此作为\Delta w的近似。在torch中的实现参考下面的链接。

PyTorch学习之 torch.optim 的6种优化器及优化算法介绍_Line_Walker的博客-CSDN博客_lr_decay

Windows配置pytorch+CUDA

PyTorch配置CUDA_chenqiyyy的博客-CSDN博客_pytorch配置cuda

cnn 部分初级代码_第4张图片

记录一些文档

https://handbook.pytorch.wiki/index.html

cnn 部分初级代码_第5张图片

Pytorch中文百科

cnn 部分初级代码_第6张图片

https://pytorch.apachecn.org/#/docs/1.7/19

cnn 部分初级代码_第7张图片

 https://docs.pytorch.wiki/en/

cnn 部分初级代码_第8张图片

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)

你可能感兴趣的:(cnn,深度学习,pytorch)