深度学习的python基础(1)

.tensor创建

1.张量的定义

张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel,还可以考虑更多。

在代码中创建张量Tensor数据类型时,除了封装张量本身的数据data外,还会附加张量的一些性质和操作,例如数据的梯度(grad),创建tensor的函数(grad_fun,是求导的关键),是否为叶子节点(is_leaf),是否需要梯度(require_grad)。

2.张量的创建

2.1 tensor直接创建

   torch.tensor([1])   

arr = np.ones((3, 3))

    t = torch.tensor(arr, device='cuda')

    # t = torch.tensor(arr)

值得注意的点:

(1)tensor()括号里的数据可以是list(以“()”表示),也可以是数组(以[]表示),也可以是numpy,即先用numpy创建一个numpy,然后直接导入(如下);

(2)注意数据类型,有时候需要在数字后面加“.”表示float,因为求导时候需要float类型;

(3)可以添加device=’cuda’获得加速。

2.2 from_numpy从numpy中创建

    arr = np.array([[1, 2, 3], [4, 5, 6]])

    t = torch.from_numpy(arr)

      # arr[0, 0] = 0

     t[0, 0] = -1

值得注意的点:

(1)这个创建的tensor和原来的numpy共享内存,也即是说修改tensor就会修改原来的numpy。

2.3 从数字中创建

# 通过torch.zeros创建张量

out_t = torch.tensor([1])

#t=torch.zeros((3,3))

    t = torch.zeros((3, 3), out=out_t)

值得注意的点:

(1)也可以先创建一个tensor,然后在zeros函数的out接收创建的zeros,二者的size可以不一样,创建完成后二者一致。

(2)还可以torch.ones

(3)全1张量还可以用full函数

    t = torch.full((3, 3), 1)

注意试验一下是不是还可以创建全“2”张量?

(4)还可以利用torch.zeros_like(),torch.ones_like(),torch.full_like创建和input张量(类似于size,只不过是用一个真实的张量表示)一致的全0/1张量。

(5)torch.eye()创建单位对角矩阵

2.4 等差均分创建

    t = torch.arange(2, 10, 2)

(1)创建等差数列张量,后面为等差值,默认为1.

    # t = torch.linspace(2, 10, 5)

    t = torch.linspace(2, 10, 6)

(1)在[start,end]中均分n等份,这时会出现小数。

(2)还可以等log创建,torch.logspace()

2.5 依据概率创建

# 通过torch.normal创建正态分布张量

    # mean:张量 std: 张量

    # mean = torch.arange(1, 5, dtype=torch.float)

    # std = torch.arange(1, 5, dtype=torch.float)

    # t_normal = torch.normal(mean, std)

    # mean:标量 std: 标量

    # t_normal = torch.normal(0., 1., size=(4,))

    # mean:张量 std: 标量

    mean = torch.arange(1, 5, dtype=torch.float)

    std = 1

    t_normal = torch.normal(mean, std)

(1)注意mean,std可以是标量和张量的组合,共四种模式。

(2)torch.randn(),torch.randn_like()创建标准正态分布张量;

(3)torch.rand(),torch.rand_like()创建[0,1]均匀分布

(4)torch.randint(low,high),torch.randint_like(low,high)创建[low,high)均匀分布。

(5)torch.randperm(n),创建从0到n-1的随机排列张量

(6)torch.bernoulli(input),创建以input为概率值的伯努利分布张量。

3.张量的操作

3.1张量拼接

torch.cat(tensors,dim)

    t = torch.ones((2, 3))

    t_0 = torch.cat([t, t], dim=0)

    t_1 = torch.cat([t, t, t], dim=1)

(1)是在原来的维度上进行拼接

torch.stack(tensor,dim)

    t = torch.ones((2, 3))

    t_stack = torch.stack([t, t, t], dim=0)

(1)是在新创建的维度上进行拼接,如果维度小于现存的维度,则创建该维度后,后面的递推。比如t现在维度是2*3,拼接后,则是3*2*3,其中后两维的2*3是原来的t。

3.2 张量切分

torch.chunk(input,chunk,dim)

    a = torch.ones((2, 7))  # 7

    list_of_tensors = torch.chunk(a, dim=1, chunks=3)   # 3

    for idx, t in enumerate(list_of_tensors):

(1)在维度dim上进行chunk均分,如果不能整除,最后一份为余数。

torch.split(input,int/list,dim)

    t = torch.ones((2, 5))

    list_of_tensors = torch.split(t, [2, 1, 1], dim=1)  # [2 , 1, 2]

    for idx, t in enumerate(list_of_tensors):

    # list_of_tensors = torch.split(t, [2, 1, 2], dim=1)

    # for idx, t in enumerate(list_of_tensors):

(1)为int时,和chunk功能类似;

(2)为list时,可以按照设定值切分,但总和要与input维度上值一致

3.3 张量索引

torch.index_select(input,dim,select)

    t = torch.randint(0, 9, size=(3, 3))

    idx = torch.tensor([0, 2], dtype=torch.long)    # float

    t_select = torch.index_select(t, dim=0, index=idx)

(1)在dim维度上按照select索引数值。

torch.maksed_select(input,mask)

    t = torch.randint(0, 9, size=(3, 3))

    mask = t.le(5)  # ge is mean greater than or equal/   gt: greater than  le  lt

    t_select = torch.masked_select(t, mask)

 

  1. mask是和input同大小的布尔类型张量,按照TRUE返回一维张量

3.4张量变形

torch.reshape(input,shape)

    t = torch.randperm(8)

    t_reshape = torch.reshape(t, (-1, 2, 2))    # -1

    t[0] = 1024

3.5 张量维度交换

torch.transpose(input,dim1,dim2)

    # torch.transpose

    t = torch.rand((2, 3, 4))

    t_transpose = torch.transpose(t, dim0=1, dim1=2)    # c*h*w     h*w*c

(1)维度变换之后,数据是如何变化的?

(2)torch.t()二维张量(矩阵)转置

3.6 张量压缩

torch.sequeeze(input,dim)

    t = torch.rand((1, 2, 3, 1))

    t_sq = torch.squeeze(t)

    t_0 = torch.squeeze(t, dim=0)

    t_1 = torch.squeeze(t, dim=1)

(1)默认压缩所有为1的维度,也可以指定维度,若指定维度不为1,则不会压缩

(2)torch.unsequeeze(),扩展维度的值。

4.张量的数学运算

    t_0 = torch.randn((3, 3))

    t_1 = torch.ones_like(t_0)

    t_add = torch.add(t_0, 10, t_1)

  1. torch.add可同时执行乘法运算。

5.计算图

计算图是用来描述运算的有向无环图,包括结点(node)和边(edge)。结点表示数据,如向量,矩阵,张量等,边表示运算,如加减乘除卷积等。

import torch

w = torch.tensor([1.], requires_grad=True)

x = torch.tensor([2.], requires_grad=True)

a = torch.add(w, x)     # retain_grad()

b = torch.add(w, 1)

y = torch.mul(a, b)

y.backward()

print(w.grad)

# 查看叶子结点

# print("is_leaf:\n", w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)

# 查看梯度

# print("gradient:\n", w.grad, x.grad, a.grad, b.grad, y.grad)

# 查看 grad_fn

print("grad_fn:\n", w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn)

6.自动求导

torch.autograd.backward(tensors,retain_graph)

    w = torch.tensor([1.], requires_grad=True)

    x = torch.tensor([2.], requires_grad=True)

    a = torch.add(w, x)

    b = torch.add(w, 1)

    y = torch.mul(a, b)

    y.backward(retain_graph=True)

    # print(w.grad)

    y.backward()

    w = torch.tensor([1.], requires_grad=True)

    x = torch.tensor([2.], requires_grad=True)

    a = torch.add(w, x)     # retain_grad()

    b = torch.add(w, 1)

    y0 = torch.mul(a, b)    # y0 = (x+w) * (w+1)

    y1 = torch.add(a, b)    # y1 = (x+w) + (w+1)    dy1/dw = 2

    loss = torch.cat([y0, y1], dim=0)       # [y0, y1]

    grad_tensors = torch.tensor([1., 2.])

    loss.backward(gradient=grad_tensors)    # gradient 传入 torch.autograd.backward()中的grad_tensors

torch.autograd.grad(outputs,inputs,retain_graph)

    x = torch.tensor([3.], requires_grad=True)

    y = torch.pow(x, 2)     # y = x**2

    grad_1 = torch.autograd.grad(y, x, create_graph=True)   # grad_1 = dy/dx = 2x = 2 * 3 = 6

    grad_2 = torch.autograd.grad(grad_1[0], x)              # grad_2 = d(dy/dx)/dx = d(2x)/dx = 2

  1. autograd.grad()会返回梯度张量供保存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scss文件内引入其他scss文件报错

在 Sass (SCSS) 中,import 语句用于在当前文件中导入其他 Sass 文件,以便你可以重用样式和变量等。然而,从 Dart Sass 1.23.0 版本开始,import 语句已经被标记为弃用(deprecated),并计划在未来的…

Day28 贪心算法 part02

122.买卖股票的最佳时机II 本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜! class Solution {public int maxProfit(int[] prices) {//分析每一天的情况。只要保证今天买,明天卖可以不亏钱,那就是最大的利润。把每一天可以赚钱的机会都不放过,先把能挣…

Unity3D模型场景等测量长度和角度功能demo开发

最近项目用到多段连续测量物体长度和角度功能,自己研究了下。 1.其中向量角度计算: 需要传入三个坐标来进行计算。三个坐标确定两条向量线段的方向,从而来计算夹角。 public Vector3 SetAngle(Vector3 p1, Vector3 p2,Vector3 p3) { …

【MATLAB】基于RSSI的蓝牙定位与例程,设置4个基站、二维定位

目录 ​编辑 商品描述 主要功能 技术细节 适用场景 下载链接 商品描述 这款基于接收信号强度指示(RSSI)原理的蓝牙定位程序,专为需要高效、可靠定位解决方案的开发者和研究人员设计。它能够在二维平面内,通过4个锚点实现对未…

npm 最新国内淘宝镜像地址源 (旧版已不能用)

注意:原域名https://registry.npm.taobao.org/ 在 2022.06.30 号正式下线和停止 DNS 解析 最新地址: #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 查看镜像使用状态 npm config get registr…

【学习笔记】基于RTOS的设计中的堆栈溢出(Stack Overflow)-第1部分

本文由RTOS专家Jean J. Labrosse撰写。 基于RTOS的应用程序中的每个任务都需要自己的堆栈,堆栈的大小取决于任务的要求(例如,函数调用嵌套、传递给函数的参数、局部变量等)。 为了避免堆栈溢出,开发人员需要过度分配堆栈空间,但不要太多,以避免浪费RAM。 什么是堆栈溢…

单链表---移除链表元素

对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…

ROC曲线

文章目录 前言一、ROC的应用?二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中,ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异,例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…

基数排序(代码+注释)

#include <stdio.h> #include <stdlib.h>// 获取数组中的最大值 int GetMax(int* a, int n) {int max a[0];for (int i 1; i < n; i) {if (a[i] > max) {max a[i];}}return max; }// 对数组按照某个位数进行计数排序 void CountingSortForRadix(int* a, i…

10)语法分析:介词辨析

1. For 主要用法&#xff1a; 目的或原因&#xff1a;表示做某事的目的或原因。 Example: I am studying for the exam. (我在为考试学习。)Example: She bought a gift for her friend. (她为她的朋友买了一份礼物。) 持续时间&#xff1a;表示某个动作或状态的持续时间。 Ex…

第一届“吾杯”网络安全技能大赛 Writeup

战队信息 战队名称&#xff1a;在你眼中我是誰&#xff0c;你想我代替誰&#xff1f; 战队排名&#xff1a;13 Misc Sign Hex 转 Str&#xff0c;即可得到flag。 原神启动&#xff01; 不好评价&#xff0c;stegsolve 秒了&#xff1a; WuCup{7c16e21c-31c2-439e-a814-b…

AJAX一、axios使用,url组成(协议,域名,资源路径)查询参数和化简,错误处理,请求/响应报文,状态码,接口文档,

一、AJAX是什么 概念 &#xff1a; AJAX是一种与服务器&#xff08;后端&#xff09;通信的技术 二、请求库axios的基本用法 1导包 2使用 // 1. 发请求 axios({ url: 请求地址 }).then(res > { // 2.接收并使用数据 }) <body><p class"province"…

深入学习MapReduce:原理解析与基础实战

标题&#xff1a;深入学习MapReduce&#xff1a;原理解析与基础实战 MapReduce是一种分布式计算框架&#xff0c;用于大规模数据的处理和分析。作为Hadoop生态系统的核心组件&#xff0c;MapReduce凭借其简单的编程模型和强大的并行计算能力&#xff0c;广泛应用于大数据领域。…

鸿蒙HarmonyOS学习笔记(6)

定义扩展组件样式&#xff1a;Extend装饰器 在前文的示例中&#xff0c;可以使用Styles用于样式的重用&#xff0c;在Styles的基础上&#xff0c;我们提供了Extend&#xff0c;用于扩展原生组件样式。 说明 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 从…

Chrome DevTools Protocol 进阶:Runtime 域

前言 在 Chrome DevTools Protocol&#xff08;CDP&#xff09;中&#xff0c;Runtime 域是一个非常重要的部分&#xff0c;它主要用于与 JavaScript 的执行环境进行交互。通过 Runtime 域&#xff0c;开发者可以在页面上下文中执行 JavaScript 代码、评估表达式、捕获异常等操…

Android 亮度调节

frameworks/base/packages/SystemUI/src/com/android/systemui/settings/BrightnessController.java 更新屏幕亮度值Settings.System.SCREEN_BRIGHTNESS BrightnessController.java中有个onChanged事件&#xff0c;这个是更新 setBrightness(val) private void setBrightness(i…

当你访问一个网站时,数据是怎么传输的呢

摘要&#xff1a; 本文详细阐述了电脑访问网站时数据从电脑端逐步传输到服务器端的完整过程&#xff0c;深入剖析了每一步骤中数据的形态变化以及所涉及的网络协议&#xff0c;包括应用层的 HTTP 与 DNS、传输层的 TCP、网络层的 IP 以及数据链路层的以太网等协议的协同工作机制…

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…

智能化业务校验框架:动态设计与应用实践

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 &#xff08;一&#xff09;商品spu校验信息数据 &#xff08;二&#xff09;商品sku校验信息数据 &#xff08;三&#xff09;组包商品校验信息数据 &#xff08;四&#xff09;商品数据校验数据持有者 &…

鸿蒙面试 --- 性能优化(精简版)

一、性能优化的三个方面 感知流畅&#xff1a;通过合理运用动画提升用户对应用操作的感知流畅度&#xff0c;同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅&#xff08;如出现 / 消失转场、导航转场、模态转场、共享元素转场等&#xff09;&#x…