【deep learning with pytorch】运用pytorch写自己的神经网络

【deep learning with pytorch】运用pytorch写自己的神经网络

之前学习了pytorch中的tensor与建立自己的数据集。这次要开始写自己的神经网络。pytorch一般的神经网络运算如卷积池化等都是打包在了torch.nn的库里面。
在pytorch之中对tensor的所有操作都是在autograd库里面的,包括反向传播,运算等等。而torch.nn又是依赖于autograd库的来定义模型架构与区分模型。其中autograd.Function是一个用来前向传播与反向传播的类,包含了forward()与backward()函数。
nn.Module包含网络层,和前向传播函数,并返回输出结果。

一个典型的神经网络训练过程可以归纳为:
1、定义神经网络。
2、构建数据集,并将数据集迭代输入
3、用神经网络处理输入的数据
4、计算loss
5、反向传播神经网络的参数
6、更新网络参数

定义神经网络

例如定义一个神经网络:

import torch
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 1 input image channel, 6 output channels, 3x3 square convolution
        # kernel
        self.conv1 = nn.Conv2d(1, 6, 3)
        self.conv2 = nn.Conv2d(6, 16, 3)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features


net = Net()
print(net)

输出为:

  (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
  (fc1): Linear(in_features=576, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)

这里只需要定义forward函数(只能用Tensor变量的类型输入到forward之中),让计算机知道整个网络的计算方式是什么样子的,而反向传播的计算(backward()自动生成)。但这里要注意这只是针对于普通的神经网络,如果要重新定义神经网络卷积的方式,就需要重新定义反向传播的方式。
学习得到
的网络参数会返回到 net.parametes() 之中

params = list(net.parameters())
print(len(params))
print(params[0].size())  # conv1's .weight

#out:10
#torch.Size([6, 1, 3, 3])

定义神经网络这个部分还想要多扩充一点关于源代码的知识:
因为写网络很多时候不会简单的只写一个网络,会出现对网络架构的修改或者在前面网络的基础上进行延伸的问题,所以不能只看forward()与backward(),需要考虑nn.Module 这个库中的其它的函数:这里建议去看https://pytorch.org/docs/stable/nn.html
其中有几个可以列举一下:

add_module(name,module):这里为模块增加一个子模块,通过父模块可以直接调用子模块
apply(fn):这里面fn是一个函数,将整个模块变为参数传入到这个函数之中。
cpu() 将模块中所有的参数和节点转为cpu模式
cuda() 将模块的所有参数与节点转为GPU模式
eval() 将模块调整为evaluation的模式
train(mode = True) 将这个模型设置在训练的模式
load_state_dict(state_dict,strict = True) :将state_dict之中所有的参数与节点都复制到模型和模型的孩子之中。
state_dict(destination=None, prefix=’’, keep_vars=False) 返回一个字典,包含了模型的整个状态,像参数,节点等都包括,字典的key是它们相应的名称。

输入数据

根据上面写好的神经网络的例子,可以尝试随机输入一个32*32的数据(仿真一个图像),得到的结果是:

input = torch.randn(1,1,32,32)#1 数据的类型是torch ,2 数据输入为(batch,channel,height,width)
out = net(input)
print(out)

#out:tensor([[-0.0491, -0.0338, -0.0398, -0.0413,  0.2044, -0.1106,  0.0700,0.1368,
#0.0359,  0.0736]], grad_fn=<AddmmBackward>)

net.zero_grad()#将网络中反向传播的梯度设置为0
out.backward(torch.randn(1,10))#这里不能out.backward()的原因是out不是一个scalar

计算loss

计算损失函数需要(output, target)为输入,计算出来具体的值并预估输出值与目标值相差多少。
有很多不同的计算方式在nn的库之中。一个较为简单的计算损失的Loss为nn.MSELoss,可以用来计算误差与目标值之间平均平方误差,还有其它的误差函数如CrossEntropyLoss函数等,可以在这里找到https://pytorch.org/docs/stable/nn.html

output = net (input)
target = torch.randn(10)
target = target.view(1,-1)#将gt变为和输出相同的维度
criterion = nn.MSELoss()

loss = criterion(output, target)
print(loss)
#out:tensor(0.8907, grad_fn=<MseLossBackward>)

反向传播和更新权重

上面我们得到的loss为一个scalar,故而可以直接采用loss.backwawrd()进行反向传播
对于权重的简单更新为:
weight = weight - learning_rate*gradient

learning_rate = 0.01
for f in net.parameters():
	f.data.sub_(f.grad.data * learning_rate)

但是神经网络中权重的更新方式一般没有上面的那么简单,一般会采用如SGD,Adam.RMSProp等。这些更新方式都被存储到 torch.optim 之中,可以直接调用:

import torch.optim as optim
#创建自己的优化器
optimizer = optim.SGD(net.parameters(),lr = 0.01)#这里参数为,网络参数和学习率

#在训练的循环之中可以调用optim
optimizer.zero_grad()#先将网络所有反向梯度归0,这里如果不手动归0,参数上的梯度会被累乘
output = net(input)
loss = criterion(output,target)
loss.backward()
optimizer.step()#进行更新
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 深度学习是一项非常热门的技术,在人工智能领域得到广泛应用。PyTorch是一种使用Python编程语言的开源深度学习框架,它非常适合研究和开发深度学习模型。为了帮助初学者更好地学习PyTorch深度学习技术,CSDN(全球最大中文IT社区)开设了“DeepLearning with PyTorch”系列课程。 这个系列课程以实践为主要教学方式,让学生在实际操作中掌握PyTorch深度学习的技能。在学习过程中,学生可以学到基础的模型结构设计,各种优化算法,如学习率调整、梯度下降等,并且可以在实战操作中学到如何使用PyTorch完成各种实际应用,例如图像分类和识别,自然语言处理等等。 这门课程的受众群体不仅仅是那些想要从事人工智能开发的工程师,它对于对深度学习感兴趣的学生和科研人员也是非常有用的。这是因为在这个课程中,教师基于实际使用场景和数据集介绍了PyTorch深度学习技术,从实践中总结出的方法和经验不仅可以快速提升工程开发效率,也可以加深对深度学习理论的理解。 总之,“DeepLearning with PyTorch”系列课程非常实用和有趣,可以为初学者提供全面而深入的深度学习知识,帮助他们掌握用PyTorch来开发深度学习模型的基础技能。 ### 回答2: Deep Learning是一种用于训练多层神经网络的机器学习方法,已被广泛应用于视觉、语音、自然语言处理等领域。而PyTorch是一种开源的深度学习框架,具有快速、灵活、易用等优点,因此受到了越来越多的关注和使用。 CSDN是一个致力于IT技术在线学习和分享的平台,在其中学习deeplearning with pytorch将能够获取丰富的知识和实践经验。首先,我们需要了解PyTorch的基本概念和操作方法,如如何构建网络模型、定义损失函数和优化器、进行前向传播和反向传播等。然后,我们可以学习如何使用PyTorch进行数据预处理,如数据清洗、标准化、归一化等。此外,还可了解如何使用PyTorch进行分布式训练、混合精度训练等高级技术,以及如何在GPU上进行训练和推理等实践技巧。 总之,在CSDN上学习deeplearning with pytorch,能够让我们更好地掌握PyTorch的使用技巧,帮助我们更快、更好地完成深度学习的应用开发和研究工作。同时也可以通过活跃在CSDN平台上与其他开发者的交流来共同进步。 ### 回答3: PyTorch是一种针对深度学习任务的开源机器学习库,它支持快速的原型设计和大量的实验,是当前科学界和工业界中最受欢迎的深度学习框架之一。CSDN推出的Deeplearning with Pytorch系列课程就是致力于教授学生如何使用PyTorch进行深度学习,以及在此基础上更深层次的研究探索。 此系列课程包含了从入门到进阶多个方面的内容,在基础课程中,学员将学会如何使用PyTorch进行深度学习的各个方面,包括但不限于神经网络、优化器、损失函数等,使其基本掌握PyTorch的使用方法。而在进阶课程中,以一些大型深度学习任务为基础,详细介绍了超参数优化、神经网络模型架构选择、分布式训练、自己网络模型等更高级的知识,通过深度剖析一些开源库的源码,为学员提供了很多实现深度学习任务的技巧和方法。 课程的开设不仅帮助了很多想更深入了解深度学习的爱好者,也有助于那些打算将深度学习应用在自己的科研工作中的研究者们更加快捷、有效地完成自己的研究任务。相信随着人工智能的不断发展,PyTorch这样的框架将会发挥越来越重要的作用,而帮助大家掌握这些工具的Deeplearning with Pytorch系列课程也必将得到更多的关注和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值