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

上一讲深度学习图像处理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。下一讲,我们会对深度学习图像处理的核心元素——卷积操作,进行讲解。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vscode初建Vue时几个需要注意的问题

首先放图 注意点1.打开文件夹时,可以是VUE2 或者其他,但不能是VUE,会报错 注意点2.终端输入命令“npm init -y" npm init -y -y 的含义:yes的意思,在init的时候省去了敲回车的步骤,生成的默认的packag…

【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题

题目:求一个整数存储在内存中的二进制中的1的个数 目录 法一:取模与取余 法二:按位与和移位操作符 法三:利用算法去掉二进制中最右边的1 课外练习1:用位运算判断一个数是否是2的次方数 课外练习2:编…

【Word自动化办公】使用python-docx对Word进行操作

目录 一、环境安装 二、文档各组成结构获取 2.1 组成结构讲解 2.2 段落run对象的切分标准 三、获取整篇文档内容 四、写入指定样式的数据 4.1 通过add_paragraph与add_run参数添加样式 4.2 单独设置文本样式 五、添加标题 六、换行符&换页符 七、添加图片数据 …

64位下使用回调函数实现监控(下)

线程监控&保护 PsSetCreateThreadNotifyRoutine 线程监控使用到的API相对于进程监控简单,使用到PsSetCreateThreadNotifyRoutine,而这个值并不能像进程操作的API一样进行操作,这里我们首先先使用这个API来进行线程的监控 NotifyRoutine…

wayland(xdg_wm_base) + egl + opengles 使用 Assimp 加载材质文件Mtl 中的纹理图片最简实例(十六)

文章目录 前言一、3d 立方体 model 属性相关文件1. cube.obj2. cube.Mtl3. 纹理图片 cordeBouee4.jpg二、代码实例1. 依赖库和头文件1.1 assimp1.2 stb_image.h2. egl_wayland_obj_cube.cpp3. Matrix.h 和 Matrix.cpp4. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c5.…

部署Zabbix Agents添加使能监测服务器_Linux平台_Yum源/Archive多模式

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

使用Python抓取抖音直播间数据的简易指南【第152篇—抓取数据】

使用Python抓取抖音直播间数据的简易指南 说明:本文已脱敏,隐去地址。 在这个数字化时代,直播已经成为了人们获取信息、娱乐和社交的重要方式之一。抖音作为全球知名的短视频平台,其直播功能也备受用户青睐。本文将介绍如何使用Py…

生成式人工智能

生成式人工智能(Generative AI)是人工智能的一个分支,专注于创建或生成新的内容,包括文本、图像、音频和视频等。与识别或分类等任务不同,生成式AI的目标是创造出在某种程度上新颖且具有实际意义的输出。这种类型的AI系…

Vue3 组件之间的通信

一、父子通信 ① props 父传子&#xff08;这种传值方法是只读的&#xff0c;不可以进行修改。&#xff09; 父组件props.vue中 <template><h2>props:我是父组件</h2><hr><props-child msg"我是静态的数据" :num"num" :obj&…

VTK9.2.0+Qt5.14.0 绘制点云

背景 为了显示结构光重建后的点云&#xff0c;开发QT5.14.0VTK9.2.0的上位机软件&#xff0c;用于对结构光3D相机进行控制&#xff0c;并接收传输回来的3D数据&#xff0c;显示在窗口中。 配置QT和VTK VTK9.2.0下载源码&#xff0c;用Cmake编译&#xff0c;编译好的VTK9.2.0…

GitHub gpg体验

文档 实践 生成新 GPG 密钥 gpg --full-generate-key查看本地GPG列表 gpg --list-keys关联GPG公钥与Github账户 gpg --armor --export {key_id}GPG私钥对Git commit进行签名 git config --local user.signingkey {key_id} # git config --global user.signingkey {key_id} git…

30V转5V 1A 30降压12V 1A DCDC低电压恒压IC 车充芯片-H4110

30V转5V和30V转12V的DCDC低电压恒压IC&#xff08;也称为降压恒压芯片或车充芯片&#xff09;工作原理如下&#xff1a; 输入电压识别&#xff1a;芯片首先识别输入的30V电压&#xff0c;并准备进行转换。 PWM控制&#xff1a;芯片内部的控制逻辑生成PWM信号。这个信号用于控制…

JVM—内存可见性

什么是可见性 可见性&#xff1a;一个线程对共享变量值的修改,能够及时地被其他线程看到共享变量&#xff1a;如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JMM) Java内存模型(Java Memory Model)描述了Java程序中各种…

Qt教程 — 3.7 深入了解Qt 控件: Layouts部件

目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中&#xff0c;布局管理器&#xff08;Layouts&#xff09;是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…

BAAI 北京智源研究院

文章目录 关于 BAAI产品悟道大模型FlagOpen 大模型技术天演 生物智能九鼎 智算平台 关于 BAAI BAAI : Beijing Academy of Artificial Intelligence 北京智源研究院 官网&#xff1a;https://www.baai.ac.cnhf : https://huggingface.co/BAAI百度百科 https://baike.baidu.co…

物联网云组态是什么?部署物联网云组态有什么作用?

在信息化与工业化的深度融合进程中&#xff0c;物联网云组态以其独特的优势&#xff0c;正在成为企业数字化转型的重要工具。那么&#xff0c;物联网云组态究竟是什么呢&#xff1f;部署物联网云组态又能给企业带来哪些实质性的好处呢&#xff1f;今天&#xff0c;我们将围绕这…

2核4G服务器多少钱?阿里云价格30元起

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

AI智能分析网关V4在养老院视频智能监控场景中的应用

随着科技的快速发展&#xff0c;智能监控技术已经广泛应用于各个领域&#xff0c;尤其在养老院这一特定场景中&#xff0c;智能监控方案更是发挥着不可或缺的作用。尤其是伴随着社会老龄化趋势的加剧&#xff0c;养老院的安全管理问题也日益凸显。为了确保老人的生活安全&#…

Ruby选择结构实战

文章目录 一、Ruby选择结构实战概述二、Ruby选择结构实战案例&#xff08;一&#xff09;闰年判断1、编写程序&#xff0c;实现功能2、程序的解释说明3、运行程序&#xff0c;查看结果 &#xff08;二&#xff09;求解一元二次方程1、编写程序&#xff0c;实现功能2、程序的解释…

界面控件DevExpress ASP.NET Ribbon组件 - 完美复刻Office 365体验!

无论用户是喜欢传统工具栏菜单外观、样式&#xff0c;还是想在下一个项目中复制Office 365 web UI&#xff0c;DevExpress ASP.NET都提供了所需要的工具&#xff0c;帮助用户打造更好的应用程序界面。 P.S&#xff1a;DevExpress ASP.NET Web Forms Controls拥有针对Web表单&a…