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

新建网站网络空间大连响应式网站

新建网站网络空间,大连响应式网站,极客wordpress主题,焦作市住房和城乡建设局网站Pytorch最基本的操作对象——张量#xff08;tensor#xff09;#xff0c;张量是Pytorch中重要的数据结构#xff0c;可认为是一个高维数组。一般的#xff0c;标量#xff08;scalar#xff09;是只有大小没有方向的量#xff0c;如1、2、3等#xff1b;向量#x…Pytorch最基本的操作对象——张量tensor张量是Pytorch中重要的数据结构可认为是一个高维数组。一般的标量scalar是只有大小没有方向的量如1、2、3等向量vector是有大小和方向的量如[1,2,3]矩阵matrix是由多个向量组成的如[[1,2,3],[4,5,6]]。张量是基于向量和矩阵的推广可以将标量视为零阶张量向量可以视为一阶张量矩阵是二阶张量。张量是支持高效的科学计算的数组它可以是一个数标量、一维数组向量、二维数组矩阵和更高维的数组高阶数据。 1.1 PyTorch张量 PyTorch最基本的操作对象是张量表示一个多维数组张量类似NumPy的数组ndarray与ndarray不同的是张量可以在GPU使用以加速计算。张量和NumPy的数组通常可以共享相同的低层内存无须复制数据。 演示张量的创建和运算首先导入PyTorch和NumPy代码如下 import torch import numpy as np1.1.1 初始化张量 可以使用多种形式初始化张量如可直接从Python数据创建张量无须指定类型PyTorch会自动推荐其类型可通过张量的dtype属性查看其类型。 t torch.tensor([1, 2]) #创建一个张量 print(t) #输出 tensor([1, 2]) print(t.dtype) #输出 torch.int64代码输出 tensor([1, 2]) torch.int64在创建张量时如果想直接创建为float类型可使用torch.FloatTensor()方法如果需要明确的创建为Int类型可使用torch.LongTensor()方法。这两种类型是PyTorch中使用最多、最常见的两种类型。代码如下 t torch.FloatTensor([1, 2]) print(t) print(t.dtype)代码输出 tensor([1., 2.]) torch.float32代码分割线 t torch.LongTensor([1, 2]) print(t) print(t.dtype)代码输出 tensor([1, 2]) torch.int64也可以使用torch.from_numpy()方法从NumPy数组ndarray张量。 np_arraynp.array([[1,2],[3,4]]) #创建一个ndarray t_nptorch.from_numpy(np_array) #从ndarray创建张量 t_np代码输出 tensor([[1, 2],[3, 4]], dtypetorch.int32)1.1.2 张量类型 PyTorch 张量的基础数据类型主要包含以下几种 torch.float32或 torch.float32 位浮动点数最常用的数据类型用于表示小数。torch.float64或 torch.double64 位浮动点数用于需要更高精度的计算。torch.float16或 torch.half16 位浮动点数常用于减少内存消耗和加速计算尤其是在GPU上。torch.int88 位整数用于表示整数值。torch.int1616 位整数。torch.int3232 位整数常用整数类型。torch.int64或 torch.long64 位整数通常用于较大的整数或索引。torch.uint88 位无符号整数通常用于处理图像数据如像素值。torch.bool布尔类型值为 True 或 False用于逻辑运算。 不同数据类型适用于不同的任务和计算需求。在实际使用时可以根据需求选择合适的张量数据类型尤其是在性能和内存管理方面。 其中32位浮点型和64位整型是最常用的类型这两种类型也常常被表示为torch.float和torch.long也就是说torch.float32等价于torch.floattorch.int64等价于torch.long这两种类型正好对应上面的两种创建张量的方法torch.LongTensor()和torch.FloatTensor()。可在构造张量时使用dtype明确其类型。 t torch.tensor([1,2], dtypetorch.float32) print(t) print(t.dtype)代码输出 tensor([1., 2.]) torch.float32代码分割线 #也可以使用torch.float作为dtype的参数 t torch.tensor([1,2], dtypetorch.float) print(t) print(t.dtype)代码输出 tensor([1., 2.]) torch.float32代码分割线 print(torch.floattorch.float32) #返回True print(torch.longtorch.int64) #返回True代码输出 True True以上代码中直接将torch.float与torch.float32做相等判断判断后发现返回结果为True说明这两个写法是完全等价的。PyTorch针对torch.float32与torch.int64类型有专门这样的简写形式是因为这两种类型特别重要模型的输入类型一般都是torch.float32而模型分类问题的标签类型一般为torch.int64。 PyTorch中张量的类型可以使用type()方法转换代码如下。 t torch.tensor([1,2], dtypetorch.float32) print(t.dtype) #type()方法转换类型 tt.type(torch.int64) print(t.dtype)代码输出 torch.float32 torch.int64编写代码过程中由于转换为torch.float32和torh.int64两个类型最常见框架提供了两个快捷的实例转换方法即float()方法和long()方法。代码如下。 t torch.tensor([1,2], dtypetorch.float32) tt.long() print(t.dtype) tt.float() print(t.dtype)代码输出 torch.int64 torch.float321.1.3 创建随机值张量 可使用torch.rand()方法创建0~1均匀的随机数使用torch.randn()方法创建标准正态分布随机数使用torch.zeros()和torch.ones()方法创建全0和全1的张量代码如下。 t torch.rand(2, 3) print(t)代码输出 tensor([[0.7330, 0.2682, 0.0917],[0.8569, 0.2710, 0.8089]])代码分割线 t torch.rand(2, 3) print(t)代码输出 tensor([[0.5205, 0.9647, 0.5108],[0.7746, 0.4297, 0.5655]])代码分割线 t torch.zeros(3) print(t)代码输出 tensor([0., 0., 0.])代码分割线 t torch.ones(3, 2) print(t)代码输出 tensor([[1., 1.],[1., 1.],[1., 1.]])还可以从另一个张量创建新的张量除非明确覆盖否则新的张量保留原来张量的属性形状、数据类型如下所示。 x torch.zeros_like(t) #类似的方法还有torch.ones_like() print(x)代码输出 tensor([[0., 0.],[0., 0.],[0., 0.]])代码分割线 x torch.rand_like(t) print(x)代码输出 tensor([[0.2793, 0.3023],[0.5073, 0.3336],[0.7823, 0.4880]])1.1.4 张量属性 tensor.shape属性可返回张量的形状它与tensor.size()方法等价后者更灵活可以通过给定参数返回某一个维度的形状tensor.dtype属性可返回当前张量的类型。代码如下。 ttorch.ones(2,3,dtypetorch.float64) print(t.shape) #输出torch.Size([2, 3]) print(t.size()) #输出torch.Size([2, 3]) print(t.size(1)) #输出第一维度大小 3 print(t.dtype) #输出torch.float64 print(t.device) #输出cpu代码输出 torch.Size([2, 3]) torch.Size([2, 3]) 3 torch.float64 cpu可通过使用tensor.device属性查看当前张量所在的设备device。直接创建的张量都在内存中所以显示的device是CPU如果是显存中的张量则显示为CUDA。 1.1.5 将张量移动到显存 张量可进行算术运算、线性代数、矩阵操作等计算这些计算可以在CPU上运行也可在GPU运行在GPU上的运算速度通常高于CPU。默认情况下是在CPU创建张量。如果有可用的GPU可以使用tensor.to()方法明确地将张量移动到GPU。代码如下。 #如果GPU可用将张量移动到显存 if torch.cuda.is_available():t t.to(cuda) print(t.device) #如果GPU可用输出类似device(typecuda,index0)代码输出 cpu在编码过程中一般可用如下代码获取当前可用设备。 #获取当前可用设备 devicecuda if torch.cuda.is_available() else cpu print(Using {} device.format(device)) #打印当前可用设备 tt.to(device) #将t放到当前可用设备上 print(t.device) #如果GPU可用输出类似device(typecuda,index0)代码输出 Using cpu device cpu这样设置要比直接使用t.to(‘cuda’)更稳妥可以确保代码中无论有无GPU都能正常运行并且如果GPU可用就用GPU. 1.2 张量运算 张量的运算规则、切片索引规则与NumPy类似运算中遵循广播原则和同形状相同位置元素对方运算的原则代码如下。 t1 torch.randn(2, 3) t2 torch.ones(2, 3) print(t1 3) #t1中每一个元素都加3 print(t1 t2) #t1与t2中每一个相同位置的元素相加 print(t1.add(t2)) #等价于t1t2结果与上面相同print(t1) #输出当前t1值 t1.add_(t2) #运行add_这个计算方法add_方法中的下划线代表就地改变原值 print(t1) #查看运行结果代码输出 tensor([[2.8404, 2.7435, 4.1129],[2.7789, 4.4589, 4.5274]]) tensor([[0.8404, 0.7435, 2.1129],[0.7789, 2.4589, 2.5274]]) tensor([[0.8404, 0.7435, 2.1129],[0.7789, 2.4589, 2.5274]]) tensor([[-0.1596, -0.2565, 1.1129],[-0.2211, 1.4589, 1.5274]]) tensor([[0.8404, 0.7435, 2.1129],[0.7789, 2.4589, 2.5274]])在PyTorch中如果一个运算方法后面加上下画线代表就地改变原值即t1.add_(t2)会直接将运算结果保存为t1这样做可以节省内存但是缺点是会直接改变t1原值因为在使用的时候需要谨慎。 张量可以进行常见的算术运算如abs绝对值、cunsum累加、divide除、floor_divide整除、mean均值、min最小值、max最大值、multiply乘等这里不再一一演示。在深度学习中矩阵运算常用到转置tensor.T和矩阵乘法matmul或代码如下。 print(t1.matmul(t2.T)) #t1与t2的转置进行矩阵乘法 print(t1(t2.T)) #与上一行运行等价t1与t2的转置进行矩阵乘法 代码输出 tensor([[3.6968, 3.6968],[5.7652, 5.7652]]) tensor([[3.6968, 3.6968],[5.7652, 5.7652]])对于只有一个元素的张量可以使用tensor.item()方法将其转换为标量也就是Python的基本类型。 t3 t1.sum() print(t3) #t3是只有一个元素的张量 print(t3.item()) #输出一个Python浮点数 代码输出 tensor(9.4620) 9.461990356445312以上代码中首先将张量中所有的元素求和得到只有一个元素的张量然后使用tensor.item()方法将其转为标量这种转换在我们希望打印模型正确率和损失值的时候很常见。 1.2.1 与NumPy数据类型的转换 1.1.1节演示了可使用torch.from_numpy()方法将ndarray转为张量张量也可以使用tensor.numpy()方法得到它对应的ndarray数组它们共用相同的内存。 ### 与ndarray数据类型的转换import numpy as np a np.random.randn(2, 3) #创建一个形状为(2,3)的ndarray print(a) #输出此ndarray t torch.from_numpy(a) #使用此ndarray创建一个张量 print(t) print(t.numpy()) #使用tensor.numpy()方法获得张量对应的ndarray代码输出 [[ 0.22605693 0.04398624 -0.21096077][-0.66368309 1.23512604 2.0399825 ]] tensor([[ 0.2261, 0.0440, -0.2110],[-0.6637, 1.2351, 2.0400]], dtypetorch.float64) [[ 0.22605693 0.04398624 -0.21096077][-0.66368309 1.23512604 2.0399825 ]]1.2.2 张量的变形 tensor.size()方法和tensor.shape属性可以返回张量的形状。当需要改变张量的形状时可以通过tensor.view()方法这个方法相当于NunPy中的reshape方法用于改变张量的形状。需要注意的是在转换过程要确保元素数量一致。代码如下。 ttorch.randn(4,6) #创建一个形状为(4,6)的张量 print(t.shape) #输出t的形状为torch.Size([4, 6]) t1t.view(3,8) #调整成(3,8)形状这里元素数量是相等的 print(t1.shape) #输出t1的形状为torch.Size([3, 8])代码输出 torch.Size([4, 6]) torch.Size([3, 8])代码分割线 #现在我们需要将t展平为最后一个维度为1的张量 #第二个参数1代表第二维长度为1参数-1表示根据元素个数自动计算第一维 t1t.view(-1,1) print(t1.shape)代码输出 torch.Size([24, 1])代码分割线 # 也可以使用view增加维度当然元素个数是不变的 t1t.view(1,4,6) #调整成三维的其中第一维的长度为1 print(t1.shape)代码输出 torch.Size([1, 4, 6])对于维度长度为1的张量可以使用torch.squeeze()方法去掉长度为1的维度相应的也有一 个增加长度为1维度的方法即torch.unsqueeze()代码如下。 t2torch.squeeze(t1) print(t2.shape)代码输出 torch.Size([4, 6])代码分割线 t3torch.unsqueeze(t2,0) #参数0表示指定在第一个维度上增加维度 print(t3.shape)代码输出 torch.Size([1, 4, 6])1.3 张量的自动微分 在PyTorch中张量有一个requires_grad属性可以在创建张量时指定些属性为True。如果requires_grad属性被设置为TruePyTorch将开始跟踪对此张量的所有计算完成计算后可以对计算结果调用backward() 方法PyTorch将自动计算所有梯度。该张量的梯度将累加到.grad属性中。张量的grad_fn属性则指向运算生成此张量的方法。简单的说张量的requires_grad属性用来明确是否跟踪张量的梯度grad属性表示计算得到的梯度grad_fn属性表示运算得到生成此张量的方法。代码演示如下。注意查看代码中的注释。 t torch.ones(2, 2, requires_gradTrue) # 这里设置 requires_grad 为True print(t.requires_grad) # 输出 True print(t.grad) # tensor.grad输出张量的梯度这里输出 None因为目前 t 没有梯度 print(t.grad_fn) # tensor.grad_fn指向运算生成此张量的方法这里为 None# 进行张量运算得到 y y t 5 print(y) # 输出 tensor([[6., 6.],[6., 6.]], grad_fnAddBackward0) # y由于是运算而创建的因此grad_fn属性不是空 print(y.grad_fn) # 输出类似AddBackward0 object at 0x00000237DF1A4250# 进行更多运算 z y * 2 out z.mean() #求张量的均值实例方法 print(out) # 输出 tensor(12., grad_fnMeanBackward0)代码输出 True None None tensor([[6., 6.],[6., 6.]], grad_fnAddBackward0) AddBackward0 object at 0x000001B460445750 tensor(12., grad_fnMeanBackward0)上面的代码中首先创建了张量并指定requires_grad属性为True因为这是一个新创建的张量它的grad和grad_fn属性均为空。然后经过加法、乘法和取均值运算得到了out这个最终结果。注意现在out只有单个元素它是一个标量值。下面在out上执行自动微分运算并输出t的梯度d(out)/d(x)微分运算的结果代码如下。 out.backward() # 自动微分运算, 注意 out 是标量值 print(t.grad) #输出t的梯度也就是d(out)/d(x)微分运算的结果代码输出 tensor([[0.5000, 0.5000],[0.5000, 0.5000]])当张量的 requires_grad 属性为 True 时PyTorch会一直跟踪记录此张量的运算 print(t.requires_grad) # 输出 True PyTorch框架会跟踪此张量的运算 s t 2 # 进行运算得到新的张量 s print(s.requires_grad) # 输出 True PyTorch框架会继续跟踪此张量的运算代码输出 True True也可使用 tensor.detach() 来获得具有相同内容但不需要跟踪运算的新张量可以认为获取张量的值代码如下。 print(out.requires_grad) # 输出 True s out.detach() # 获取out的值也可以使用out.data()方法 print(s.requires_grad) # 输出 False代码输出 True False可以使用 requires_grad_() 就地改变张量的这个属性当我们希望模型的参数不再随着训练变化时可以用此方法代码如下 print(t.requires_grad) # 输出 True t.requires_grad_(False) # 就地改变requires_grad为False print(t.requires_grad) # 输出 False代码输出 True False1.4 小结 讲解了张量的创建、PyTorch数据类型、张量运算、张量自动微分等基础知识这是PyTorch中比较基础的内容。
http://www.hkea.cn/news/14320102/

相关文章:

  • 高端网站建设kgu做特卖的网站怎么赚钱
  • 温州做网站哪里好济南室内设计学校
  • 网站建设中html模板浙江建设工程造价信息网站
  • 建网站要多少钱 东莞建设企业网站官方登录
  • 做一款app需要网站吗建筑公司资质甲级乙级
  • app网站建设开发那些网站需要备案
  • 网站建设公司正规吗python配合wordpress
  • 做耳鼻喉医院网站多少钱WordPress 长文 阅读
  • ps网站交互设计网站优化我自己可以做吗
  • 安康市建设局网站网站开发实战项目
  • 如何做物流网站笑话网站开发
  • 网站服务器排行榜泸州网站开发
  • 网站建设做得好名词解释 网站规划
  • 企业门户网站 意义东莞大岭山镇
  • 下载软件的网站网站一般用什么语言做
  • 校园网子网站建设管理意见或策划智能手机app开发
  • 网站建设报价word文档我做动作你来猜的网站
  • 怎么看自己的网站是用什么做的南通市规划建设局网站
  • 深圳制作网站开发费用做维修注册网站
  • 怎样自己做网站推广个人自助网站
  • 做高铁在哪个网站买新野seo公司
  • 私人网站免费观看网站制作分工
  • 网站建设与维护属于什么岗位阳江人才招聘网
  • 哪个模板建站好鸿顺里网站建设公司
  • 网站qq代码网站开发需要工具
  • 网站图片怎么换asp.net 发布网站 ftp
  • 一个服务器可以放多少个网站手机上怎么注销营业执照
  • 网站开发技术案例自己建网站可以赚钱吗
  • 网站 如何做后台维护公司形象墙装修效果图
  • 南山网站建设网站建设的论文的参考文献