Record of the Task 1: First step to DL

从头实现使用到的pytorch函数

  1. torch.ones()/torch.zeros(),与MATLAB的ones/zeros很接近。初始化生成

  2. 均匀分布 torch.rand(*sizes, out=None) → Tensor 包含了从区间[0, 1)的均匀分布中抽取的一组随机数。

  3. 标准正态分布torch.randn(*sizes, out=None) → Tensor 包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。

  4. torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵

  5. torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵

  6. torch.Tensor是一种包含单一数据类型元素的多维矩阵,定义了7种CPU tensor和8种GPU tensor类型。

  7. backward()是pytorch中提供的函数,配套有require_grad:
    1.所有的tensor都有.requires_grad属性,可以设置这个属性.x = tensor.ones(2,4,requires_grad=True)
    2.如果想改变这个属性,就调用tensor.requires_grad_()方法:   x.requires_grad_(False)

简介实现使用的库

  1. nn库之
    (1). Variable有三个属性:data,grad以及creator。
    i. 访问原始的tensor使用属性.data;
    ii. 关于这一Variable的梯度则集中于 .grad; .
    iii. creator反映了创建者,标识了是否由用户使用.Variable直接创建(None)。通过create实现梯度计算从而反向传播
    (2).Gradient
    out.backward()等价于out.backward(torch.Tensor([1.0]))但非标量时应传一个相同形状的out参数,看到有说法是为了在只知道梯度不知道函数的时候利用[-1,-1]的参数完成传播。
    简易的神经网络应该理解成
    x→y = x+2→z = 3yy→out = 1/4*(z11+z12+z21+z22)
    只有x的requires_grad = True 因此只得到了x的gradient Record of the Task 1: First step to DL_第1张图片
    (3).本文中的程序就是在继承nn.Module类,只要在nn.Module的子类中定义了forward函数,backward函数就会被自动实现(利用Autograd)。
class LinearNet(nn.Module): 		#这里继承了nn.Module
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()      # call father function to init 
        self.linear = nn.Linear(n_feature
        2, 1)  # function prototype: `torch.nn.Linear(in_features, out_features, bias=True)`

    def forward(self, x):
        y = self.linear(x)
        return y
    
net = LinearNet(num_inputs)
print(net)

(从彩笔的角度来看)pytorch比较特殊的点似乎是,它比起神经网络的层,仿佛更关心模块。

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