0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在TensorFlow中对Tensor进行拆和装

wFVr_Hardware_1 来源:硬十AI 2022-12-29 09:24 次阅读

我们在深度学习框架(4)-TensorFlow中执行计算,不同激活函数各有妙用中学习了TensorFlow中执行张量的计算,并重点讨论一下不同的激活函数。

今天我们在TensorFlow中对Tensor进行“拆”和“装”。

7c03064e-7806-11ed-8abf-dac502259ad0.png

说明

(1)张量创建、转化请参考深度学习框架(3)-TensorFlow中张量创建和转化,妙用“稀疏性”提升效率(2)张量计算请参考深度学习框架(4)-TensorFlow中执行计算,不同激活函数各有妙用

1、矩阵运算的必要性

(1)Tensor是基础的数据结构

我们在深度学习框架(1)-各显神通提升Tensor效率,让Tensor流动还靠深度学习框架中讨论过深度学习依赖Tensor运算,我们再补充一点背景知识。

Tensor是深度学习中广泛使用的数据结构,TensorFlow虽然形象的把它加入到命名中,但它并不是TensorFlow特有的,在Pytroch、PaddlePaddle等众多深度学习框架中Tensor也是基本的数据结构。

Tensor本质上就是一个高维的矩阵,在深度学习领域中,以它作为基本数据结构是出于实际应用的需求。

深度学习当前最成熟的应用方向有计算机视觉(CV,Compute Vision)和自然语言处理(NLP,Natural Language Processing)两大领域。其中CV对象主要是图像和视频,NLP的对象以语音和文本为主;CV的基础模块是卷积神经网络(CNN,Convolutional Neural Network),NLP的基础模块是循环神经网络(RNN,Recurrent Neural Network)。这两个应用中标准的输入数据集都至少是三维以上,例如:

图像数据:包含三个维度,N×H×W,即样本数×图像高×图像宽;如果是彩色图像,那么还要增加一个通道C,变为N×C×H×W;如果是视频图像,那么可能还要再增加一个维度T,N×C×H×W×T。

文本数据:包含三个维度:N×L×H,即样本数×序列长度×特征数。

源于应用需要,深度学习模型的输入数据结构一般都要三维以上,而Tensor是好的选择,用于支撑深度学习模型和训练时更为便利。

(2)矩阵运算是基础

我们在深度学习框架(4)-TensorFlow中执行计算,不同激活函数各有妙用用TensorFlow中的不同函数执行了加法、乘法等各种运算。

加法:矩阵的加法只有同型矩阵之间才可以进行加法,所谓同型矩阵是两个矩阵的行数、列数必须相等。

7c2bd70e-7806-11ed-8abf-dac502259ad0.png

转置:把矩阵的行和列互相交换所产生的矩阵称转置矩阵。

7c41b740-7806-11ed-8abf-dac502259ad0.png

乘法:两个矩阵乘法的必要条件是,第一个矩阵A的列数和另一个矩阵B的行数相等时才能相乘。如矩阵A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵。

7c4b65a6-7806-11ed-8abf-dac502259ad0.png

分解:矩阵分解是将一个矩阵分解为简单的或具有某种特性的若干矩阵的和或乘积 ,矩阵分解法有三角分解、谱分解、奇异值分解、满秩分解等。

我们可以把矩阵的各种操作想象为它在一定空间内,按照一定的规则进行的运动(或变换)。比如一个向量和一个矩阵相乘,我们可以想象为在线性空间中,向量刻画了对象,矩阵刻画了对象的运动,用矩阵与向量的乘法施加了运动。因此,“矩阵的本质是运动的描述”,而想要执行运动必须要要有约束,包括自身的形状,运动的规则等等。

(3)从英伟达的Tensor Core了解Tenosr索引、重构、切片的价值

我们在深度学习框架(1)-各显神通提升Tensor效率,让Tensor流动还靠深度学习框架中讨论过,为满足深度学习激增的计算量,英伟达在volta架构上推出了第一代TensorCore,以后每一代产品都对TensorCore不断升级优化。

TensorCore是专为深度学习而设计的,它在Tensor场景下算得更快,对于特定大小和精度的矩阵乘法实现了性能的突破,与前一代Pascal相比,Volta用于训练的峰值性能提升12倍,用于推理的峰值性能提升了6倍。

TensorCore改进的方向就是针对矩阵乘法(GEMM,General Matrix Mulitiplicaiton)运算进行优化。矩阵运算是神经网络训练和推理的核心,下图以4×4矩阵为例,每个TensorCore都在重复执行以下操作 D = A×B + C

7c67c6ec-7806-11ed-8abf-dac502259ad0.png

Tensor Core在执行矩阵乘法和加法运算时整个装置可简化为下图,我们在前面几章中讨论的Tensor的convert,matual,add等操作这里均包含了,我们要注意的是,比如上图D =A×B+C是以4×4矩阵为基础的,那么在执行这个指令前,矩阵必须通过裁剪或者整型成为一个4×4矩阵,标准的input才能在这个装置结构中完成指令。

7c7af780-7806-11ed-8abf-dac502259ad0.png

Tensor的索引、切片、重构、填充等操作非常常见,因为整个计算系统中从实际应用的输入数据转为了Tensor形式的数据结构,到转化为适合放置于内存中的数据模块,再到转化为计算装置执行计算指令的数据单元,这每个步骤中都涉及到了Tensor的“拆”和“装”的操作。对Tensor进行索引、重构、切片都是程序员的必备技能。

2、如何对一个Tensor进行“拆”和“装”

(1)导入TensorFlow,创建tensor

import tensorflow as tf
importnumpyasnp


rank_1_tensor = tf.constant([0, 1, 1, 2, 3, 5, 8, 13, 21, 34])


rank_2_tensor=tf.constant([[1,2], [3,4], [5,6]])


rank_3_tensor=tf.constant([
  [[0, 1, 2, 3, 4],
   [5, 6, 7, 8, 9]],
  [[10, 11, 12, 13, 14],
   [15, 16, 17, 18, 19]],
  [[20, 21, 22, 23, 24],
   [25, 26, 27, 28, 29]],])

(2)索引(indexing)

通过索引我们可以在Tensor中提取数据,包括单轴索、多轴索引等。

单轴索引(single-axis indexing)

print("First:", rank_1_tensor[0].numpy())
print("From 4 to the end:", rank_1_tensor[4:].numpy())
print("From2,before7:",rank_1_tensor[2:7].numpy())

打印结果>>>

First: 0
From 4 to the end: [ 3  5  8 13 21 34]
From 2, before 7: [1 2 3 5 8]

多轴索引(muti-axis indexing)

print(rank_3_tensor[:,:,4])

打印结果>>>

tf.Tensor(
[[ 4  9]
 [14 19]
 [24 29]], shape=(3, 2), dtype=int32)

7c9ece1c-7806-11ed-8abf-dac502259ad0.png

(3)切片(Slice)

通过tf.slice()函数可以对不同维度的张量进行切片,通过tf.gather_nd()函数可以从多个轴中提取切片。

Tensorslice

print(tf.slice(rank_3_tensor, begin=[1,1,0],size=[1,1,2]))

打印结果>>>

tf.Tensor([[[1516]]],shape=(1,1,2),dtype=int32)

Tensor gather

print(tf.gather_nd(rank_3_tensor,indices=[[2],[0]]))

打印结果>>>

tf.Tensor(
[[[20 21 22 23 24]
[2526272829]]

 [[ 0  1  2  3  4]
  [ 5  6  7  8  9]]], shape=(2, 2, 5), dtype=int32)

(4)形状的整理变换(Reshaping)

通过tf.reshape()可改变张量形状,重构速度快,资源消耗低。

reshape matrix

var_x = tf.Variable(tf.constant([[1], [2], [3]]))
print(var_x.shape.as_list)
reshaped = tf.reshape(var_x, [1,3])
print(var_x.shape)
print(reshaped.shape)

打印结果>>>


(3, 1)
(1, 3)

reshape tensor

print(tf.reshape(rank_3_tensor,[3*2,5]),"n")

打印结果>>>

tf.Tensor(
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]
 [25 26 27 28 29]], shape=(6, 5), dtype=int32)

7cd956e0-7806-11ed-8abf-dac502259ad0.png

reshape tensor

print(tf.reshape(rank_3_tensor,[3,-1]))

打印结果>>>

tf.Tensor(
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]], shape=(3, 10), dtype=int32)

7cf3b31e-7806-11ed-8abf-dac502259ad0.png

(5)数据的插入(insert)

通过tf.tensor_scatter_nd()可实现在不同维度的张量中插入数据。

insert data into vector

t1 = tf.constant([10])
indices = tf.constant([[1], [3], [5], [7], [9]])
data = tf.constant([2, 4, 6, 8, 10])


print(tf.scatter_nd(indices=indices, updates=data, shape=t1))

打印结果>>>

tf.Tensor([ 0  2  0  4  0  6  0  8  0 10], shape=(10,), dtype=int32)

insert data into tensor

t2 = tf.constant([[2, 7, 0],
                   [9, 0, 1],
                   [0, 3, 8]])


print(tf.tensor_scatter_nd_add(t2, indices=[[0,2],[1,1],[2,0]], updates=[6,5,4]))

打印结果>>>

tf.Tensor(
[[2 7 6]
 [9 5 1]
 [4 3 8]], shape=(3, 3), dtype=int32)

今天我们学习了如何在TensorFlow中对Tensor进行“拆”和“装”,掌握对Tensor进行索引、重构、切片等操作非常重要。到这里我们张量部分知识讨论了很多了,下一步我们学习如何使用TensorFlow中的变量






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4568

    浏览量

    98702
  • tensorflow
    +关注

    关注

    13

    文章

    313

    浏览量

    60242
  • nlp
    nlp
    +关注

    关注

    1

    文章

    463

    浏览量

    21816

原文标题:深度学习框架(5)-TensorFlow中对Tensor进行“拆”和“装”

文章出处:【微信号:Hardware_10W,微信公众号:硬件十万个为什么】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于 TensorFlow

    节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以多种平台上展开计算,例如台式计算机的一个或多个CPU(或GPU),服务器,移动设备等等。
    发表于 03-30 19:57

    使用 TensorFlow, 你必须明白 TensorFlow

    tensorflow::Tensor 实例.计算图TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段. 构建阶段, op 的执行步骤 被描述成一个图.
    发表于 03-30 20:03

    干货!教你怎么搭建TensorFlow深度学习开发环境!

    `TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算
    发表于 09-27 13:56

    情地使用Tensorflow吧!

    节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以多种平台上展开计算,例如台式计算机的一个或多个CPU(或GPU),服务器,移动设备等等。
    发表于 07-22 10:13

    TensorFlow是什么

    更长。TensorFlow 使这一切变得更加简单快捷,从而缩短了想法到部署之间的实现时间。本教程,你将学习如何利用 TensorFlow 的功能来实现深度神经网络。
    发表于 07-22 10:14

    TensorFlow安装和下载(超详细)

    的更多详细信息,请参考https://conda.io/docs/user-guide/index.html。本教程的代码已经以下平台上进行了测试:Windows 10,Anaconda 3
    发表于 07-22 10:25

    第一个TensorFlow程序(hello world)详解

    在任何计算机语言中学习的第一个程序是都是 Hello world,本教程也将遵守这个惯例,从程序 Hello world 开始。上一节进行 TensorFlow 安装验证的代码如下: 下面一起
    发表于 07-22 10:26

    TensorFlow常量、变量和占位符详解

    TensorFlow 图中。它们可以和 feed_dict 一起使用来输入数据。训练神经网络时,它们通常用于提供新的训练样本。会话运行计算图时,可以为占位符赋值。这样
    发表于 07-22 16:12

    TensorFlow教程|术语表

    API TensorFlow 仅仅在第一维上对 Tensor 有所体现。如果一个 Tensor 有k维,那么一个 IndexedSlices 实例
    发表于 07-27 18:32

    TensorFlow教程|常见问题

    = tf.matmul(a, b) 不立即执行矩阵相乘? TensorFlow 的 Python API , a , b , and c 都是 Tensor 对象. 一个
    发表于 07-27 18:33

    使用RTL8722DM运行 TensorFlow Lite Hello World 示例

    指南 ambiot/ambd_arduino 下载 Ameba 定制版 TensorFlow Lite for Microcontrollers 库。按照 Arduino - 库的说明进行
    发表于 06-21 15:48

    Ubuntu 18.04 for Arm上运行的TensorFlow和PyTorch的Docker映像

    tensorflow-v2armpl示例脚本最终映像的 $HOME 目录中提供。要使用 TensorFlow ImageNet 最小验证数据集上运行 resnet50
    发表于 10-14 14:25

    什么是TensorFlow数据流图?详细TensorFlow数据流图(动图)免费下载

    TensorFlow最基本的一次计算流程通常是这样的:首先它接受n个固定格式的数据输入,通过特定的函数,将其转化为n个张量(Tensor)格式的输出。
    发表于 08-22 16:18 9次下载
    什么是<b class='flag-5'>TensorFlow</b>数据流图?详细<b class='flag-5'>TensorFlow</b>数据流图(动图)免费下载

    五个简单步骤掌握TensorFlow中的Tensor

    在这篇文章中,我们将深入研究Tensorflow Tensor的实现细节。我们将在以下五个简单步骤中介绍与TensorflowTensor中相关的所有主题:第一步:张量的定义→什么是
    的头像 发表于 12-24 14:35 733次阅读

    使用Arduino和TensorFlow进行唤醒词检测

    电子发烧友网站提供《使用Arduino和TensorFlow进行唤醒词检测.zip》资料免费下载
    发表于 12-02 11:24 0次下载
    使用Arduino和<b class='flag-5'>TensorFlow</b><b class='flag-5'>进行</b>唤醒词检测