深度学习入门教学1(Colaboratory使用教程)-CSDN博客
学会使用Colaboratory进行深度学习项目的实践开发后,我们进入PyTorch的初步学习和基础练习。
一、认识PyTorch
PyTorch是一个基于Torch库,底层由C++实现,应用于人工智能领域的开源Python机器学习库。
PyTorch包括torch.autograd、torch.nn、torch.optim等子模块。
PyTorch包含多种损失函数,包括 MSE(均方误差 = L2 范数)、交叉熵损失和负熵似然损失(对分类器有用)等。
PyTorch有以下两个特点。
- GPU或 MPS 等硬件加速的张量计算
- 构建在反向自动求导系统上的深度神经网络
二、使用PyTorch
2.1定义数据
使用torch.Tensor 定义数据,tensor的意思是张量,是数字各种形式的总称。
张量是 PyTorch 中的核心数据抽象,PyTorch 支持各种张量子类型。通常地,一维张量称为向量(vector),二维张量称为矩阵(matrix)。
张量的数据类型包括:
- torch.bool
- torch.int8
- torch.uint8
- torch.int16
- torch.int32
- torch.int64
- torch.half
- torch.float
- torch.double
- torch.bfloat
接下来我们使用colab编程测试。
我们在谷歌云盘中创建colab项目进行编程。
import torch
# 可以是一个数
x = torch.tensor(666)
print(x)
# 可以是一维数组(向量)
x = torch.tensor([1,2,3,4,5,6])
print(x)
# 可以是二维数组(矩阵)
x = torch.ones(2,3)
print(x)
# 可以是任意维度的数组(张量)
x = torch.ones(2,3,4)
print(x)
创建Tensor有多种方法,包括:ones, zeros, eye, arange, linspace, rand, randn, normal, uniform, randperm, 使用的时候可以在线搜,下面主要通过代码展示。
# 创建一个空张量
x = torch.empty(5,3)
print(x)
# 创建一个随机初始化的张量
x = torch.rand(5,3)
print(x)
# 创建一个全0的张量,里面的数据类型为 long
x = torch.zeros(5,3,dtype=torch.long)
print(x)
# 基于现有的tensor,创建一个新tensor,
# 从而可以利用原有的tensor的dtype,device,size之类的属性信息
y = x.new_ones(5,3) #tensor new_* 方法,利用原来tensor的dtype,device
print(y)
z = torch.randn_like(x, dtype=torch.float) # 利用原来的tensor的大小,但是重新定义了dtype
print(z)
2.2定义操作
Tensor的操作(function),即所有用Tensor进行的各种运算,可以理解为Tensor的各类功能函数,其中包括:
- 基本运算,加减乘除,求幂求余
- 布尔运算,大于小于,最大最小
- 线性运算,矩阵乘法,求模,求行列式
基本运算包括: abs/sqrt/div/exp/fmod/pow ,及一些三角函数 cos/ sin/ asin/ atan2/ cosh,及 ceil/round/floor/trunc 。
布尔运算包括: gt/lt/ge/le/eq/ne,topk, sort, max/min。
线性计算包括: trace, diag, mm/bmm,t,dot/cross,inverse,svd 等。
下面编程练习。
# 创建一个 2x4 的tensor
m = torch.Tensor([[2, 5, 3, 7],
[4, 2, 1, 9]])
print(m.size(0), m.size(1), m.size(), sep=' -- ')
# 返回 m 中元素的数量
print(m.numel())
# 返回 第0行,第2列的数
print(m[0][2])
# 返回 第1列的全部元素
print(m[:, 1])
# 返回 第0行的全部元素
print(m[0, :])
# Create tensor of numbers from 1 to 5
# 注意这里结果是1到4,没有5
v = torch.arange(1, 5)
print(v)
# Scalar product
m @ v
运行后发现数据类型不匹配。
根据google自带的智能chat提示更改数据类型。(这里不得不夸赞Google服务优秀的用户体验)
添加以下代码后成功。
v = v.float() # Change the type of v to float
# Add a random tensor of size 2x4 to m
m + torch.rand(2, 4)
# 转置,由 2x4 变为 4x2
print(m.t())
# 使用 transpose 也可以达到相同的效果,具体使用方法可以百度
print(m.transpose(0, 1))
# returns a 1D tensor of steps equally spaced points between start=3, end=8 and steps=20
torch.linspace(3, 8, 20)
from matplotlib import pyplot as plt
# matlabplotlib 只能显示numpy类型的数据,下面展示了转换数据类型,然后显示
# 注意 randn 是生成均值为 0, 方差为 1 的随机数
# 下面是生成 1000 个随机数,并按照 100 个 bin 统计直方图
plt.hist(torch.randn(1000).numpy(), 100);
# 当数据非常非常多的时候,正态分布会体现的非常明显
plt.hist(torch.randn(10**6).numpy(), 100);
# 创建两个 1x4 的tensor
a = torch.Tensor([[1, 2, 3, 4]])
b = torch.Tensor([[5, 6, 7, 8]])
# 在 0 方向拼接 (即在 Y 方各上拼接), 会得到 2x4 的矩阵
print( torch.cat((a,b), 0))
# 在 1 方向拼接 (即在 X 方各上拼接), 会得到 1x8 的矩阵
print( torch.cat((a,b), 1))
本文主要参考中国海洋大学高峰老师深度学习课程:lab/week01_Pytorch_Basic.ipynb · Feng Gao (高峰)/OUC深度学习课程 - Gitee.com