参考目录:

这一课主要是讲解PyTorch中的一些运算,加减乘除这些,当然还有矩阵的乘法这些。这一课内容不多,作为一个知识储备。在后续的内容中,有用PyTorch来获取EfficientNet预训练模型以及一个猫狗给分类的实战任务教学。

加减乘除就不多说了,+-*/

1 矩阵与标量

这个是矩阵(张量)每一个元素与标量进行操作。

  1. import torch
  2. a = torch.tensor([1,2])
  3. print(a+1)
  4. >>> tensor([2, 3])

2 哈达玛积

这个就是两个相同尺寸的张量相乘,然后对应元素的相乘就是这个哈达玛积,也成为element wise。

  1. a = torch.tensor([1,2])
  2. b = torch.tensor([2,3])
  3. print(a*b)
  4. print(torch.mul(a,b))
  5. >>> tensor([2, 6])
  6. >>> tensor([2, 6])

这个torch.mul()*是等价的。

当然,除法也是类似的:

  1. a = torch.tensor([1.,2.])
  2. b = torch.tensor([2.,3.])
  3. print(a/b)
  4. print(torch.div(a/b))
  5. >>> tensor([0.5000, 0.6667])
  6. >>> tensor([0.5000, 0.6667])

我们可以发现的torch.div()其实就是/, 类似的:torch.add就是+,torch.sub()就是-,不过符号的运算更简单常用。

3 矩阵乘法

如果我们想实现线性代数中的矩阵相乘怎么办呢?

这样的操作有三个写法:

  • torch.mm()
  • torch.matmul()
  • @,这个需要记忆,不然遇到这个可能会挺蒙蔽的
  1. a = torch.tensor([1.,2.])
  2. b = torch.tensor([2.,3.]).view(1,2)
  3. print(torch.mm(a, b))
  4. print(torch.matmul(a, b))
  5. print(a @ b)

输出结果:

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

这是对二维矩阵而言的,假如参与运算的是一个多维张量,那么只有torch.matmul()可以使用。等等,多维张量怎么进行矩阵的惩罚?在多维张量中,参与矩阵运算的其实只有后两个维度,前面的维度其实就像是索引一样,举个例子:

  1. a = torch.rand((1,2,64,32))
  2. b = torch.rand((1,2,32,64))
  3. print(torch.matmul(a, b).shape)
  4. >>> torch.Size([1, 2, 64, 64])

可以看到,其实矩阵乘法的时候,看后两个维度:\(64 \times 32\) 乘上 \(32 \times 64\),得到一个\(64 \times 64\)的矩阵。前面的维度要求相同,像是索引一样,决定哪两个\(64 \times 32\) 和 \(32 \times 64\)相乘。

小提示:

  1. a = torch.rand((3,2,64,32))
  2. b = torch.rand((1,2,32,64))
  3. print(torch.matmul(a, b).shape)
  4. >>> torch.Size([3, 2, 64, 64])

这样也是可以相乘的,因为这里涉及一个自动传播Broadcasting机制,这个在后面会讲,这里就知道,如果这种情况下,会把b的第一维度复制3次 ,然后变成和a一样的尺寸,进行矩阵相乘。

4 幂与开方

  1. print('幂运算')
  2. a = torch.tensor([1.,2.])
  3. b = torch.tensor([2.,3.])
  4. c1 = a ** b
  5. c2 = torch.pow(a, b)
  6. print(c1,c2)
  7. >>> tensor([1., 8.]) tensor([1., 8.])

和上面一样,不多说了。

开方运算可以用torch.sqrt(),当然也可以用a**(0.5)。

5 对数运算

在上学的时候,我们知道ln是以e为底的,但是在pytorch中,并不是这样

pytorch中log是以e自然数为底数的,然后log2和log10才是以2和10为底数的运算。

  1. import numpy as np
  2. print('对数运算')
  3. a = torch.tensor([2,10,np.e])
  4. print(torch.log(a))
  5. print(torch.log2(a))
  6. print(torch.log10(a))
  7. >>> tensor([0.6931, 2.3026, 1.0000])
  8. >>> tensor([1.0000, 3.3219, 1.4427])
  9. >>> tensor([0.3010, 1.0000, 0.4343])

6 近似值运算

  • .ceil() 向上取整
  • .floor()向下取整
  • .trunc()取整数
  • .frac()取小数
  • .round()四舍五入
  1. a = torch.tensor(1.2345)
  2. print(a.ceil())
  3. >>>tensor(2.)
  4. print(a.floor())
  5. >>> tensor(1.)
  6. print(a.trunc())
  7. >>> tensor(1.)
  8. print(a.frac())
  9. >>> tensor(0.2345)
  10. print(a.round())
  11. >>> tensor(1.)

7 剪裁运算

这个是让一个数,限制在你自己设置的一个范围内[min,max],小于min的话就被设置为min,大于max的话就被设置为max。这个操作在一些对抗生成网络中,好像是WGAN-GP,通过强行限制模型的参数的值。

  1. a = torch.rand(5)
  2. print(a)
  3. print(a.clamp(0.3,0.7))

输出为:

  1. tensor([0.5271, 0.6924, 0.9919, 0.0095, 0.0340])
  2. tensor([0.5271, 0.6924, 0.7000, 0.3000, 0.3000])

【小白学PyTorch】10 pytorch常见运算详解的更多相关文章

  1. 【小白学AI】GBDT梯度提升详解

    文章来自微信公众号:[机器学习炼丹术] 文章目录: 目录 0 前言 1 基本概念 2 梯度 or 残差 ? 3 残差过于敏感 4 两个基模型的问题 0 前言 先缕一缕几个关系: GBDT是gradie ...

  2. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  3. Pandas 常见操作详解

    Pandas 常见操作详解 很多人有误解,总以为Pandas跟熊猫有点关系,跟gui叔创建Python一样觉得Pandas是某某奇葩程序员喜欢熊猫就以此命名,简单介绍一下,Pandas的命名来自于面板 ...

  4. 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...

  5. 跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距

    跟我学机器视觉-HALCON学习例程中文详解-测量圆环脚宽间距 This example program demonstrates the basic usage of a circular meas ...

  6. 跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量 This example program demonstrates the basic usage of a measure object. ...

  7. 入木三分学网络第一篇--VRRP协议详解第一篇(转)

    因为keepalived使用了VRRP协议,所有有必要熟悉一下. 虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是解决局域网中配置静态网关时,静 ...

  8. Python初学者常见错误详解

    Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:”   if spam == 42 print('Hello ...

  9. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...

随机推荐

  1. 【HAOI2015】树上染色 - 树形 DP

    题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会获得黑点两两之 ...

  2. 面试中HashMap链表成环的问题你答出了吗

    HashMap作为老生常谈的问题,备受面试官的青睐,甚至成为了面试必问的问题.由于大量的针对HashMap的解析横空出世,面试官对HashMap的要求越来越高,就像面试官对JVM掌握要求越来越高一样, ...

  3. 什么是servlet(转)

    一.什么是servlet? 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西.理解这个的前提是了解一些http协议的东西,并且知道 ...

  4. 记一次 gltf 模型的绘制性能提升:从ppt到dove,丝滑感受

    转换思路 同样一个模型,分别取如下转换思路: 原始模型fbxgltf 原始模型objgltf 但是我在打开中间格式fbx和obj时,发现这两者虽然顶点数量一致,三角形数量一致,但是使用 Windows ...

  5. ftp 搭建 centos 源

    1.  yum -y install vsftpd* 2.  /etc/init.d/vsftpd restart 3.  mount CentOS-7-aarch64-Everything-1810 ...

  6. 区块链入门到实战(37)之Solidity – 循环语句

    与其他语言类似,Solidity语言支持循环结构,Solidity提供以下循环语句. while do ... while for 循环控制语句:break.continue. Solidity – ...

  7. 90%的开发都没搞懂的CI和CD!

    据IDC统计,2017年,DevOps的全球软件市场已达到约39亿美元的水平,预计到2022年市场将达到80亿美元左右! 在敏捷软件开发环境中,工作模型和操作需要对公司不断变化的需求具有超级灵活的能力 ...

  8. VUE+ElementUI创建项目

    1.官网下载node,安装node.js环境 安装完成后进入cmd,输入node -v和npm -v查看node和npm是否安装成功及对应的版本 2.全局安装vue-cli:cnpm install ...

  9. CSS布局中浮动问题的四种解决方案

    一.起因: 子盒子设置浮动之后效果: 由此可见,蓝色的盒子设置浮动之后,因为脱离了标准文档流,它撑不起父盒子的高度,导致父盒子高度塌陷.如果网页中出现了这种问题,会导致我们整个网页的布局紊乱 二.解决 ...

  10. 终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的

    一:背景 1. 讲故事 前几天有位朋友让我有时间分析一下 aspnetcore 中为什么向 ServiceCollection 中注入的 Class 可以做到 Singleton,Transient, ...