PyTorch学习基础知识一
一、Broadcasting、Tensor与Autograd
我们直接采用代码的形式来进行学习,下面的代码中也有相应的知识的叙述与介绍。
"""
f(x)=wx+b
w->weights
b->bias
"""
"""
广播机制(Broadcasting)
广播机制主要包含以下的几个部分:
1、让所有的输出数组都向其中shape最长的数组看齐,shape中不足的部分使用1来补全;
2、输出数组的shape是输入数组中的shape的最大值;
3、如果输入数组的某个轴和输出数组的对应的轴的长度相同的时候,或者其长度为1的时候,这个数组是能够用来计算
的,否则,就会出错;
4、当输入数组的某一个轴为1的时候,沿着此轴进行运算的时候都用此轴上的第一组值。
具体的举例参见Broadcasting(example).jpg
"""
"""
深度学习框架PyTorch
PyTorch实际上是Numpy的替代品,而且使用起来十分方便快捷。
PyTorch相对于TensorFlow而言比较简单。(所以 TensorFlow 的上手时间,肯定要比 PyTorch 长。)
Tensor:张量
从本质上面来说的话,Tensor其实也就是一个数组。
自动求导:
Autograd
Autograd 为所有 Tensor 上的操作提供了自动微分机制。
这是一个动态运行的机制,也就是说你的代码运行的时候,
反向传播过程就已经被定义了,且每迭代都会动态变化。
如果把 Tensor 的属性 .requires_grad 设置为 True,
就会追踪它的所有操作。完成计算后,
可以通过 .backward() 来自动完成所有梯度计算。
"""
import torch
x = torch.randn(6, 4, dtype=torch.float)
print(x)
# tensor([[ 0.9862, -0.8254, -1.1786, 0.8517],
# [ 0.6637, 1.3759, 0.0275, 1.5593],
# [ 1.1041, -0.6335, -1.0538, 1.1304],
# [ 0.2675, -1.3835, -1.3349, 2.9404],
# [ 1.1640, 0.2592, 0.6844, 0.5803],
# [ 0.9688, 1.6834, 0.7145, 1.5934]])
y = torch.tensor([[1, 2, 3, 4], [5, 6, 7, 8]])
print(y)
# tensor([[1, 2, 3, 4],
# [5, 6, 7, 8]])
# 加法
x0 = torch.randn(5, 3)
y0 = torch.randn(5, 3)
result = torch.empty(5, 3)
torch.add(x0, y0, out=result)
# 这两个是一样的。
print(result)
print(y0.add_(x0))
# tensor([[ 1.1245, -0.2671, -0.9810],
# [ 0.9452, -1.6079, -1.8099],
# [ 1.2403, -1.8337, 0.5645],
# [ 2.4768, 2.1873, 1.5201],
# [-2.1194, -0.5494, -1.1040]])
# tensor([[ 1.1245, -0.2671, -0.9810],
# [ 0.9452, -1.6079, -1.8099],
# [ 1.2403, -1.8337, 0.5645],
# [ 2.4768, 2.1873, 1.5201],
# [-2.1194, -0.5494, -1.1040]])
# 这个是测试自动求导的机制的
# Autograd
x1 = torch.ones(2, 2, requires_grad=True)
print(x1)
y1 = x1 + 1
z1 = y1 * y1 * 2
out1 = z1.mean()
print(z1, out1)
out1.backward()
print(x1.grad)
# tensor([[1., 1.],
# [1., 1.]], requires_grad=True)
# tensor([[8., 8.],
# [8., 8.]], grad_fn=<MulBackward0>) tensor(8., grad_fn=<MeanBackward0>)
# tensor([[2., 2.],
# [2., 2.]])
"""
tensor([[ 0.8389, -0.9816, -0.5000, -1.4477],
[ 1.5592, 1.4960, -1.2355, 0.5627],
[-0.9396, -0.1240, -0.3078, 0.0213],
[ 1.2707, -0.3611, 0.7111, 0.3984],
[ 0.1144, -0.8157, -0.3630, 1.7868],
[ 0.8582, 0.6707, -0.1433, 1.6408]])
tensor([[1, 2, 3, 4],
[5, 6, 7, 8]])
tensor([[ 1.9609, 0.1785, 2.6246],
[-0.2639, 1.6323, 0.3627],
[-2.6193, -1.3028, 0.3448],
[ 0.6846, 0.4891, 1.2605],
[-2.7221, 0.6624, -0.1272]])
tensor([[ 1.9609, 0.1785, 2.6246],
[-0.2639, 1.6323, 0.3627],
[-2.6193, -1.3028, 0.3448],
[ 0.6846, 0.4891, 1.2605],
[-2.7221, 0.6624, -0.1272]])
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
tensor([[8., 8.],
[8., 8.]], grad_fn=<MulBackward0>) tensor(8., grad_fn=<MeanBackward0>)
tensor([[2., 2.],
[2., 2.]])
Process finished with exit code 0
"""
二、卷积神经网络
"""
神经网络知识
Sigmoid函数(具体的形式参见Sigmoid函数.jpg)
损失函数(Cross Entropy Loss)
(交叉熵损失函数(Cross Entropy Loss))
(具体的形式参见:交交叉熵损失函数0.jpg,叉熵损失函数1.jpg 以及 交叉熵损失函数2.jpg)
梯度下降(Gradient Descent)
(梯度下降原理)
计算图
每次迭代训练,神经网络模型主要分成两个步骤:
1、正向传播(Forward Propagation);
2、反向传播(Back Propagation)。
(正向传播就是计算损失函数过程,反向传播就是计算参数梯度过程。)
使用计算图可以对参数进行求导
(逻辑回归、损失函数、梯度下降和计算图)
"""
三、GitHub分享
我把所有的内容都放在了GitHub中,有兴趣的可以上去看看完整的内容啦。
最后,感谢大家的阅读与支持啦。