从零开始学Pytorch(第5天)


前言

今天主要了解和学习Pytorch中的模块类和计算图、自动求导机制


一、模块类的构建

1. nn.Module

Pytorch模型通过继承nn.Module,在类的内部定义子模块实例化,
通过前向计算调用子模块,最后实现深度学习模型的搭建。
import torch.nn as nn

class Model(nn.Module):
    def __init__(self,...): #定义类的初始化函数,...是传入的参数
        super(Model, self).__init__()
  		...#根据传入的参数来定义子模块

    def forward(self,...):
    #定义前向计算的输入参数,...一般是张量或者其他的参数。
        ret                #根据传入的张量和子模块计算返回张量
        return ret

这个基本框架记住之后套用就好。

2.构建一个线性回归类

import torch
import torch.nn as nn

class LinearModel(nn.Module):
    def __init__(self, ndim):
        super(LinearModel, self).__init__()
        self.ndim = ndim
        self.weight = nn.Parameter(torch.randn(ndim, 1))  # 定义权重,这里的nn.Parameter可以理解为将张量转换为可训练的参数类
        self.bias = nn.Parameter(torch.randn(1))  # 定义偏置

    def forward(self, x):
        # y=Wx+b
        return x.mm(self.weight) + self.bias


lm=LinearModel(5)   #初始化一个线性模型实例,特征数为5
x=torch.randn(4,5)  #定义输入,可以理解为mini-batch=4

lm(x)
tensor([[-3.0978],
        [ 4.5808],
        [ 0.2038],
        [-1.6345]], grad_fn=<AddBackward0>)

可以看到,我们要做的就是把计算过程变成代码输入到模型中即可。

二、计算图和自动求导机制

1.计算图

计算图(Computational Graph)是用来描述运算的有向无环图,其中的节点表示数据,如张量等;边表示运算,如加减乘除卷积等。

深度学习框架采用的是两种策略:静态图动态图
Tensorflow 1 和Caffe支持静态图,即提前构造好运算,再根据输入的张量进行计算得出结果。其优点是,减少了计算图构建的时间消耗,效率高;但却无法进行修改且上手较难。

Pytorch使用的是动态计算图,运算与搭建同时进行,可以实时输出深度学习模型的中间张量,便于调试。

2.自动求导

自动求导的过程是:从计算图输出的损失函数标量值,利用反向传播算法,反推计算图中权重张量的梯度。

t1=torch.randn(3,3,requires_grad=True)
t1

tensor([[ 0.1071, -0.6140, -1.0037],
        [ 0.3234, -1.4746, -1.7091],
        [-1.0635,  1.3680,  1.4820]], requires_grad=True)

t2=t1.pow(2).sum() #计算张量所有张量平方和
t2.backward()

t1.grad   #梯度是原分量的两倍
tensor([[ 0.2142, -1.2281, -2.0074],
        [ 0.6468, -2.9492, -3.4183],
        [-2.1270,  2.7360,  2.9641]])

t2=t1.pow(2).sum() #计算张量所有张量平方和
t2.backward()
t1.grad   #梯度累计

tensor([[ 0.4285, -2.4562, -4.0147],
        [ 1.2937, -5.8984, -6.8366],
        [-4.2539,  5.4720,  5.9282]])

t1.grad.zero_() #梯度清零

tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

假如一个函数是 f ( x ) = x 2 f(x)=x^2 f(x)=x2则它的导数是 f ′ ( x ) = 2 x f'(x)=2x f(x)=2x,在代码中可以看到求导之后的梯度变化。

总结

今天只要掌握如何构建(套用)模块类,和使用backward()函数即可。明天将学习Pytorch的损失函数和优化器,此后的学习就越来越贴近于实战了。

Python从零开始,可以遵循以下步骤: 1. 基础知识习:首先需要了解Python的基础知识,包括Python的数据类型(如字符串、整型、浮点型、列表、字典等)、变量、运算符、控制结构(如if语句、循环语句等)、函数等。 2. 习编写简单程序:通过习基础知识点,尝试编写一些简单的程序,如计算器、简单的文本处理等,加深对语言特性的理解。 3. 掌握面向对象编程:习类和对象的概念,理解封装、继承、多态等面向对象编程的核心概念,尝试用面向对象的方式来编写程序。 4. Python标准库:Python的标准库提供了很多内置模块,可以用来处理文件、网络编程、数据压缩等,熟悉这些库可以提高开发效率。 5. 实践项目开发:选择一些小项目进行实践,如网站开发、数据分析、自动化脚本等,通过实践来巩固和提高编程技能。 6. 习第三方库:随着习的深入,可以习一些常用的第三方库,例如NumPy、Pandas用于数据分析,Django或Flask用于Web开发,TensorFlow或PyTorch用于机器习等。 7. 深入理解高级特性:当基础已经扎实后,可以进一步Python的一些高级特性,如装饰器、上下文管理器、生成器等。 8. 习软件开发规范:了解如何编写可读性强、可维护性高的代码,习使用版本控制工具如Git,以及参与开源项目等。 9. 持续习和练习:编程是一个不断习和实践的过程,通过不断地习新知识、解决实际问题,不断提高自己的编程水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值