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

深度学习的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()会返回梯度张量供保存。

相关文章:

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…...

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者:陈承 背景 在 2018 年的 2 月,ARMS Java Agent 的第一个版本正式发布,为用户提供无侵入的的可观测数据采集服务。6 年后的今天,随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长,我们逐渐发现过…...

003 MATLAB基础计算

01 方程组的求解 多项式及其运算 多项式在MATLAB中以向量形式存储。 即n次多项式用一个长度为n1的系数向量来表示,且按降幂,缺少的幂次对应的向量元素为0。 多项式的运算主要包括多项式的四则运算、求导、求值和求根运算 多项式的四则运算&#xff1a…...

安卓逆向之Android-Intent介绍

Intent是各个组件之间交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,而且还能在各组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。Intent有多个构造函数的重载。 显式intent 显式 Intent 明确指定要启动的…...

数据库日期时间用什么类型?

数据库中的日期时间类型主要包括DATE、TIME、DATETIME和TIMESTAMP等,它们在存储、格式和范围等方面有所不同。以下是这些类型的详细说明和异同比较: 1. DATE类型 用途:用于存储日期值,不包含时间部分。格式:YYYY-MM-…...

Python中字符串和正则表达式

Python中字符串和正则表达式 在Python编程中,字符串是最常用的数据类型之一。字符串用于表示文本数据,而正则表达式则是一种强大的工具,用于处理和匹配字符串中的模式。本文将介绍Python中的字符串操作、字符串格式化以及如何使用正则表达式…...

Leecode刷题C语言之N皇后

执行结果:通过 执行用时和内存消耗如下&#xff1a; 代码如下&#xff1a; int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1))…...

即时通讯| IM+RTC在AI技术加持下的社交体验

即时通讯作为互联网的重要应用之一&#xff0c;见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流&#xff0c;发展到如今的语音、视频通话&#xff0c;甚至是虚拟现实社交&#xff0c;已经渗透到生活的社交、娱乐、商务等方方面面&#xff0c;成为现代社会不可或缺的一…...

repo仓库转移到自己本地的git服务器

前提条件&#xff1a;搭建好gitolite 以转移正点原子rk3568_linux工程为例子&#xff0c;将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...

微服务即时通讯系统的实现(服务端)----(2)

目录 1. 语音识别子服务的实现1.1 功能设计1.2 模块划分1.3 模块功能示意图1.4 接口的实现 2. 文件存储子服务的实现2.1 功能设计2.2 模块划分2.3 模块功能示意图2.4 接口的实现 3. 用户管理子服务的实现3.1 功能设计3.2 模块划分3.3 功能模块示意图3.4 数据管理3.4.1 关系数据…...

人工智能-深度学习-神经网络-激活函数

激活函数通过引入非线性来增强神经网络的表达能力&#xff0c;对于解决线性模型的局限性至关重要。由于反向传播算法(BP)用于更新网络参数&#xff0c;因此激活函数必须是可微的&#xff0c;也就是说能够求导的。 满足激活函数的条件 1.可微分&#xff0c;也就是可求导 激活函…...

vue3+ts+uniapp微信小程序顶部导航栏

这是colorui改的&#xff0c;不用就不用看啦 color-ui(https://docs.xzeu.com/#/) 新建component文件夹创建topNavigation.vue <template><view><view class"cu-custom" :style"height: CustomBar px"><view class"cu-bar…...

IAR中编译下载未下载问题

第一张图片是正常下载&#xff0c;第二张未正常下载。经过查看download选项发现 启用了 suppress download &#xff08;禁用下载)...

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…...

英语系统语法书面记载:高级语法 8 的状语从句

在英语高级语法中&#xff0c;状语从句是一种用来修饰动词、形容词、副词或整个句子的从句&#xff0c;它提供有关时间、地点、原因、条件、方式、让步等信息。状语从句通常由特定的连词引导。以下是常见的几种状语从句类型及其用法&#xff1a; 1. 时间状语从句 (Adverbial Cl…...

C语言:深入理解指针(1)

一.内存和地址 在讲内存和地址之前&#xff0c;我们想有个生活中的案例&#xff1a; 假设有一栋宿舍楼&#xff0c;把你放在楼里&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的一个朋友来找你玩&#xff0c;如果想找到你&#xff0c;就得挨个房子去…...

priority_queue--优先队列

一、认识优先队列 priority_queue&#xff08;优先队列&#xff09;是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器。它的底层实现通常是用堆&#xff08;一般是二叉堆&#xff09;来实现的。优先队列中的元素按照一定的优先级顺序进行排列&#xff0c;在队首的…...

Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算

论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …...

开发一套ERP 第八弹 RUst 插入数据

更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...

回退用 git revert 还是 git reset?

git revert 会生成一个新的 commit 来记录此次操作&#xff1b;git reset 是把 HEAD 指针向前挪动一次&#xff0c;会减少一个 commit。 回退用 git revert 回退还是用 git reset&#xff0c;核心就一点&#xff1a; 是否需要记录这次回退。 如果需要记录这次回退&#xff0c…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...