深度学习图像处理02:Tensor数据类型

news2024/12/28 4:12:17

上一讲深度学习图像处理01:图像的本质,我们了解到图像处理的本质是对矩阵的操作。这一讲,我们讲介绍深度学习图像处理的基本数据类型:Tensor类型。

在深度学习领域,Tensor是一种核心的数据结构,用于表示和处理数据。本文将详细介绍Tensor数据类型,包括其定义、如何创建和操作Tensors,特别是在图像处理和深度学习中的应用。我们将通过实例、数学公式和Python代码来深入理解Tensor。

1. 什么是Tensor?

Tensor,简而言之,是一个多维数组,是标量、向量和矩阵的高维推广。在深度学习中,Tensors是算法的基本构建块,用于表示和处理数据,如图像、声音或文本。

  • 0维Tensor:标量(Scalar),例如一个数字。
  • 1维Tensor:向量(Vector),例如一个数字列表。
  • 2维Tensor:矩阵(Matrix),例如二维数组。
  • n维Tensor:更高维度的数组。

2. Tensor数据基本操作

2.1 Tensor的创建

以下是使用PyTorch创建Tensors的一些基本例子:

import torch

# 创建一个空的Tensor
x = torch.empty(5, 3)
print("Empty Tensor:\n", x)

# 创建一个随机初始化的Tensor
x = torch.rand(5, 3)
print("Random Tensor:\n", x)

# 创建一个全为0,类型为long的Tensor
x = torch.zeros(5, 3, dtype=torch.long)
print("Zero Tensor:\n", x)

# 创建一个直接从数据的Tensor
x = torch.tensor([5.5, 3])
print("Tensor from data:\n", x)

运行结果:

Empty Tensor:
 tensor([[-2.2140e-26,  8.0995e-43, -2.2140e-26],
        [ 8.0995e-43, -2.2140e-26,  8.0995e-43],
        [-2.2140e-26,  8.0995e-43, -2.2140e-26],
        [ 8.0995e-43, -2.2140e-26,  8.0995e-43],
        [-2.2140e-26,  8.0995e-43, -2.2140e-26]])


Random Tensor:
 tensor([[0.0027, 0.5500, 0.1749],
        [0.9315, 0.9860, 0.2204],
        [0.9672, 0.5092, 0.0170],
        [0.1733, 0.3858, 0.8220],
        [0.0176, 0.2597, 0.3035]])


Zero Tensor:
 tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])


Tensor from data:
 tensor([5.5000, 3.0000])

2.2 模拟生成二维矩阵

二维矩阵是处理图像时常用的数据结构,每个元素可以代表图像中的一个像素值。以下是如何使用PyTorch创建一个二维矩阵:

import torch
# 创建一个5x3的随机二维矩阵
matrix = torch.rand(5, 3)
print("Random Matrix:\n", matrix)

运行结果:

Random Matrix:
 tensor([[0.5890, 0.0223, 0.0294],
        [0.9720, 0.1617, 0.6436],
        [0.0723, 0.4613, 0.3779],
        [0.2925, 0.7364, 0.7298],
        [0.0533, 0.1137, 0.2888]])

2. Tensor的操作

在深度学习和图像处理中,主要是对Tensor数据进行操作。这些操作包括但不限于算术运算、形状变换、索引和切片等,它们使得我们能够有效地处理和变换数据以适应不同的算法需求。

2.1 算术运算

Tensor支持各种算术运算,这些运算可以是元素级别的,也可以是矩阵乘法等更复杂的运算。

(1)元素级别的加法运算

假设有两个相同形状的矩阵 A 和 B,它们的形状为 m×n。元素级别的加法可以表示为:eq?C_%7Bij%7D%20%3D%20A_%7Bij%7D%20+%20B_%7Bij%7D

(2)矩阵乘法

假设有两个矩阵 A 和 B,其中 A 的形状为 m×p,B 的形状为 p×n。矩阵乘法可以表示为:eq?C_%7Bij%7D%20%3D%20%5Csum_%7Bk%3D1%7D%5E%7Bn%7D%20A_%7Bik%7DB_%7Bkj%7D

下面代码分别战术元素级别的加法和矩阵乘法

import torch

# 元素级别的加法
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
print("Element-wise Sum:\n", x + y)

# 矩阵乘法
x = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
print("Matrix Multiplication:\n", torch.mm(x, y))

运行结果:

Broadcasted Addition:
 tensor([[2, 3, 4],
        [3, 4, 5],
        [4, 5, 6]])


Element-wise Sum:
 tensor([4, 6])


Matrix Multiplication:
 tensor([[19, 22],
        [43, 50]])


2.2 维度操作

在深度学习中,经常需要对Tensor的维度进行操作,包括增加维度、减少维度、或是重排维度顺序,这对于匹配不同层期望的输入输出形状非常关键。

代码首先生成一个二维矩阵,然后依次进行增加一个维度,再减少一个维度,最后重排维度三个操作。代码如下:

import torch
# 生成一个二维矩阵
x = torch.tensor([[1, 2], [3, 4]])
print(f'x:\n{x}')
print(f'Tensor x shape:{x.shape}')
print(f'*'*50)

# 增加一个维度
x_unsqueeze = x.unsqueeze(0)  # 在第0维增加
print(f'x_unsqueeze:\n{x_unsqueeze}')
print("Tensor x_unsqueeze shape:", x_unsqueeze.shape)
print(f'*'*50)

# 减少一个维度
x_squeeze = x_unsqueeze.squeeze(0)  # 减少第0维
print(f'x_squeeze:\n{x_squeeze}')
print("Tensor x_squeeze shape:\n", x_squeeze.shape)
print(f'*'*50)

# 重排维度
x_permute = x.unsqueeze(0).permute(2, 1, 0)  # 将维度重排
print(f'Tensor x_permute:\n{x_permute}')
print("Tensor x_permute shape:\n", x_permute.shape)
print(f'*'*50)

运行结果:

x:
tensor([[1, 2],
        [3, 4]])
Tensor x shape:torch.Size([2, 2])
**************************************************
x_unsqueeze:
tensor([[[1, 2],
         [3, 4]]])
Tensor x_unsqueeze shape: torch.Size([1, 2, 2])
**************************************************
x_squeeze:
tensor([[1, 2],
        [3, 4]])
Tensor x_squeeze shape:
 torch.Size([2, 2])
**************************************************
Tensor x_permute:
tensor([[[1],
         [3]],

        [[2],
         [4]]])
Tensor x_permute shape:
 torch.Size([2, 2, 1])
**************************************************

2.3 Tensor的合并与分割

在进行数据预处理或模型输出后处理时,经常需要合并或分割Tensor。合并可以将不同的数据集拼接成更大的数据集,分割则可以将数据集分成更小的批次进行处理。

以下代码,对Tensor的合并于分割进行演示

import torch
# 合并Tensors
x = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
z = torch.cat([x, y], dim=0)  # 沿着行合并, dim=1是沿着列合并
print("Tensors after concatenation:\n", z)
print('*'*50)

# 分割Tensor
x = torch.arange(1, 10)
x_split = torch.split(x, 3)  # 每个部分包含3个元素
print("Tensors after split:")
for tensor in x_split:
    print(tensor)
print('*'*50)

运行结果:

 Tensors after concatenation:
 tensor([[1, 2],
        [3, 4],
        [5, 6],
        [7, 8]])
**************************************************
Tensors after split:
tensor([1, 2, 3])
tensor([4, 5, 6])
tensor([7, 8, 9])
**************************************************

2.4 广播

广播(Broadcasting)是Tensor数据操作一种的机制,允许不同形状的Tensors进行数学运算。在某些条件下,较小的Tensor会自动扩展到较大的Tensor的大小。

x = torch.tensor([1, 2, 3])
y = torch.tensor([[1], [2], [3]])
# 通过广播,x会自动扩展成[[1, 2, 3], [1, 2, 3], [1, 2, 3]]以匹配y的形状
print("Broadcasted Addition:\n", x + y)

运行结果:

Broadcasted Addition:
 tensor([[2, 3, 4],
        [3, 4, 5],
        [4, 5, 6]]) 

3. 总结

了解Tensor数据类型,掌握Tensor的基础操作是深度学习和图像处理中的基本技能。通过对Tensors的高级操作的理解和应用,能够更有效地进行数据预处理、模型训练以及结果分析。

现在我们通过第一讲深度学习图像处理01:图像的本质,了解了图像处理的本质是对矩阵进行操作。这一讲,了解了深度学习图像处理的基本数据类型:Tensor。下一讲,我们会对深度学习图像处理的核心元素——卷积操作,进行讲解。

 

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

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

相关文章

蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

一、题目要求 在CT107D单片机综合训练平台上,通过I/O模式编写代码,实现以下功能: 系统上电后,关闭蜂鸣器、继电器和全部指示灯,数码管显示初始值为28,仅显示数码管最右边两位。利用定时器0实现10ms间隔定…

代码随想录第20天| 654.最大二叉树 617.合并二叉树

654.最大二叉树 654. 最大二叉树 - 力扣(LeetCode) 代码随想录 (programmercarl.com) 又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili 给定一个不重复的整数数组 nums 。 最大二叉树 可以…

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325

摘 要 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

不敢想象吧!Anzo Capital发现不仅经济事件影响汇率天气也是

在投资交易中弄懂汇率的走势方向,对各位投资者的交易盈利那还不是小菜一碟,但各位投资者你们想象不到吧!Anzo Capital发现不仅经济事件能影响汇率,就连天气也能轻易影响汇率。 就用2015年1月15日的经济事件来说,当瑞…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数:orient 即可 ,但对于写入orient的不同,字典的构造方式也不同,官网一共给出了6种&#xff0c…

基于springboot+vue的流浪动物管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

2002-2023年各地级市环境规制强度数据(环保词频统计)

2002-2023年各地级市环境规制强度数据(环保词频统计) 1、时间:2002-2023年 2、来源:政府工作报告 3、指标: 行政区划代码、年份、城市、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档,并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界,检索的结果取决于相关性,相关性计算…

ssm004新生报到系统+jsp

新生报到系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱,出错率…

JS运行时大盘点,出新JS运行时了!

大家好,我是奇兵, 在前端技术日新月异的今天,新的 JavaScript 运行时环境不断涌现,它们为开发者提供了更多的选择和可能性。近期,诸如 LLRT 和 WinterJS 等新运行时环境的发布,进一步丰富了 JavaScript 运…

实战 | 任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处,输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面,点击发送验证码,然后用BURP发包 更改手机号传参,这里手机号传参没有进行加密,直接用手机号的位置进行爆破 正确的…

cad怎么画洗菜盆平面图?

CAD绘制住宅平面布置图的时候,特别是对厨房区域的绘制时,需要使用到洗菜盆图块该怎么绘制洗菜盆平面图呢?下面我们就来看看详细的教程。 1、打开AutoCAD 2013软件,点击【图层特性管理器】,点击【新建图层】&#xff0…

maya打开bvh脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件,点击右下角 “脚本编辑器” 运行打开bvh脚本 https://github.com/jhoolmans/mayaImporterBVH/blob/master/bvh_importer.py import os import re from typing impo…

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题: 由于代码是串行方式,流程大致为:开…

关于网格数据导出指定格式的测试(以Gmsh导出nas格式为例)

本文主要讲述Gmsh如何导出nas格式的网格数据,众所周知,Gmsh可以导出多种网格数据格式,比如大家熟悉的msh、stl、inp、cgns(似乎不完善)等等,但是gmsh不支持nas格式的导出,只支持nas格式的导入&a…

基于java+springboot+vue实现的图书借阅系统(文末源码+Lw+ppt)23-328

摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统,帮助商…

Harmony(鸿蒙)Stage模型综述

设计思想 ​Stage模型的设计,是为了提供给开发者一个更好的开发方式,更好的适用于多设备、分布式场景。 ​Stage模型的设计思想如下图所示。 ​Stage模型的设计基于如下三个出发点: 应用进程的有序管理 随着设备的内存越来越大&#xff0…

【docker】查看并拷贝容器内文件

一、查询容器 查询所有容器 docker ps查询名为os11的容器 docker ps | grep os11查询名为os11的容器(包含不运行的) docker ps -a| grep os11 docker ps [option] 显示结果介绍如下: 参考:[https://blog.51cto.com/u_15009374/31…

详解华为软件研发管理IPD

IPD,即集成产品开发(Integrated Product Development),是一种综合多种管理模型和理论、企业最佳实践的管理体系。旨在帮助企业快速适应市场变化,缩短产品上市时间,减少资源浪费,并提高生产力,以实现商业成功。 IPD的核心是跨部门团队的合作,涉及市场、研发、制造、服…

java项目将静态资源中的文件转为浏览器可访问的http地址

新增一个类叫啥无所谓,主要是实现 WebMvcConfigurer 加上注解 Configuration项目启动时加入bean中 只操作addResourceHandlers这一个方法 其他都没用 文章下方附带一个简易的上传图片代码 package cn.exam.config;import org.springframework.context.annotati…