0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在TensorFlow中對(duì)Tensor進(jìn)行拆和裝

wFVr_Hardware_1 ? 來源:硬十AI ? 2022-12-29 09:24 ? 次閱讀

我們?cè)?a href="http://srfitnesspt.com/v/tag/448/" target="_blank">深度學(xué)習(xí)框架(4)-TensorFlow中執(zhí)行計(jì)算,不同激活函數(shù)各有妙用中學(xué)習(xí)了TensorFlow中執(zhí)行張量的計(jì)算,并重點(diǎn)討論一下不同的激活函數(shù)。

今天我們?cè)赥ensorFlow中對(duì)Tensor進(jìn)行“拆”和“裝”。

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

說明

(1)張量創(chuàng)建、轉(zhuǎn)化請(qǐng)參考深度學(xué)習(xí)框架(3)-TensorFlow中張量創(chuàng)建和轉(zhuǎn)化,妙用“稀疏性”提升效率(2)張量計(jì)算請(qǐng)參考深度學(xué)習(xí)框架(4)-TensorFlow中執(zhí)行計(jì)算,不同激活函數(shù)各有妙用

1、矩陣運(yùn)算的必要性

(1)Tensor是基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)

我們?cè)谏疃葘W(xué)習(xí)框架(1)-各顯神通提升Tensor效率,讓Tensor流動(dòng)還靠深度學(xué)習(xí)框架中討論過深度學(xué)習(xí)依賴Tensor運(yùn)算,我們?cè)傺a(bǔ)充一點(diǎn)背景知識(shí)。

Tensor是深度學(xué)習(xí)中廣泛使用的數(shù)據(jù)結(jié)構(gòu),TensorFlow雖然形象的把它加入到命名中,但它并不是TensorFlow特有的,在Pytroch、PaddlePaddle等眾多深度學(xué)習(xí)框架中Tensor也是基本的數(shù)據(jù)結(jié)構(gòu)。

Tensor本質(zhì)上就是一個(gè)高維的矩陣,在深度學(xué)習(xí)領(lǐng)域中,以它作為基本數(shù)據(jù)結(jié)構(gòu)是出于實(shí)際應(yīng)用的需求。

深度學(xué)習(xí)當(dāng)前最成熟的應(yīng)用方向有計(jì)算機(jī)視覺(CV,Compute Vision)和自然語言處理(NLP,Natural Language Processing)兩大領(lǐng)域。其中CV對(duì)象主要是圖像和視頻,NLP的對(duì)象以語音和文本為主;CV的基礎(chǔ)模塊是卷積神經(jīng)網(wǎng)絡(luò)(CNN,Convolutional Neural Network),NLP的基礎(chǔ)模塊是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN,Recurrent Neural Network)。這兩個(gè)應(yīng)用中標(biāo)準(zhǔn)的輸入數(shù)據(jù)集都至少是三維以上,例如:

圖像數(shù)據(jù):包含三個(gè)維度,N×H×W,即樣本數(shù)×圖像高×圖像寬;如果是彩色圖像,那么還要增加一個(gè)通道C,變?yōu)镹×C×H×W;如果是視頻圖像,那么可能還要再增加一個(gè)維度T,N×C×H×W×T。

文本數(shù)據(jù):包含三個(gè)維度:N×L×H,即樣本數(shù)×序列長(zhǎng)度×特征數(shù)。

源于應(yīng)用需要,深度學(xué)習(xí)模型的輸入數(shù)據(jù)結(jié)構(gòu)一般都要三維以上,而Tensor是好的選擇,用于支撐深度學(xué)習(xí)模型和訓(xùn)練時(shí)更為便利。

(2)矩陣運(yùn)算是基礎(chǔ)

我們?cè)谏疃葘W(xué)習(xí)框架(4)-TensorFlow中執(zhí)行計(jì)算,不同激活函數(shù)各有妙用用TensorFlow中的不同函數(shù)執(zhí)行了加法、乘法等各種運(yùn)算。

加法:矩陣的加法只有同型矩陣之間才可以進(jìn)行加法,所謂同型矩陣是兩個(gè)矩陣的行數(shù)、列數(shù)必須相等。

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

轉(zhuǎn)置:把矩陣的行和列互相交換所產(chǎn)生的矩陣稱轉(zhuǎn)置矩陣。

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

乘法:兩個(gè)矩陣乘法的必要條件是,第一個(gè)矩陣A的列數(shù)和另一個(gè)矩陣B的行數(shù)相等時(shí)才能相乘。如矩陣A是m×n矩陣和B是n×p矩陣,它們的乘積C是一個(gè)m×p矩陣。

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

分解:矩陣分解是將一個(gè)矩陣分解為簡(jiǎn)單的或具有某種特性的若干矩陣的和或乘積 ,矩陣分解法有三角分解、譜分解、奇異值分解、滿秩分解等。

我們可以把矩陣的各種操作想象為它在一定空間內(nèi),按照一定的規(guī)則進(jìn)行的運(yùn)動(dòng)(或變換)。比如一個(gè)向量和一個(gè)矩陣相乘,我們可以想象為在線性空間中,向量刻畫了對(duì)象,矩陣刻畫了對(duì)象的運(yùn)動(dòng),用矩陣與向量的乘法施加了運(yùn)動(dòng)。因此,“矩陣的本質(zhì)是運(yùn)動(dòng)的描述”,而想要執(zhí)行運(yùn)動(dòng)必須要要有約束,包括自身的形狀,運(yùn)動(dòng)的規(guī)則等等。

(3)從英偉達(dá)的Tensor Core了解Tenosr索引、重構(gòu)、切片的價(jià)值

我們?cè)谏疃葘W(xué)習(xí)框架(1)-各顯神通提升Tensor效率,讓Tensor流動(dòng)還靠深度學(xué)習(xí)框架中討論過,為滿足深度學(xué)習(xí)激增的計(jì)算量,英偉達(dá)在volta架構(gòu)上推出了第一代TensorCore,以后每一代產(chǎn)品都對(duì)TensorCore不斷升級(jí)優(yōu)化。

TensorCore是專為深度學(xué)習(xí)而設(shè)計(jì)的,它在Tensor場(chǎng)景下算得更快,對(duì)于特定大小和精度的矩陣乘法實(shí)現(xiàn)了性能的突破,與前一代Pascal相比,Volta用于訓(xùn)練的峰值性能提升12倍,用于推理的峰值性能提升了6倍。

TensorCore改進(jìn)的方向就是針對(duì)矩陣乘法(GEMM,General Matrix Mulitiplicaiton)運(yùn)算進(jìn)行優(yōu)化。矩陣運(yùn)算是神經(jīng)網(wǎng)絡(luò)訓(xùn)練和推理的核心,下圖以4×4矩陣為例,每個(gè)TensorCore都在重復(fù)執(zhí)行以下操作 D = A×B + C

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

Tensor Core在執(zhí)行矩陣乘法和加法運(yùn)算時(shí)整個(gè)裝置可簡(jiǎn)化為下圖,我們?cè)谇懊鎺渍轮杏懻摰腡ensor的convert,matual,add等操作這里均包含了,我們要注意的是,比如上圖D =A×B+C是以4×4矩陣為基礎(chǔ)的,那么在執(zhí)行這個(gè)指令前,矩陣必須通過裁剪或者整型成為一個(gè)4×4矩陣,標(biāo)準(zhǔn)的input才能在這個(gè)裝置結(jié)構(gòu)中完成指令。

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

Tensor的索引、切片、重構(gòu)、填充等操作非常常見,因?yàn)檎麄€(gè)計(jì)算系統(tǒng)中從實(shí)際應(yīng)用的輸入數(shù)據(jù)轉(zhuǎn)為了Tensor形式的數(shù)據(jù)結(jié)構(gòu),到轉(zhuǎn)化為適合放置于內(nèi)存中的數(shù)據(jù)模塊,再到轉(zhuǎn)化為計(jì)算裝置執(zhí)行計(jì)算指令的數(shù)據(jù)單元,這每個(gè)步驟中都涉及到了Tensor的“拆”和“裝”的操作。對(duì)Tensor進(jìn)行索引、重構(gòu)、切片都是程序員的必備技能。

2、如何對(duì)一個(gè)Tensor進(jìn)行“拆”和“裝”?

(1)導(dǎo)入TensorFlow,創(chuàng)建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中提取數(shù)據(jù),包括單軸索、多軸索引等。

單軸索引(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())

打印結(jié)果>>>

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])

打印結(jié)果>>>

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

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

(3)切片(Slice)

通過tf.slice()函數(shù)可以對(duì)不同維度的張量進(jìn)行切片,通過tf.gather_nd()函數(shù)可以從多個(gè)軸中提取切片。

Tensorslice

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

打印結(jié)果>>>

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

Tensor gather

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

打印結(jié)果>>>

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()可改變張量形狀,重構(gòu)速度快,資源消耗低。

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)

打印結(jié)果>>>


(3, 1)
(1, 3)

reshape tensor

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

打印結(jié)果>>>

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]))

打印結(jié)果>>>

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)數(shù)據(jù)的插入(insert)

通過tf.tensor_scatter_nd()可實(shí)現(xiàn)在不同維度的張量中插入數(shù)據(jù)。

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))

打印結(jié)果>>>

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]))

打印結(jié)果>>>

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

今天我們學(xué)習(xí)了如何在TensorFlow中對(duì)Tensor進(jìn)行“拆”和“裝”,掌握對(duì)Tensor進(jìn)行索引、重構(gòu)、切片等操作非常重要。到這里我們張量部分知識(shí)討論了很多了,下一步我們學(xué)習(xí)如何使用TensorFlow中的變量






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4726

    瀏覽量

    100315
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    328

    瀏覽量

    60445
  • nlp
    nlp
    +關(guān)注

    關(guān)注

    1

    文章

    483

    瀏覽量

    21974

原文標(biāo)題:深度學(xué)習(xí)框架(5)-TensorFlow中對(duì)Tensor進(jìn)行“拆”和“裝”

文章出處:【微信號(hào):Hardware_10W,微信公眾號(hào):硬件十萬個(gè)為什么】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于 TensorFlow

    節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。它靈活的架構(gòu)讓你可以多種平臺(tái)上展開計(jì)算,例如臺(tái)式計(jì)算機(jī)的一個(gè)或多個(gè)CPU(或GPU),服務(wù)器,移動(dòng)設(shè)備等等。
    發(fā)表于 03-30 19:57

    使用 TensorFlow, 你必須明白 TensorFlow

    tensorflow::Tensor 實(shí)例.計(jì)算圖TensorFlow 程序通常被組織成一個(gè)構(gòu)建階段和一個(gè)執(zhí)行階段. 構(gòu)建階段, op 的執(zhí)行步驟 被描述成一個(gè)圖.
    發(fā)表于 03-30 20:03

    情地使用Tensorflow吧!

    節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(tensor)。它靈活的架構(gòu)讓你可以多種平臺(tái)上展開計(jì)算,例如臺(tái)式計(jì)算機(jī)的一個(gè)或多個(gè)CPU(或GPU),服務(wù)器,移動(dòng)設(shè)備等等。
    發(fā)表于 07-22 10:13

    TensorFlow是什么

    更長(zhǎng)。TensorFlow 使這一切變得更加簡(jiǎn)單快捷,從而縮短了想法到部署之間的實(shí)現(xiàn)時(shí)間。本教程,你將學(xué)習(xí)如何利用 TensorFlow 的功能來實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)。
    發(fā)表于 07-22 10:14

    第一個(gè)TensorFlow程序(hello world)詳解

    在任何計(jì)算機(jī)語言中學(xué)習(xí)的第一個(gè)程序是都是 Hello world,本教程也將遵守這個(gè)慣例,從程序 Hello world 開始。上一節(jié)進(jìn)行 TensorFlow 安裝驗(yàn)證的代碼如下: 下面一起
    發(fā)表于 07-22 10:26

    TensorFlow教程|術(shù)語表

    API ,TensorFlow 僅僅在第一維上對(duì) Tensor 有所體現(xiàn)。如果一個(gè) Tensor 有k維,那么一個(gè) IndexedSlices 實(shí)例
    發(fā)表于 07-27 18:32

    TensorFlow教程|常見問題

    = tf.matmul(a, b) 不立即執(zhí)行矩陣相乘? TensorFlow 的 Python API , a , b , and c 都是 Tensor 對(duì)象. 一個(gè)
    發(fā)表于 07-27 18:33

    使用RTL8722DM運(yùn)行 TensorFlow Lite Hello World 示例

    指南 ambiot/ambd_arduino 下載 Ameba 定制版 TensorFlow Lite for Microcontrollers 庫(kù)。按照 Arduino - 庫(kù)的說明進(jìn)行
    發(fā)表于 06-21 15:48

    關(guān)于TensorFlowGPU的使用規(guī)則

    一套標(biāo)準(zhǔn)系統(tǒng)通常有多臺(tái)計(jì)算設(shè)備。TensorFlow 支持 CPU 和 GPU 這兩種設(shè)備。它們均用 strings 表示。
    的頭像 發(fā)表于 12-04 09:27 ?3522次閱讀

    如何基于 ES6 的 JavaScript 進(jìn)行 TensorFlow.js 的開發(fā)

    環(huán)境,如果有 CUDA 環(huán)境支持,或者瀏覽器環(huán)境,有 WebGL 環(huán)境支持,那么 TensorFlow.js 可以使用硬件進(jìn)行加速。
    的頭像 發(fā)表于 10-31 11:16 ?3054次閱讀

    tensorflow能做什么_tensorflow2.0和1.0區(qū)別

     TensorFlow是谷歌基于DistBelief進(jìn)行研發(fā)的第二_代人工智能學(xué)習(xí)系統(tǒng),其命名來源于本身的運(yùn)行原理。Tensor (張量)意味著N維數(shù)組, Flow (流)意味著基于數(shù)據(jù)流圖的計(jì)算
    的頭像 發(fā)表于 12-04 14:45 ?7949次閱讀

    五個(gè)簡(jiǎn)單步驟掌握TensorFlowTensor

    在這篇文章,我們將深入研究Tensorflow Tensor的實(shí)現(xiàn)細(xì)節(jié)。我們將在以下五個(gè)簡(jiǎn)單步驟中介紹與TensorflowTensor
    的頭像 發(fā)表于 12-24 14:35 ?880次閱讀

    Google的深度學(xué)習(xí)框架TensorFlow的優(yōu)勢(shì)分析

    TensorFlow命名源于其運(yùn)行原理,即“讓張量(Tensor)流動(dòng)起來(Flow)”,這是深度學(xué)習(xí)處理數(shù)據(jù)的核心特征。TensorFlow顯示了張量從數(shù)據(jù)流圖的一端流動(dòng)到另一端的整個(gè)計(jì)算過程,生動(dòng)形象地描述了復(fù)雜數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 11-21 10:21 ?1651次閱讀

    使用Arduino和TensorFlow進(jìn)行喚醒詞檢測(cè)

    電子發(fā)燒友網(wǎng)站提供《使用Arduino和TensorFlow進(jìn)行喚醒詞檢測(cè).zip》資料免費(fèi)下載
    發(fā)表于 12-02 11:24 ?0次下載
    使用Arduino和<b class='flag-5'>TensorFlow</b><b class='flag-5'>進(jìn)行</b>喚醒詞檢測(cè)

    使用Home Assistant進(jìn)行TensorFlow對(duì)象檢測(cè)

    電子發(fā)燒友網(wǎng)站提供《使用Home Assistant進(jìn)行TensorFlow對(duì)象檢測(cè).zip》資料免費(fèi)下載
    發(fā)表于 12-14 09:30 ?0次下載
    使用Home Assistant<b class='flag-5'>進(jìn)行</b><b class='flag-5'>TensorFlow</b>對(duì)象檢測(cè)