Pytorch实战第一讲

预习作业:掌握Numpy中有关张量维度的知识

1.常用的机器学习,深度学习开源框架价绍

PyTorch

  • FaceBook2017年发布的全新机器学习包
  • 功能很强大(强推)
  • 擅长数据分析
  • 支持动态图创建
  • 支持GPU的Tensor库训练,加速计算
  • 可以替代Numpy
  • 简单实用
  • 社区完善

TensorFlow

  • 谷歌第二代机器学习系统
  • 顾名思义,张量and流
  • 由于架构很灵活,可移植性很好,工业领域用的很多,真神
  • 但不是很容易上手,所以看起来有点史
  • 学术界不是很经常用

MindSpore

  • 史中史
  • 唯一真史

Scikit-Learn

  • 基于Python的机器学习模块
  • 由David Cournapeau于2007年发起
  • 基本功能分为6个模块:分类,回归,聚类,数据降维,模型选择,数据准备,预处理
  • 对于具体的机器学习问题分为3个模块:数据准备&预处理,模型选择&训练,模型验证&参数调优
  • 支持多种格式的数据
  • 用的也比较多
  • 可以一试

2.PyTorch中的数据呈现方式:Scalar,Vector,Matrix,Tensor

“Torch loves tensor”

默认的数据结构是tensor(),中文翻译为张量

1
2
3
4
5
#直观理解:
scalar#点
vector#线
matrix#面
tensor#体

以下大标题所说的tensor都指PyTorch默认的数据结构,而不是具体某一个三维的张量

辛苦大家,适应一下这种说法

2.1自定义一些tensor

torch.tensor(xxxx):Create a tensor

1
2
3
4
5
6
7
8
9
10
import torch
scalar=torch.tensor(7)
vector=torch.tensor([7,4])
MATRIX=torch.tensor([[0,7],[2,1]])
TENSOR=torch.tensor([[[0,7],[2,1]]])

scalar
vector
MATRIX
TENSOR

tensor(7)
torch.tensor([7,4])
tensor([ [0, 7],
[2, 1] ])
tensor([ [ [0, 7],
[2, 1] ] ])

ndim:Check the dimensions of scalar
维度计算快捷方法:数一数几层中括号

1
2
3
4
scalar.ndim
vector.ndim
MATRIX.ndim
TENSOR.nidm

0
1
2
3

item:Turn tensor into a Python number
顾名思义,把物体(数字)从tensor中取出来看看他是个什么东西)

1
scalar.item

7

Check the shape of the vector,2 elements are put into the brackets
涉及到一些维度的知识

1
2
3
vector.shape
MATRIX.shape
TENSOR.shape

torch.Size([2])
torch.Size([2, 2])
torch.Size([1, 2, 2])

2.2初始化一些特殊的tensor

Tensor默认数据类型为float.32

1
2
3
4
5
6
7
8
9
10
11
12
13
#Tensor datatypes

#Deafault datatype for tensors is float32

float_32_tensor=torch.tensor([3.0,6.0,9.0],

                             dtype=None,# defaults to None, which is torch.float32 or whatever datatype is passed

                             device=None,# defaults to None, which uses the default tensor type

                             requires_grad=False)# if True, operations performed on the tensor are recorded

float_32_tensor.shape,float_32_tensor.dtype

(torch.Size([3]), torch.float32)

1
2
3
float_16_tensor=torch.tensor([3.0,6.0,9.0],
dtype=torch.float16)
float_16_tensor.dtype

torch.float16

随机初始化

1
2
random_tensor=torch.rand(size=(3,4))
random_tensor,random_tensor.dtype

(tensor([ [ 0.1093, 0.8989, 0.8195, 0.3373] , [ 0.1179, 0.2801, 0.3570, 0.5607], [0.8991, 0.3874, 0.1780, 0.7507] ] ), torch.float32)

全0

1
2
zeros=torch.zeros(size=(3,4))
zeros,zeros.dtype

全1

1
2
ones=torch.ones(size=(3,4))
ones,ones.dtype

等差数列笑声

1
2
3
4
5
6
7
#In Python, you can use range() to create a range. However in PyTorch, torch.range() is deprecated and may show an error in the future.

#You can use torch.arange(start, end, step) to do so

zero_to_ten=torch.arange(start=0,end=10,step=1)

zero_to_ten

2.3Tensor基本数学运算

对于每个元素:


1
2
tensor = torch.tensor([1, 2, 3])
tensor + 10

tensor([11, 12, 13])

1
tensor * 10

tensor([10, 20, 30])

注意:tensor自身没变

1
tensor

tensor([1, 2, 3])

reassign:tensor自身改变

1
2
3
# Add and reassign
tensor = tensor - 10
tensor

tensor([-9, -8, -7])

使用multiply函数对tensor中每个元素乘10
但是tensor自身不变

1
torch.multiply(tensor,10)

tensor([10, 20, 30])

1
2
# Original tensor is still unchanged
tensor

逐个元素相乘

1
2
print(tensor,"*",tensor)
print("Equals=",tensor*tensor)

tensor([1, 2, 3]) * tensor([1, 2, 3])
Equals= tensor([1, 4, 9])

设置随机数tensor

1
2
3
4
5
6
7
random_tensor_A=torch.rand(3,4)

random_tensor_B=torch.rand(3,4)

print(f"Does tensor_A equal to tensor_B?\n")

random_tensor_A==random_tensor_B

Does tensor_A equal to tensor_B?
tensor([[False, False, False, False], [False, False, False, False], [False, False, False, False]])

1
2
3
4
5
6
7
8
9
10
11
12
13
import random

RANDOM_SEED=42

torch.manual_seed(seed=RANDOM_SEED)

random_tensor_c=torch.rand(3,4)

torch.manual_seed(seed=RANDOM_SEED)

random_tensor_d=torch.rand(3,4)

random_tensor_d==random_tensor_c

tensor( [ [True, True, True, True],[ True, True, True, True ], [True, True, True, True ] ] )

重点:矩阵乘法

1
2
3
4
5
#Matrix Multiplication

#PyTorch implements matrix multiplication functionality in the torch.matmul() method

torch.matmul(tensor,tensor)

一个很容易犯的错
这里需要对矩阵b进行转置处理
否则无法按照定义进行矩阵乘法计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tensor_A=torch.tensor([[1,2],

                      [3,4],

                      [5,6]],dtype=torch.float32)

tensor_B=torch.tensor([[7,8],

                      [9,10],

                      [11,12]],dtype=torch.float32)

#torch.matmul(tensor_A,tensor_B)-------Error

torch.matmul(tensor_A,tensor_B.T)

定义一个[2,6]由随机数组成的线性层
利用torch.nn.Linear,实现矩阵相乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#设置随机数
torch.manual_seed(42)

linear=torch.nn.Linear(in_features=2,

                      out_features=6)

x=tensor_A

output=linear(x)

print(x.shape)

print(output.shape)

torch.Size([3, 2])
torch.Size([3, 6])

2.4Tensor下标计算

一级索引
二级索引
三级索引

1
2
3
4
5
6
7
8
9
# Let's index bracket by bracket
a=torch.arrange(1,10,1).reshape(1,3,3)
#(tensor([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]), torch.Size([1, 3, 3]))

print(f"First square bracket:\n{a[0]}")

print(f"Second square bracket: {a[0][0]}")

print(f"Third square bracket: {a[0][0][0]}")

First square bracket: tensor([ [ 1, 2, 3], [4, 5, 6], [7, 8, 9] ] )
Second square bracket: tensor([1, 2, 3])
Third square bracket: 1

考考聪明的你们我是笨蛋

1
2
3
4
5
6
7
8
9
10
a[:,0]
a[:,1]
a[0,0,:]
a[0,1,:]
a[:,:,0]
a[:,:,1]
a[:,:,2]
a[:,0,1]
a[:,1,2]
a[:,2,2]

2.5重点:实现PyTorch中的Tensor与Numpy中的Array相互转换

torch.from_numpy(array):Numpy array->Pytorch Tensor

torch.tensor.numpy():Pytorch Tensor->Numpy array

1
2
3
4
5
6
7
import numpy as np

array=np.arange(1.0,8.0)

tensor=torch.from_numpy(array).type(torch.float32)

array,tensor

(array([1., 2., 3., 4., 5., 6., 7.]), tensor([1., 2., 3., 4., 5., 6., 7.]))

array改变,tensor不变

1
2
array=array+1
array,tensor

(array([2., 3., 4., 5., 6., 7., 8.]), tensor([1., 2., 3., 4., 5., 6., 7.]))

1
2
3
tensor=torch.ones(7)#dtype=float32
numpy_tensor=tensor.numpy()# float32 unless changed
tensor,numpy_tensor

(tensor([1., 1., 1., 1., 1., 1., 1.]), array([1., 1., 1., 1., 1., 1., 1.], dtype=float32))

3.(挖坑)CUDA安装

检查CUDA是否安装成功

1
2
import torch
torch.cuda.is_available()

True

True为安装成功