深度學習總結(3)

數據批量的概念

通常來說,深度學習中所有數據張量的第一個軸(也就是軸0,因為索引從0開始)都是樣本軸[samples axis,有時也叫樣本維度(samples dimension)?]?。深度學習模型不會一次性處理整個數據集,而是將數據拆分成小批量。下面是MNIST數據集的一個批量,批量大小為128。

batch = train_images[:128]

對于這種批量張量,第一個軸(軸0)叫作批量軸(batch axis)或批量維度(batch dimension)?。在使用Keras和其他深度學習庫時,你會經常遇到“批量軸”這個術語。

現實世界中的數據張量實例

向量數據:形狀為(samples, features)的2階張量,每個樣本都是一個數值(?“特征”?)向量。時間序列數據或序列數據:形狀為(samples, timesteps, features)的3階張量,每個樣本都是特征向量組成的序列(序列長度為timesteps)?。圖像數據:形狀為(samples, height, width, channels)的4階張量,每個樣本都是一個二維像素網格,每個像素則由一個“通道”?(channel)向量表示。視頻數據:形狀為(samples, frames, height, width, channels)的5階張量,每個樣本都是由圖像組成的序列(序列長度為frames)?。

向量數據

這是最常見的一類數據。對于這種數據集,每個數據點都被編碼為一個向量,因此一個數據批量就被編碼為一個2階張量(由向量組成的數組)?,其中第1個軸是樣本軸,第2個軸是特征軸(features axis)?。

時間序列數據或序列數據

當時間(或序列順序)對數據很重要時,應該將數據存儲在帶有時間軸的3階張量中。每個樣本可被編碼為一個向量序列(2階張量)?,因此一個數據批量就被編碼為一個3階張量。

圖像數據

圖像通常具有3個維度:高度、寬度和顏色深度。雖然灰度圖像只有一個顏色通道,因此可以保存在2階張量中,但按照慣例,圖像張量都是3階張量。
圖像張量的形狀有兩種約定:通道在后(channels-last)的約定(這是TensorFlow的標準)和通道在前(channels-first)的約定(使用這種約定的人越來越少)?。

視頻數據

視頻數據是現實世界中為數不多的需要用到5階張量的數據類型。視頻可以看作幀的序列,每一幀都是一張彩色圖像。由于每一幀都可以保存在一個形狀為(height, width,color_depth)的3階張量中,因此一個視頻(幀的序列)可以保存在一個形狀為(frames, height, width, color_depth)的4階張量中,由多個視頻組成的批量則可以保存在一個形狀為(samples, frames, height, width, color_depth)的5階張量中。

神經網絡的“齒輪”?:張量運算

所有計算機程序最終都可以簡化為對二進制輸入的一些二進制運算(AND、OR、NOR等)?,與此類似,深度神經網絡學到的所有變換也都可以簡化為對數值數據張量的一些張量運算(tensor operation)或張量函數(tensor function)?,如張量加法、張量乘法等。下面是一個Keras層的實例。

keras.layers.Dense(512, activation="relu")

這個層理解為一個函數,其輸入是一個矩陣,返回的是另一個矩陣,即輸入張量的新表示。這個函數具體如下(其中W是一個矩陣,b是一個向量,二者都是該層的屬性)?。

output = relu(dot(input, W) + b)

這里有3個張量運算。輸入張量和張量W之間的點積運算(dot)?。由此得到的矩陣與向量b之間的加法運算(+)?。relu運算。relu(x)就是max(x, 0),relu代表“修正線性單元”?(rectified linear unit)?。

逐元素運算

relu運算和加法都是逐元素(element-wise)運算,即該運算分別應用于張量的每個元素。也就是說,這些運算非常適合大規模并行實現(向量化實現)?。如果你想對逐元素運算編寫一個簡單的Python實現,那么可以使用for循環。下列代碼是對逐元素relu運算的簡單實現。

def naive_relu(x):#x是一個2階NumPy張量assert len(x.shape) == 2#避免覆蓋輸入張量x = x.copy()for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] = max(x[i, j], 0)return x

對于加法,可采用同樣的實現方法。

def naive_add(x, y):#x和y是2階NumPy張量assert len(x.shape) == 2assert x.shape == y.shape#避免覆蓋輸入張量x = x.copy()for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] += y[i, j]return x

利用同樣的方法,可以實現逐元素的乘法、減法等。在實踐中處理NumPy數組時,這些運算都是優化好的NumPy內置函數。這些函數將大量運算交給基礎線性代數程序集(Basic Linear Algebra Subprograms,BLAS)實現。BLAS是低層次(low-level)?、高度并行、高效的張量操作程序,通常用Fortran或C語言來實現。因此,在NumPy中可以直接進行下列逐元素運算,速度非常快

import numpy as np
#逐元素加法
#z = x + y
# 逐元素relu
#z = np.maximum(z, 0.)

我們來看一下兩種方法運行時間的差別。

import timex = np.random.random((20, 100))
y = np.random.random((20, 100))
t0 = time.time()
for _ in range(1000):z = x + yz = np.maximum(z, 0.)
print("Took: {0:.2f} s".format(time.time() - t0))

只需要0.00秒。與之相對,前面手動編寫的簡單實現耗時長達0.77秒。

t0 = time.time()
for _ in range(1000):z = naive_add(x, y)z = naive_relu(z)
print("Took: {0:.2f} s".format(time.time() - t0))

同樣,在GPU上運行TensorFlow代碼,逐元素運算都是通過完全向量化的CUDA來完成的,可以最大限度地利用高度并行的GPU芯片架構。

廣播

naive_add的簡單實現僅支持兩個形狀相同的2階張量相加,但在Dense層中,我們將一個2階張量與一個向量相加。如果將兩個形狀不同的張量相加,會發生什么?在沒有歧義且可行的情況下,較小的張量會被廣播(broadcast)?,以匹配較大張量的形狀。廣播包含以下兩步。(1)向較小張量添加軸[叫作廣播軸(broadcast axis)?]?,使其ndim與較大張量相同。(2)將較小張量沿著新軸重復,使其形狀與較大張量相同。我們來看一個具體的例子。假設X的形狀是(32, 10),y的形狀是(10,)。

import numpy as np
#X是一個形狀為(32, 10)的隨機矩陣
X = np.random.random((32, 10))  
#y是一個形狀為(10,)的隨機向量
y = np.random.random((10,))  

首先,我們向y添加第1個軸(空的)?,這樣y的形狀變為(1, 10)。

#現在y的形狀變為(1, 10)
y = np.expand_dims(y, axis=0) 

然后,我們將y沿著這個新軸重復32次,這樣得到的張量Y的形狀為(32, 10),并且Y[i,:] == y for i in range(0, 32)

#將y沿著軸0重復32次后得到Y,其形狀為(32, 10)
Y = np.concatenate([y] * 32, axis=0) 

現在,我們可以將X和Y相加,因為它們的形狀相同。在實際的實現過程中并不會創建新的2階張量,因為那樣做非常低效。重復操作完全是虛擬的,它只出現在算法中,而沒有出現在內存中。但想象將向量沿著新軸重復10次,是一種很有用的思維模型。下面是一種簡單實現。

def naive_add_matrix_and_vector(x, y):#x是一個2階NumPy張量assert len(x.shape) == 2 # y是一個NumPy向量assert len(y.shape) == 1 assert x.shape[1] == y.shape[0]#避免覆蓋輸入張量x = x.copy() for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] += y[j]return x

如果一個張量的形狀是(a, b, …, n, n+1, …, m),另一個張量的形狀是(n, n+1, …, m),那么通常可以利用廣播對這兩個張量做逐元素運算。廣播會自動應用于從a到n-1的軸。下面這個例子利用廣播對兩個形狀不同的張量做逐元素maximum運算。

import numpy as np
#x是一個形狀為(64, 3, 32, 10)的隨機張量
x = np.random.random((64, 3, 32, 10)) 
#y是一個形狀為(32, 10)的隨機張量
y = np.random.random((32, 10)) 
#輸出z的形狀為(64, 3, 32, 10),與x相同
z = np.maximum(x, y) 

本文代碼匯總:

def naive_add(x, y):#x和y是2階NumPy張量assert len(x.shape) == 2assert x.shape == y.shape#避免覆蓋輸入張量x = x.copy()for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] += y[i, j]return ximport numpy as np
#逐元素加法
#z = x + y
# 逐元素relu
#z = np.maximum(z, 0.)import timex = np.random.random((20, 100))
y = np.random.random((20, 100))
t0 = time.time()
for _ in range(1000):z = x + yz = np.maximum(z, 0.)
print("Took: {0:.2f} s".format(time.time() - t0))t0 = time.time()
for _ in range(1000):z = naive_add(x, y)z = naive_relu(z)
print("Took: {0:.2f} s".format(time.time() - t0))import numpy as np
#X是一個形狀為(32, 10)的隨機矩陣
X = np.random.random((32, 10))
#y是一個形狀為(10,)的隨機向量
y = np.random.random((10,))#現在y的形狀變為(1, 10)
y = np.expand_dims(y, axis=0)#將y沿著軸0重復32次后得到Y,其形狀為(32, 10)
Y = np.concatenate([y] * 32, axis=0)def naive_add_matrix_and_vector(x, y):#x是一個2階NumPy張量assert len(x.shape) == 2# y是一個NumPy向量assert len(y.shape) == 1assert x.shape[1] == y.shape[0]#避免覆蓋輸入張量x = x.copy()for i in range(x.shape[0]):for j in range(x.shape[1]):x[i, j] += y[j]return ximport numpy as np
#x是一個形狀為(64, 3, 32, 10)的隨機張量
x = np.random.random((64, 3, 32, 10))
#y是一個形狀為(32, 10)的隨機張量
y = np.random.random((32, 10))
#輸出z的形狀為(64, 3, 32, 10),與x相同
z = np.maximum(x, y)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76234.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟慶祝它成立整整50周年

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

【操作系統(Linux)】——通過案例學習父子進程的線程異步性

本篇旨在通過幾個案例來學習父子進程的線程異步性 一、父進程與子進程 我們將要做的&#xff1a; 創建父子進程&#xff0c;觀察父子進程執行的順序&#xff0c;了解進程執行的異步行為 源代碼&#xff1a; #include <stdio.h> #include <sys/types.h> #include…

系統性能核心指標:QPS、TPS、RT、并發量詳解

系統性能核心指標&#xff1a;QPS、TPS、RT、并發量詳解 1. 引言 在分布式系統、高并發架構設計中&#xff0c;QPS、TPS、RT、并發量 等指標是衡量系統性能的關鍵。本文深入解析這些術語的定義、計算方法、關聯性及優化策略&#xff0c;幫助開發者更好地進行系統性能評估與調…

PortswiggerLab:Exploiting a mass assignment vulnerability

實驗目標 To solve the lab, find and exploit a mass assignment vulnerability to buy a Lightweight l33t Leather Jacket. You can log in to your own account using the following credentials: wiener:peter. 官方WP In Burps browser, log in to the application using…

卡爾曼濾波器的工作原理

原文: https://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/ 1 概述 你可以對某個動態系統有不確定信息的任何地方使用卡爾曼濾波器&#xff0c;并且對系統下一步的狀態做出有根據的猜測。即使出現混亂的現實狀態&#xff0c;卡爾曼濾波器都會給出一個合理的結果。…

PDFtk

如果下載的pdf文件有秘鑰的話&#xff0c;使用下面linux命令去掉秘鑰&#xff1a; pdftk 納稅記錄.pdf input_pw 261021 output 納稅記錄_output.pdf將多個單頁pdf合并為一個pdf的linux命令: pdftk 自然人電子稅務局1.pdf 自然人電子稅務局2.pdf 自然人電子稅務局3.pdf 自然人…

Openlayers:海量圖形渲染之WebGL渲染

最近由于在工作中涉及到了海量圖形渲染的問題&#xff0c;因此我開始研究相關的解決方案。我在網絡上尋找相關的解決方案時發現許多的文章都提到利用Openlayers中的WebGLPointsLayer類&#xff0c;可以實現渲染海量的點&#xff0c;之后我又了解到利用WebGLVectorLayer類可以渲…

替換jeecg圖標

替換jeecg圖標 ant-design-vue-jeecg/src/components/tools/Logo.vue <!-- <img v-else src"~/assets/logo.svg" alt"logo">-->

Codeforces Round 970 (Div. 3)題解

題目地址 https://codeforces.com/contest/2008 銳評 本次D3的前四題還是比較簡單的&#xff0c;沒啥難度區分&#xff0c;基本上差不多&#xff0c;屬于手速題。E的碼量比F大一些&#xff0c;實現略顯復雜一些。G的數學思維較明顯&#xff0c;如果很久沒有訓練這個知識點&a…

操作系統:線程間同步之事件集

事件集是線程間同步的機制之一&#xff0c;一個事件集可以包含多個事件&#xff0c;利用事件集可以完成一對多、多對多的線程間同步。 目錄 一、事件集舉例說明 二、事件集工作機制 三、RT-Thread為實例說明 四、事件集的應用場合 一、事件集舉例說明 以坐公交車為例&…

基于springboot鉆孔數據管理系統的設計與實現(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 本鉆孔數據管理系統采用B/S架構&#xff0c;數據庫是MySQL&#xff0c;網站的搭建與開發采用了先進的Java語言、Hadoop、數據可視化技術進行編寫&#xff0c;使用了Spring Boot框架。該系統從兩個對象&#xff1a;由管理員和用戶來對系統進行設計構建。用戶主要功能包括&…

全雙工分軌語音數據集:讓AI實現無縫對話

清晨&#xff0c;智能音箱根據指令-播放音樂&#xff1b;駕駛途中&#xff0c;車載助手同步處理導航與來電&#xff1b;智能會議工具無縫切換多語種對話……語音交互技術正快速融入生活。然而&#xff0c;用戶對于對話體驗追求更自然、更流暢&#xff0c;實時理解&#xff0c;動…

Python 網絡請求利器:requests 包詳解與實戰

諸神緘默不語-個人技術博文與視頻目錄 文章目錄 一、前言二、安裝方式三、基本使用1. 發起 GET 請求2. 發起 POST 請求 四、requests請求調用常用參數1. URL2. 數據data3. 請求頭 headers4. 參數 params5. 超時時間 timeout6. 文件上傳 file&#xff1a;上傳純文本文件流7. jso…

linux入門四:Linux 編譯器

一、C 語言編譯器 GCC&#xff1a;開啟編程之旅 1.1 GCC 安裝&#xff1a;一站式工具鏈 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 下最常用的 C/C 編譯器&#xff0c;支持多種編程語言。安裝命令&#xff08;適用于 Debian/Ubuntu 系統&#xff09;&…

建筑兔零基礎自學記錄69|爬蟲Requests-2

Requests庫初步嘗試 #導入requests庫 import requests #requests.get讀取百度網頁 rrequests.get(http://www.baidu.com) #輸出讀取網頁狀態 print(r.status_code) #輸出網頁源代碼 print(r.text) HTTP 狀態碼是三位數字&#xff0c;用于表示 HTTP 請求的結果。常見的狀態碼有…

Web測試流程及注意點

在Web工程過程中&#xff0c;基于Web系統的測試、確認和驗收是一項重要而富有挑戰性的工作。基于Web的系統測試與傳統的軟件測試不同&#xff0c;它不但需要檢查和驗證是否按照設計的要求運行&#xff0c;而且還要測試系統在不同用戶的瀏覽器端的顯示是否合適。 重要的是&…

基于MATLAB/simulink的信號調制仿真--AM調制

實驗內容&#xff1a; 假設y(t)(20.5*2cos&#xff08;2*pi*1000*t&#xff09;)*5cos&#xff08;2*pi*2*1e4*t&#xff09;調幅系統&#xff0c;請將一個頻率為1000HZ的余弦波信號&#xff0c;通過進行AM調制&#xff0c;載波信號頻率為20kHZ的余弦波&#xff0c;調制度ma0.…

通信協議詳解(十):PSI5 —— 汽車安全傳感器的“抗干擾狙擊手”

一、PSI5是什么&#xff1f; 一句話秒懂 PSI5就像傳感器界的“防彈信使”&#xff1a;在汽車安全系統&#xff08;如氣囊&#xff09;中&#xff0c;用兩根線同時完成供電數據傳輸&#xff0c;即便車禍時線路受損&#xff0c;仍能確保關鍵信號準確送達&#xff01; 基礎概念…

數據結構與算法-圖論-復習1(單源最短路,全源最短路,最小生成樹)

1. 單源最短路 單一邊權 BFS 原理&#xff1a;由于邊權為單一值&#xff0c;可使用廣度優先搜索&#xff08;BFS&#xff09;來求解最短路。BFS 會逐層擴展節點&#xff0c;由于邊權相同&#xff0c;第一次到達某個節點時的路徑長度就是最短路徑長度。 用法&#xff1a;適用…

【WRF理論第十七期】單向/雙向嵌套機制(含namelist.input詳細介紹)

WRF運行的單向/雙向嵌套機制 準備工作&#xff1a;WRF運行的基本流程namelist.input的詳細設置&time_control 設置&domain 嵌套結構&bdy_control 配置部分 namelist 其他注意事項Registry.EM 運行 ARW 嵌套雙向嵌套&#xff08;two-way nesting&#xff09;單向嵌套…