当前位置: 首页 > news >正文

深度学习基础1

一、张量

  • 张量其实就是数组,不过是在深度学习中是这样的叫法

1.张量的创建

(1)基本创建方式

  • torch.tensor():根据指定数据创建张量
import torch 
import numpy as np
"""创建张量标量"""
data = torch.tensor(10)
print(data) # 输出结果tensor(10)"""numpy数组"""
data = np.random.randn(2, 3)
data = torch.tensor(data)
print(data) # 输出结果tensor([[0.1345,0.1149,0.2435],#                 [0.8026,-0.6744,-1.0918]],dtype                                             = torch.float64)"""列表,下面代码使用默认元素类型"""
data = [[10.,20.,30.],[40.,50.,60.]]
data = torch.tensor(data)
print(data) # 输出结果tensor([[10.,20.,30.],#                [40.,50.,60.])
  • torch.Tensor():根据指定形状创建张量,也可以用来创建指定数据的张量
"""创建2行3列的张量"""
data = torch.Tensor(2, 3)
"""注意:如果传递列表,则创建包含指定元素的张量"""
data = torch.Tensor([10])data = torch.Tensor([10, 20]) # tensor([10., 20.])
  • torch.IntTensor()、torch.FloatTensor()、torch.DoubleTensor():创建指定类型的张量
"""创建2行3列"""
torch.IntTensor(2, 3)"""列表"""
torch.IntTensor([2,3]) # 输出 tensor([2.,3.])"""如果类型不符合,则会强制转换"""
torch.IntTensor([2.43,3.42]) # 输出 tensor([2.,3.])

(2)创建线性和随机张量

  • torch.arangetorch.linspace创建线性张量
data = torch.arange(0,10,2) # 输出结果 tensor([0,2,4,6,8])
data = torch.linspace(0,9,10) 
  • torch.random.init_seedtorch.random.manual_seed随机种子设置
  • torch.randn创建随机张量
data = torch.randn(2,3) # 创建2行3列张量"""查看随机数种子"""
print('随机数种子':torch.random.initial_seed())"""随机数种子设置"""
torch.random.manual_seed(100)
data = torch.randn(2,3)
print(data)
print('随机数种子:',torch.random.initial_seed())

(3)创建0-1张量

  • torch.onestorch.ones_like创建全1张量
  • torch.zerostorch.zeros_like创建全0张量
  • torch.fulltorch.full_like创建全为指定值张量
data = torch.randn(2,3)
torch.zeros(4,5) # 生成4行5列全为0的二维数组
torch.zeros_like(data) #  生成2行3列全为0的二维数组torch.ones(4,5)
torch.ones_like(data)torch.full([4,5],10) # 生成4行5列 全为10的二维数组
torch.full_like(data,20)

2.张量的类型转换

(1)张量元素的类型转换

  • data.type(torch.DoubleTensor):ShortTensor,IntTensor, LongTensor, FloatTensor
  • data.double():short, int, long, float
data = torch.randn(4, 5)
print(data)
print(data.dtype) # torch.float32
print(data.type(torch.IntTensor).dtype) # torch.int32
print(data.int().dtype) # torch.int32

(2)张量转换成Numpy数组

  • 使用Tensor.numpy函数可以将张量转换为ndarray数组,但是共享内存,可是使用copy函数避免共享
# 共享空间
import torch
import numpy as nptorch.random.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_numpy)
print(data_tensor)# 使用copy函数避免空间共享
import torch
import numpy as nptorch.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy().copy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_tensor)
print(data_numpy)

(3)Numpy数组转换为张量

  • 使用from_numpy可以将naddray数组转换为Tensor,默认共享内存,同样可以使用copy函数避免内存共享
  • 使用torch.tensor可以将ndarray数组转换为Tensor,默认不共享内存
# 内存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[10  2  3]
tensor([10,  2,  3], dtype=torch.int32)
# 避免内存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy.copy())
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10,  2,  3], dtype=torch.int32)
# 避免内存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.Tensor(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10.,  2.,  3.])

(4)标量张量和数字转换

  • 对于只有一个元素的张量,使用item()函数将该值从张量中提取出来
    • 注意:在后面的反向传播中,必须要加上item(),否则模型会报错
import torchdata = torch.tensor(30)
print(data) # tensor(30)
print(data.item()) # 30data1 = torch.tensor([30])
print(data1) # tensor([30])
print(data1.item()) # 30 (得到的不是[30],最终只能得到数值)

3.张量数值计算

(1)张量的基本运算

加减乘除取负号

  • add, sub, mul, div, neg

  • add_, sub_, mul_, div_, neg_(其中带下划线的版本会修改原数据)

import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add(10))
print(data) # 原数据并没有发生改变
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[9, 6, 6],[4, 2, 2]])
import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add_(10))
print(data) # 原数据会发生改变
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[19, 16, 16],[14, 12, 12]])

(2)点乘运算

  • 定义:是两个同维矩阵对应位置的元素相乘,使用mul和运算符*实现
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 3])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [2, 3])
print(data2)# 点乘
print(torch.mul(data1, data2))print(data1 * data2)
输出结果:
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[1, 6, 6],[7, 0, 2]])
tensor([[ 9, 36, 36],[28,  0,  4]])
tensor([[ 9, 36, 36],

(3)矩阵乘法

  • 矩阵乘法运算要求第一个矩阵shape:(n, m),第二个矩阵shape:(m ,p),两个矩阵点积运算shape为(n, p)
    • 运算符@用于进行两个矩阵的乘积运算
    • torch.matmul对进行乘积运算的两矩阵形状没有限定,对数输入的shape不同的张量,对应的最后几个维度必须符合矩阵运算规则
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 4])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [4, 5])
print(data2)# 矩阵乘法
print(data1 @ data2)print(torch.matmul(data1, data2))
输出结果:
tensor([[9, 6, 6, 4],[2, 2, 2, 1]])
tensor([[1, 6, 6, 7, 0],[2, 7, 1, 4, 7],[5, 6, 3, 7, 8],[7, 5, 2, 9, 8]])
tensor([[ 79, 152,  86, 165, 122],[ 23,  43,  22,  45,  38]])
tensor([[ 79, 152,  86, 165, 122],[ 23,  43,  22,  45,  38]])

4.常见运算函数

  • 均值
  • 平方根
  • 指数计算
  • 对数计算
import torchdata = torch.randint(0, 10, [2, 3],dtype = torch.float64)
print(data)"""计算均值(注意:tensor必须为Float或者Double类型)"""
print(data.mean())
print(data.mean(dim = 0)) # 按列计算均值
print(data.mean(dim = 1)) # 按行进行计算"""计算总和"""
print(data.sum())
print(data.sum(dim = 0))
print(data.sum(dim = 1))"""计算平方"""
print(torch.pow(data, 2))"""计算平方根"""
print(data.sqrt())"""指数计算"""
print(data.exp())"""对数计算"""
print(data.log())
print(data.log2())
print(data.log10())
http://www.dtcms.com/a/266489.html

相关文章:

  • 基于Android的财务记账App
  • 【wps】 excel 删除重复项
  • AI 应用于进攻性安全
  • linux_git的使用
  • MySQL 8.0:窗口函数
  • 【Unity开发】Unity实现对模型移动、缩放、旋转操作的功能
  • 基于Docker构建OrangePi5 SDK环境
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • 闲庭信步使用SV搭建图像测试平台:第二十九课——绘制正弦波的图片
  • Android 实现底部弹窗
  • Datasophon的Ranger安装时数据库踩坑及问题解决
  • NeighborGeo:基于邻居的IP地理定位(三)
  • NeighborGeo:基于邻居的IP地理定位(二)
  • 【WEB】Polar靶场 6-10题 详细笔记
  • Jenkins-Email Extension 插件插件
  • 前端开发-前置知识
  • Android WebView 性能优化指南
  • Vue2中的keep-alive:组件状态缓存与性能优化实战指南
  • Android发展历程
  • Android 安装使用教程
  • [论文精读]StruQ: Defending Against Prompt Injection with Structured Queries
  • 前端捕获异常的全面场景及方法
  • 算法题目记录
  • OTC机器人焊机节气设备
  • EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
  • web3钱包的运作原理
  • Type-C PD快充协议智能芯片S312L详解
  • GO 语言学习 之 结构体
  • mysql索引:索引应该选择哪种数据结构 B+树 MySQL中的页 页主体 页目录 索引分类
  • C++学习笔记一