深度学习基础、pytorch使用①
目录
一、深度学习简介
1、什么是深度学习
2、特点
3、优缺点
优点
缺点
二、PyTorch框架
1、简介
2、与numpy区别
3、特点
三、PyTorch使用(张量)
1、什么是张量
2、张量的创建
①基本创建方式
②创建线性和随机张量
③张量元素类型转换
④张量类型转换
· 张量转换为NumPy数组
· NumPy数组转换为张量
· 标量张量和数字转换
3、张量数值计算
①基本计算
②点乘运算、矩阵乘法
一、深度学习简介
1、什么是深度学习
- 深度学习是机器学习的一种实现方法
- 是一种以人工神经网络为架构,对数据进行特征学习的算法。
- 深度学习中的形容词“深度”是指在网络中使用多层。
深度学习模仿人类大脑的运行方式, 从经验中学习获取知识(不需要人力提取特征)。 这也是深度学习被看做黑盒子(隐藏层),可解释性差的原因。
2、特点
- 多层非线性变换
- 自动特征提取
- 大数据和计算能力
- 可解释性差
3、优缺点
优点
自动提取特征 精度高,性能优于其他机器学习算法,某些领域甚至超越了人类 可以拟合任意非线性关系 框架多,不需我们自己造轮子
缺点
黑箱,可解释性差 网络结构复杂,参数多,超参数也多 训练时间长,对算力有较高要求 小数据集上表现不佳,容易过拟合
二、PyTorch框架
1、简介
- 一个 Python 深度学习框架,它将数据封装成张量(Tensor)来进行处理。
- PyTorch 中的张量就是元素为同一种数据类型。
- 在PyTorch 中,张量以"类"的形式封装起来,对张量的一些运算、处理的方法被封装在类中。
2、与numpy区别
- numpy(数组)只能在CPU上计算
- 张量可以运行在GPU
3、特点
- 类似于NumPy的张量计算
- 自动微分系统
- 动态计算图
- GPU加速(CUDA支持)
- 支持多种应用场景
三、PyTorch使用(张量)
1、什么是张量
- 张量,本质就是一个数组,是以类的形式封装起来。
- PyTorch张量与NumPy数组类似,但PyTorch的张量具有GPU加速的能力(通过CUDA),这使得深度学习模型能够高效地在GPU上运行。
2、张量的创建
①基本创建方式
- torch.tensor 根据指定数据创建张量
- torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量
- torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量
- tensor只支持数值创建张量(一般形式)
- Tensor支持数值、形状创建张量
def dm01_create_tensor():data1 = torch.tensor(3) # 标量 3# dtype:数据类型,int64=>64位整型# shape:形状print("data ==>", data1, data1.dtype, data1.shape)# data ==> tensor(3) torch.int64 torch.Size([])data2 = torch.tensor([3]) # 一维向量print("data ==>", data2, data2.dtype, data2.shape)# data ==> tensor([3]) torch.int64 torch.Size([1])data3 = torch.tensor([3, 4, 6])print("data ==>", data3, data3.dtype, data3.shape)# data ==> tensor([3, 4, 6]) torch.int64 torch.Size([3])data4 = torch.tensor([[1, 2, 3],[4, 5, 6]]) # 二维矩阵print("data ==>", data4, data4.dtype, data4.shape)# data ==> tensor([[1, 2, 3],# [4, 5, 6]]) torch.int64 torch.Size([2, 3])# 通过创建numpy,转换成tensordata = np.random.rand(2, 3)data = torch.tensor(data)print("data ==>", data, data.dtype, data.shape)# data ==> tensor([[0.7165, 0.4843, 0.9099],# [0.4426, 0.7343, 0.9241]], dtype=torch.float64) torch.float64 torch.Size([2, 3])
def dm02_Tensor():# 根据数据形状来创建张量data1 = torch.Tensor(2, 3)print("data ==>", data1)# data ==> tensor([[-1.7300e+18, 1.9954e-42, 0.0000e+00],# [ 0.0000e+00, 0.0000e+00, 0.0000e+00]])# 根据数值来创建张量data2 = torch.Tensor([3, 4])print("data ==>", data2)# data ==> tensor([3., 4.])data3 = torch.Tensor([[1, 2, 3], [4, 5, 6]])print("data ==>", data3)# data ==> tensor([[1., 2., 3.],# [4., 5., 6.]])
def dm03_torch_IntTensor():# 创建指定类型的张量data1 = torch.IntTensor([2.7, 3.5]) # 创建整型张量,直接舍去小数位# data ==> tensor([2, 3], dtype=torch.int32)data2 = torch.FloatTensor(2, 3) # 创建单精度张量# data ==> tensor([[-1.4043e-09, 2.0613e-42, 0.0000e+00],# [ 0.0000e+00, 0.0000e+00, 0.0000e+00]], torch.float32)data3 = torch.DoubleTensor(2, 3) # 创建双精度张量# data ==> tensor([[3.1229e-311, 0.0000e+00, 0.0000e+00],# [ 0.0000e+00, 0.0000e+00, 0.0000e+00]], dtype=torch.float64)print("data ==>", data1)print("data ==>", data2, data2.dtype)print("data ==>", data3)
②创建线性和随机张量
- torch.arange 和 torch.linspace 创建线性张量
- torch.random.init_seed 和 torch.random.manual_seed 随机种子设置
- torch.randn 创建随机张量
def dm04_line_Tensor():data1 = torch.arange(0, 5, 2) # 创建一个等差数列print("data ==>", data1) # tensor([0, 2, 4])data2 = torch.linspace(0, 10, 3)# 创建一个等差数列, 参数3:等差数列的个数print("data ==>", data2) # tensor([ 0., 5., 10.])def dm05_rand_Tensor():# 创建一个随机张量(会变)data1 = torch.rand(2, 3)print("data ==>", data1)# 创建一个随机种子(不会变)torch.manual_seed(2) # 设置随机数种子data2 = torch.rand(2, 3)print("data ==>", data2)print(torch.random.initial_seed()) # 2# 创建一个全1张量, 形状和data1一样data3 = torch.ones_like(data1)print("data ==>", data3)# 创建一个全0张量, 形状和data1一样data4 = torch.zeros_like(data1)print("data ==>", data4)
③张量元素类型转换
- 方式一:type(torch.xxxx)
- data = data.type(torch.DoubleTensor)
- data = data.type(torch.ShortTensor)
- data = data.type(torch.IntTensor)
- data = data.type(torch.LongTensor)
- data = data.type(torch.FloatTensor)
- 方式二:data.xxxx( )
- data = data.double()
- data = data.short()
- data = data.int()
- data = data.long()
- data = data.float()
④张量类型转换
· 张量转换为NumPy数组
- 方法一:data_numpy = data_tensor.numpy().copy()
- 方法二:data_numpy = np.array(data_tensor)
def tensor_to_numpy():data_tensor = torch.tensor([2, 3])print("data_tensor ==>", data_tensor)# 深拷贝,不会返回去影响源数据tensor(避免内存共享)data_numpy = data_tensor.numpy().copy()data_numpy[0] = 0print("data_tensor ==>", data_tensor)print("data_numpy ==>", data_numpy)# data_tensor ==> tensor([2, 3])# data_numpy ==> [2 3]
· NumPy数组转换为张量
- 默认共享内存:data_tensor = torch.from_numpy(data_numpy)
- 默认不共享内存:data_tensor = torch.tensor(data_numpy)
def numpy_to_tensor():data_numpy = np.array([2, 3, 4])data_tensor = torch.from_numpy(data_numpy)# data_tensor = torch.from_numpy(data_numpy.copy())data_tensor[0] = 100print("data_tensor ==>", data_tensor)print("data_numpy ==>", data_numpy)# data_tensor ==> tensor([100, 3, 4])# data_numpy ==> [100 3 4]data_numpy = np.array([2, 3, 4])data_tensor2 = torch.tensor(data_numpy)data_tensor2[0] = 100print("data_tensor2 ==>", data_tensor2)print("data_numpy ==>", data_numpy)# data_tensor2 == > tensor([100, 3, 4])# data_numpy == > [2 3 4]
· 标量张量和数字转换
- 当张量只包含一个元素时, 可以通过 item() 函数提取出该值 data.item( )
def tensor_type_cast():data = torch.tensor([30, ])print(data.item())data = torch.tensor(30)print(data.item())
3、张量数值计算
①基本计算
- 加法:print(data.add(10))
- 减法:print(data.sub(100))
- 乘法:print(data.mul(100))
- 除法:print(data.div(100))
- 负数:print(data.neg())
- 带下划线会修改原数据 (类似于pandas里面的replace=True) data.add_()
def dm01_basic_operation():torch.random.manual_seed(2)# 参1:shape, 参2:数据范围, 参3:数据形状data = torch.randint(0, 10, (2, 3))print(data)# 加法print(data.add(10))# 减法print(data.sub(100))# 乘法print(data.mul(100))# 除法print(data.div(100))# 负数print(data.neg())
②点乘运算、矩阵乘法
- 点乘指的是两个同维矩阵对应位置的元素相乘 使用mul 和运算符 * 实现
- 使用PyTorch的mul函数计算data和data2两个张量的逐元素乘积 print(torch.mul(data1, data2))
- data变量乘以3的结果 print(data*3)
def dm02_Hadamard_operation():torch.random.manual_seed(2)data = torch.randint(0, 10, (2, 3))torch.random.manual_seed(4)data2 = torch.randint(0, 10, (2, 3))print("data1:", data)print("data2:", data2)# 打印data变量乘以3的结果print(data*3)# 使用PyTorch的mul函数计算data和data2两个张量的逐元素乘积,并打印结果print(torch.mul(data, data2))