(d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ
開源項目地址:d2l-ai/d2l-zh
教材官網(wǎng):https://zh.d2l.ai/
書介紹:https://zh-v2.d2l.ai/
筆記基于2021年7月26日發(fā)布的版本,書及代碼下載地址在github網(wǎng)頁的最下面
交流者論壇
額外:
https://distill.pub/
(d2l-ai/d2l-zh)《動手學(xué)深度學(xué)習(xí)》pytorch 筆記(1)(序言、pytorch的安裝、神經(jīng)網(wǎng)絡(luò)涉及符號)
文章目錄
- 1、前言(35)
- 1.1 ?常?活中的機(jī)器學(xué)習(xí)(36)
- 1.2 關(guān)鍵組件(37)
- 1.2.1 數(shù)據(jù)(38)
- 1.2.2 模型(39)
- 1.2.3 目標(biāo)函數(shù)(39)
- 1.2.4 優(yōu)化算法(39)
- 1.3 各種機(jī)器學(xué)習(xí)問題(40)
- 1.3.1 監(jiān)督學(xué)習(xí)(40)
- 回歸(regression)(41)
- 分類(classification)(41)
- 標(biāo)記問題(43)
- 搜索(44)
- 推薦系統(tǒng)(recommender system)(44)
- 序列學(xué)習(xí)(45)
- 標(biāo)記和解析 token&parser(46)Ent(entity)
- 自動語?識別(46)
- 文本到語音(46)
- 機(jī)器翻譯(46)
- 其他序列學(xué)習(xí)應(yīng)?(46)
- 1.3.2 ?監(jiān)督學(xué)習(xí)(unsupervised learning)(47)
- 1.3.3 與環(huán)境互動(47)
- 1.3.4 強(qiáng)化學(xué)習(xí)(reinforcement learning)(48)
- 1.4 起源(50)
- 1.5 深度學(xué)習(xí)之路(51)
- 1.6 成功案例(53)
- 1.7 特點(diǎn)(55)
- 1.8 小結(jié)(56)
- 1.9 練習(xí)(56)
- 2、預(yù)備知識(57)
- 2.1 數(shù)據(jù)操作(58)
- 2.1.1 入門(58)
- 行向量arange,形狀shape,元素個數(shù)numel,修改形狀reshape
- 全0張量zeros和全1張量ones:
- randn 初始化網(wǎng)絡(luò)參數(shù)值,均值為0、標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)?斯(正態(tài))分布中隨機(jī)采樣
- tensor 直接分別為張量每個元素指定值
- 2.1.2 運(yùn)算(60)
- 一維張量和差積商冪
- 一維張量自然指數(shù)e的冪 exp
- 張量 連結(jié) cat(concatenate)
- 邏輯判斷True、False 逐個對比張量中的元素 ==
- 對張量中所有元素求和 sum
- 2.1.3 廣播機(jī)制(broadcasting mechanism)(自動匹配形狀)(62)
- 2.1.4 索引和切片(63)
- 2.1.5 節(jié)省內(nèi)存(張量內(nèi)存使用規(guī)范)(63)
- 2.1.6 轉(zhuǎn)換為其他 Python 對象(64)
- 2.1.7 小結(jié)(65)
- 2.1.8 練習(xí)(65)
- 2.2 數(shù)據(jù)預(yù)處理(65)
- 2.2.1 讀取數(shù)據(jù)集(65)
- 2.2.2 處理缺失值NaN(插值和刪除)(66)
- 2.2.3 轉(zhuǎn)換為張量格式(67)iloc、fillna、get_dummies
- 2.2.4 小結(jié)(67)
- 2.2.5 練習(xí)(68)
1、前言(35)
1.1 ?常?活中的機(jī)器學(xué)習(xí)(36)
數(shù)據(jù)集(dataset)(36)
參數(shù)(parameter)
最佳參數(shù)集
模型(model)
模型族:通過操作參數(shù)而生成的所有不同程序(輸入-輸出映射)的集合
學(xué)習(xí)算法(learning algorithm):使用數(shù)據(jù)集來選擇參數(shù)的元程序
學(xué)習(xí)(learning):模型的訓(xùn)練過程(37)通過這個過程,我們可以發(fā)現(xiàn)正確
的參數(shù)集,從而從使模型強(qiáng)制執(zhí)行所需的行為。換句話說,我們用數(shù)據(jù)訓(xùn)練(train)我們的模型。
訓(xùn)練過程通常包含如下步驟:(37)
1.2 關(guān)鍵組件(37)
1.2.1 數(shù)據(jù)(38)
樣本(example) & 數(shù)據(jù)點(diǎn)(data point) & 數(shù)據(jù)實例(data instance)
獨(dú)立同分布(independently and identically distributed, i.i.d.)
通常每個樣本由?組稱為特征(features,或協(xié)變量(covariates))的屬性組成。
在監(jiān)督學(xué)習(xí)問題中,要預(yù)測的是一個特殊的屬性,它被稱為標(biāo)簽(label,或目標(biāo)(target))
當(dāng)每個樣本的特征類別數(shù)量都是相同的,所以其特征向量是固定長度的,這個長度被稱為數(shù)據(jù)的維數(shù)(dimensionality)固定長度的特征向量是一個方便的屬性,它有助于我們量化學(xué)習(xí)大量樣本。(38)
與傳統(tǒng)機(jī)器學(xué)習(xí)方法相比,深度學(xué)習(xí)的一個主要優(yōu)勢是可以處理不同長度的數(shù)據(jù)。
1.2.2 模型(39)
深度學(xué)習(xí)與經(jīng)典方法的區(qū)別主要在于:前者關(guān)注的功能強(qiáng)大的模型,這些模型由神經(jīng)網(wǎng)絡(luò)錯綜復(fù)雜的交織在?起,包含層層數(shù)據(jù)轉(zhuǎn)換,因此被稱為深度學(xué)習(xí)(deep learning)。
1.2.3 目標(biāo)函數(shù)(39)
在機(jī)器學(xué)習(xí)中,我們需要定義模型的優(yōu)劣程度的度量,這個度量在?多數(shù)情況是“可優(yōu)化”的,我們稱之為目標(biāo)函數(shù)(objective function)
損失函數(shù)(loss function, 或cost function)
當(dāng)任務(wù)為試圖預(yù)測數(shù)值時,最常見的損失函數(shù)是平方誤差(squared error),即預(yù)測值與實際值之差的平方
當(dāng)試圖解決分類問題時,最常?的?標(biāo)函數(shù)是最小化錯誤率,即預(yù)測與實際情況不符的樣本?例
通常,損失函數(shù)是根據(jù)模型參數(shù)定義的,并取決于數(shù)據(jù)集。在?個數(shù)據(jù)集上,我們通過最小化總損失來學(xué)習(xí)模型參數(shù)的最佳值。該數(shù)據(jù)集由?些為訓(xùn)練而收集的樣本組成,稱為訓(xùn)練數(shù)據(jù)集(training dataset,或稱為訓(xùn)練集(training set))。然而,在訓(xùn)練數(shù)據(jù)上表現(xiàn)良好的模型,并不?定在“新數(shù)據(jù)集“上有同樣的效能,這?的“新數(shù)據(jù)集“通常稱為測試數(shù)據(jù)集(test dataset,或稱為測試集(test set))。
數(shù)據(jù)集分成兩部分:訓(xùn)練數(shù)據(jù)集?于擬合模型參數(shù),測試數(shù)據(jù)集?于評估擬合的模型
當(dāng)?個模型在訓(xùn)練集上表現(xiàn)良好,但不能推?到測試集時,我們說這個模型是“過擬合”(overfitting)的
1.2.4 優(yōu)化算法(39)
?旦我們獲得了?些數(shù)據(jù)源及其表?、?個模型和?個合適的損失函數(shù),我們接下來就需要?種算法,它能夠搜索出最佳參數(shù),以最小化損失函數(shù)。深度學(xué)習(xí)中,大多流?的優(yōu)化算法通常基于?種基本?法?梯度下降(gradient descent)。
1.3 各種機(jī)器學(xué)習(xí)問題(40)
1.3.1 監(jiān)督學(xué)習(xí)(40)
監(jiān)督學(xué)習(xí)(supervised learning)擅?在“給定輸?特征”的情況下預(yù)測標(biāo)簽。每個“特征-標(biāo)簽”對都稱為?個樣本(example)。
在?業(yè)中,?部分機(jī)器學(xué)習(xí)的成功應(yīng)?都是監(jiān)督學(xué)習(xí)。這是因為在?定程度上,許多重要的任務(wù)可以清晰地描述為:在給定?組特定的可?數(shù)據(jù)的情況下,估計未知事物的概率。
回歸(regression)(41)
回歸(regression)是最簡單的監(jiān)督學(xué)習(xí)任務(wù)之?。
判斷回歸問題的?個很好的經(jīng)驗法則是,任何有關(guān)“多少”的問題很可能就是回歸問題。?如:
? 這個?術(shù)需要多少小時?
? 在未來六小時,這個鎮(zhèn)會有多少降?量?
?斯噪聲(41)
分類(classification)(41)
分類(classification)問題。在分類問題中,我們希望模型能夠預(yù)測樣本屬于哪個類別(category,正式稱為類(class))。
最簡單的分類問題是只有兩類,我們稱之為“?元分類”。
當(dāng)我們有兩個以上的類別時,我們把這個問題稱為多類分類(multiclass classification)問題。
與解決回歸問題不同,分類問題的常?損失函數(shù)被稱為交叉熵
(cross-entropy)。
有?些分類任務(wù)的變體可以?于尋找層次結(jié)構(gòu),層次結(jié)構(gòu)假定在許多類之間存在某種關(guān)系。因此,并不是所有的錯誤都是均等的。我們寧愿錯誤地分??個相關(guān)的類別,也不愿錯誤地分??個遙遠(yuǎn)的類別,這通常被稱為層次分類(hierarchical classification)。
標(biāo)記問題(43)
學(xué)習(xí)預(yù)測不相互排斥的類別的問題稱為多標(biāo)簽分類(multilabel classification)。
搜索(44)
有時,我們不僅僅希望輸出為?個類別或?個實值。在信息檢索領(lǐng)域,我們希望對?組項?進(jìn)?排序。
該問題的?種可能的解決?案:?先為集合中的每個元素分配相應(yīng)的相關(guān)性分?jǐn)?shù),然后檢索評級最?的元素。
推薦系統(tǒng)(recommender system)(44)
另?類與搜索和排名相關(guān)的問題是推薦系統(tǒng)(recommender system),它的?標(biāo)是向給特定??進(jìn)?“個性化”推薦。
反饋循環(huán)(45)啥意思?
序列學(xué)習(xí)(45)
與時間相關(guān)的,如病人狀況監(jiān)測、視頻幀序列、文字序列、語音序列
序列學(xué)習(xí)需要攝取輸入序列或預(yù)測輸出序列,或兩者兼而有之。具體來說,輸?和輸出都是可變?度的序列,例如機(jī)器翻譯和從語?中轉(zhuǎn)錄?本。
標(biāo)記和解析 token&parser(46)Ent(entity)
自動語?識別(46)
文本到語音(46)
機(jī)器翻譯(46)
困難在于不同語言之間的語法差異
其他序列學(xué)習(xí)應(yīng)?(46)
確定“??閱讀??的順序”是?維布局分析問題。
對話問題:確定下?輪對話,需要考慮對話歷史狀態(tài)以及現(xiàn)實世界的知識
1.3.2 ?監(jiān)督學(xué)習(xí)(unsupervised learning)(47)
數(shù)據(jù)中不含有“?標(biāo)”的機(jī)器學(xué)習(xí)問題為?監(jiān)督學(xué)習(xí)(unsupervised learning)
? 聚類(clustering)問題:沒有標(biāo)簽的情況下,給數(shù)據(jù)分類
? 主成分分析(principal component analysis)問題:找到少量的參數(shù)來準(zhǔn)確地捕捉數(shù)據(jù)的線性相關(guān)屬性
? 因果關(guān)系(causality)和概率圖模型(probabilistic graphical models)問題:描述觀察到的許多數(shù)據(jù)的根本原因
? ?成對抗性?絡(luò)(generative adversarial networks):提供?種合成數(shù)據(jù)的?法,甚?像圖像和音頻這樣復(fù)雜的結(jié)構(gòu)化數(shù)據(jù);檢查真實和虛假數(shù)據(jù)是否相同
1.3.3 與環(huán)境互動(47)
學(xué)習(xí)是在算法與環(huán)境斷開后進(jìn)?的,被稱為離線學(xué)習(xí)(offline learning)
離線學(xué)習(xí)缺點(diǎn)是,解決的問題相當(dāng)有限。與預(yù)測不同,“與真實環(huán)境互動”實際上會影響環(huán)境。
環(huán)境變化:當(dāng)訓(xùn)練和測試數(shù)據(jù)不同時數(shù)據(jù)分布偏移(distribution shift)的問題
1.3.4 強(qiáng)化學(xué)習(xí)(reinforcement learning)(48)
使?機(jī)器學(xué)習(xí)開發(fā)與環(huán)境交互并采取?動
涉及領(lǐng)域:機(jī)器?、對話系統(tǒng),甚?開發(fā)視頻游戲的??智能(AI)。
深度強(qiáng)化學(xué)習(xí)(deep reinforcement learning)將深度學(xué)習(xí)應(yīng)?于強(qiáng)化學(xué)習(xí)的問題
舉例:深度Q?絡(luò)(Q-network)、AlphaGo 程序
在強(qiáng)化學(xué)習(xí)問題中,agent 在?系列的時間步驟上與環(huán)境交互。在每個特定時間點(diǎn),agent 從環(huán)境接收?些觀察(observation),并且必須選擇?個動作(action),然后通過某種機(jī)制(有時稱為執(zhí)?器)將其傳輸回環(huán)境,最后 agent 從環(huán)境中獲得 獎勵(reward)。此后新?輪循環(huán)開始,agent 接收后續(xù)觀察,并選擇后續(xù)操作,依此類推。
強(qiáng)化學(xué)習(xí)的?標(biāo)是產(chǎn)??個好的策略(policy)。強(qiáng)化學(xué)習(xí) agent 的選擇的”動作“受策略控制,即?個從環(huán)境觀察映射到?動的功能。
任何監(jiān)督學(xué)習(xí)問題都能轉(zhuǎn)化為強(qiáng)化學(xué)習(xí)問題(49)
環(huán)境甚?可能不會告訴我們是哪些?為導(dǎo)致了獎勵(49)
強(qiáng)化學(xué)習(xí)者必須處理學(xué)分分配(credit assignment)問題:決定哪些?為是值得獎勵的,哪些?為是需要懲罰的(49)
強(qiáng)化學(xué)習(xí)可能還必須處理部分可觀測性問題。(49)(看不懂啥意思@)
當(dāng)環(huán)境可被完全觀察到時,我們將強(qiáng)化學(xué)習(xí)問題稱為?爾可夫決策過程(markov decision process)。當(dāng)狀態(tài)不依賴于之前的操作時,我們稱該問題為上下?賭博機(jī)(contextual bandit problem)。當(dāng)沒有狀態(tài),只有?組最初未知回報的可?動作時,這個問題就是經(jīng)典的多臂賭博機(jī)(multi-armed bandit problem)。
1.4 起源(50)
最小均?算法
估計(estimation)(50)
修剪均值估計(50)
神經(jīng)?絡(luò)(neural networks)核心:
? 線性和?線性處理單元的交替,通常稱為層(layers)。
? 使?鏈?zhǔn)揭?guī)則(也稱為反向傳播(backpropagation))?次性調(diào)整?絡(luò)中的全部參數(shù)。
1.5 深度學(xué)習(xí)之路(51)
一些幫助研究?員在過去?年中取得巨?進(jìn)步的想法:(52)
? 新的容量控制?法,如dropout [Srivastava et al., 2014],有助于減輕過擬合的危險。這是通過在整個神經(jīng)?絡(luò)中應(yīng)?噪聲注? [Bishop, 1995] 來實現(xiàn)的,出于訓(xùn)練?的,?隨機(jī)變量來代替權(quán)重。
? 注意?機(jī)制解決了困擾統(tǒng)計學(xué)?個多世紀(jì)的問題:如何在不增加可學(xué)習(xí)參數(shù)的情況下增加系統(tǒng)的記憶和復(fù)雜性。研究?員通過使?只能被視為可學(xué)習(xí)的指針結(jié)構(gòu) [Bahdanau et al., 2014] 找到了?個優(yōu)雅的解決?案。不需要記住整個?本序列(例如?于固定維度表?中的機(jī)器翻譯),所有需要存儲的都是指向
翻譯過程的中間狀態(tài)的指針。這??提?了?序列的準(zhǔn)確性,因為模型在開始?成新序列之前不再需要記住整個序列。
? 多階段設(shè)計。例如,存儲器?絡(luò)[Sukhbaatar et al., 2015] 和神經(jīng)編程器-解釋器 [Reed & DeFreitas, 2015]。它們允許統(tǒng)計建模者描述?于推理的迭代?法。這些?具允許重復(fù)修改深度神經(jīng)?絡(luò)的內(nèi)部狀態(tài),從而執(zhí)?推理鏈中的后續(xù)步驟,類似于處理器如何修改?于計算的存儲器。
? 另?個關(guān)鍵的發(fā)展是?成對抗?絡(luò) [Goodfellow et al., 2014] 的發(fā)明。傳統(tǒng)模型中,密度估計和?成模型的統(tǒng)計?法側(cè)重于找到合適的概率分布和(通常是近似的)抽樣算法。因此,這些算法在很?程度上受到統(tǒng)計模型固有靈活性的限制。?成式對抗性?絡(luò)的關(guān)鍵創(chuàng)新是?具有可微參數(shù)的任意算法代替采樣器。然后對這些數(shù)據(jù)進(jìn)?調(diào)整,使得鑒別器(實際上是對兩個樣本的測試)不能區(qū)分假數(shù)據(jù)和真實數(shù)據(jù)。通過使?任意算法?成數(shù)據(jù)的能?,它為各種技術(shù)打開了密度估計的??。馳騁的斑? [Zhu et al., 2017]和假名?臉 [Karras et al., 2017] 的例?都證明了這?進(jìn)展。即使是業(yè)余的涂鴉者也可以根據(jù)描述場景
布局的草圖?成照?級真實圖像([Park et al., 2019] )。
? 在許多情況下,單個GPU不?以處理可?于訓(xùn)練的?量數(shù)據(jù)。在過去的?年中,構(gòu)建并行和分布式訓(xùn)練算法的能?有了顯著提?。設(shè)計可伸縮算法的關(guān)鍵挑戰(zhàn)之?是深度學(xué)習(xí)優(yōu)化的主?——隨機(jī)梯度下降,它依賴于相對較小的小批量數(shù)據(jù)來處理。同時,小批量限制了GPU的效率。因此,在1024個GPU上進(jìn)?訓(xùn)練,例如每批32個圖像的小批量?小相當(dāng)于總計約32000個圖像的小批量。最近的?作,?先是由[Li, 2017] 完成的,隨后是 [You et al., 2017] 和 [Jia et al., 2018] ,將觀察?小提?到64000個,將ResNet50模型在Imagenet數(shù)據(jù)集上的訓(xùn)練時間減少到不到7分鐘。作為?較——最初的訓(xùn)練時間是按天為單位
的。
? 并?計算的能?也對強(qiáng)化學(xué)習(xí)的進(jìn)步做出了相當(dāng)關(guān)鍵的貢獻(xiàn)。這導(dǎo)致了計算機(jī)在圍棋、雅達(dá)?游戲、星際爭霸和物理模擬(例如,使?MuJoCo)中實現(xiàn)超?性能的重?進(jìn)步。有關(guān)如何在AlphaGo中實現(xiàn)這?點(diǎn)的說明,請參?如 [Silver et al., 2016] 。簡而?之,如果有?量的(狀態(tài)、動作、獎勵)三元組可?,即只要有可能嘗試很多東西來了解它們之間的關(guān)系,強(qiáng)化學(xué)習(xí)就會發(fā)揮最好的作?。仿真提供了這樣?條途徑。
? 深度學(xué)習(xí)框架在傳播思想??發(fā)揮了?關(guān)重要的作?。允許輕松建模的第?代框架包括Caffe25、Torch26和Theano27。許多開創(chuàng)性的論?都是?這些?具寫的。到?前為?,它們已經(jīng)被TensorFlow28(通常通過其?級API Keras29使?)、CNTK30、Caffe 231和Apache MXNet32所取代。第三代?具,即?
于深度學(xué)習(xí)的命令式?具,可以說是由Chainer33率先推出的,它使?類似于Python NumPy的語法來描述模型。這個想法被PyTorch34、MXNet的Gluon API35和Jax36都采納了。
1.6 成功案例(53)
? 智能助理
? 數(shù)字助理
? 物體識別
? 游戲 狀態(tài)空間(54)
? ?動駕駛
人?智能奇點(diǎn)(54)
1.7 特點(diǎn)(55)
表?學(xué)習(xí)的?的是尋找表?本?,因此深度學(xué)習(xí)可以稱為“多級表?學(xué)習(xí)”。(55)
深度學(xué)習(xí)?法中最顯著的共同點(diǎn)是使?端到端訓(xùn)練。也就是說,與其基于單獨(dú)調(diào)整的組件組裝系統(tǒng),不如構(gòu)建系統(tǒng),然后聯(lián)合調(diào)整它們的性能。
端到端
深度學(xué)習(xí)的?個關(guān)鍵優(yōu)勢是它不僅取代了傳統(tǒng)學(xué)習(xí)管道末端的淺層模型,而且還取代了勞動密集型的特征?程過程。此外,通過取代?部分特定領(lǐng)域的預(yù)處理,深度學(xué)習(xí)消除了以前分隔計算機(jī)視覺、語?識別、?然語?處理、醫(yī)學(xué)信息學(xué)和其他應(yīng)?領(lǐng)域的許多界限,為解決各種問題提供了?套統(tǒng)?的?具。(55)
以犧牲可解釋性為代價(55)
接受次優(yōu)解(55)
1.8 小結(jié)(56)
? 機(jī)器學(xué)習(xí)研究計算機(jī)系統(tǒng)如何利?經(jīng)驗(通常是數(shù)據(jù))來提?特定任務(wù)的性能。它結(jié)合了統(tǒng)計學(xué)、數(shù)據(jù)挖掘和優(yōu)化的思想。通常,它被?作實現(xiàn)??智能解決?案的?種?段。
? 表?學(xué)習(xí)作為機(jī)器學(xué)習(xí)的?類,其研究的重點(diǎn)是如何?動找到合適的數(shù)據(jù)表??式。深度學(xué)習(xí)是通過學(xué)習(xí)多層次的轉(zhuǎn)換來進(jìn)?的多層次的表?學(xué)習(xí)。
? 深度學(xué)習(xí)不僅取代了傳統(tǒng)機(jī)器學(xué)習(xí)的淺層模型,而且取代了勞動密集型的特征?程。
? 最近在深度學(xué)習(xí)??取得的許多進(jìn)展,?都是由廉價傳感器和互聯(lián)?規(guī)模應(yīng)?所產(chǎn)?的?量數(shù)據(jù),以及(通過GPU)算?的突破來觸發(fā)的。
? 整個系統(tǒng)優(yōu)化是獲得?性能的關(guān)鍵環(huán)節(jié)。有效的深度學(xué)習(xí)框架的開源使得這?點(diǎn)的設(shè)計和實現(xiàn)變得?常容易。
1.9 練習(xí)(56)
2、預(yù)備知識(57)
2.1 數(shù)據(jù)操作(58)
張量(tensor):紹n維數(shù)組(58)
與普通numpy ndarray相比,張量類很好地?持GPU加速計算,支持自動微分
2.1.1 入門(58)
具有?個軸的張量對應(yīng)數(shù)學(xué)上的向量(vector)
具有兩個軸的張量對應(yīng)數(shù)學(xué)上的 矩陣(matrix)
具有兩個軸以上的張量沒有特殊的數(shù)學(xué)名稱
張量中的每個值都稱為張量的元素(element)
行向量arange,形狀shape,元素個數(shù)numel,修改形狀reshape
# -*- coding: utf-8 -*- """ @File : begin.py @Time : 2021/8/5 14:59 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import torch# 行向量 x = torch.arange(12) print(x) # tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])# 形狀 print(x.shape) # torch.Size([12])# 元素個數(shù)(number of element) print(x.numel()) # 12# 修改形狀(-1 自動推導(dǎo)) # X = x.reshape(3, 4) # X = x.reshape(-1, 4) X = x.reshape(3, -1) print(X) # tensor([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11]])全0張量zeros和全1張量ones:
# -*- coding: utf-8 -*- """ @File : begin.py @Time : 2021/8/5 14:59 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import torch# 全0張量 x = torch.zeros((2, 3, 4)) print(x) # tensor([[[0., 0., 0., 0.], # [0., 0., 0., 0.], # [0., 0., 0., 0.]], # # [[0., 0., 0., 0.], # [0., 0., 0., 0.], # [0., 0., 0., 0.]]])# 全1張量 x = torch.ones((2, 3, 4)) print(x) # tensor([[[1., 1., 1., 1.], # [1., 1., 1., 1.], # [1., 1., 1., 1.]], # # [[1., 1., 1., 1.], # [1., 1., 1., 1.], # [1., 1., 1., 1.]]])randn 初始化網(wǎng)絡(luò)參數(shù)值,均值為0、標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)?斯(正態(tài))分布中隨機(jī)采樣
import torch# 初始化網(wǎng)絡(luò)參數(shù)值,均值為0、標(biāo)準(zhǔn)差為1的標(biāo)準(zhǔn)?斯(正態(tài))分布中隨機(jī)采樣 x = torch.randn(3, 4) print(x) # tensor([[-0.8740, -1.5099, -0.2514, 0.5912], # [-0.7873, 0.6065, 0.6698, -0.2849], # [-1.4781, -0.4106, -0.2990, -0.5989]])tensor 直接分別為張量每個元素指定值
import torch# 直接分別為張量每個元素指定值 x = torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])print(x) # tensor([[2, 1, 4, 3], # [1, 2, 3, 4], # [4, 3, 2, 1]])2.1.2 運(yùn)算(60)
按元素(elementwise)操作:將標(biāo)準(zhǔn)標(biāo)量運(yùn)算符應(yīng)?于數(shù)組的每個元素。對于將兩個數(shù)組作為輸?的函數(shù),按元素運(yùn)算將?元運(yùn)算符應(yīng)?于兩個數(shù)組中的每對位置對應(yīng)的元素。我們可以基于任何從標(biāo)量到標(biāo)量的函數(shù)來創(chuàng)建按元素函數(shù)。(啥意思??)
一維張量和差積商冪
import torchX = torch.tensor([1.0, 2, 4, 8]) Y = torch.tensor([2, 2, 2, 2]) print(X + Y) # tensor([ 3., 4., 6., 10.]) print(X - Y) # tensor([-1., 0., 2., 6.]) print(X * Y) # tensor([ 2., 4., 8., 16.]) print(X / Y) # tensor([0.5000, 1.0000, 2.0000, 4.0000]) print(X ** Y) # tensor([ 1., 4., 16., 64.])一維張量自然指數(shù)e的冪 exp
import torchx = torch.tensor([1.0, 2, 4, 8]) print(torch.exp(x)) # tensor([2.7183e+00, 7.3891e+00, 5.4598e+01, 2.9810e+03])張量 連結(jié) cat(concatenate)
dim為軸,最外層為0,次外層為1,以此類推
import torchX = torch.arange(12, dtype=torch.float32).reshape((3, 4)) Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) print(torch.cat((X, Y), dim=0)) # tensor([[ 0., 1., 2., 3.], # [ 4., 5., 6., 7.], # [ 8., 9., 10., 11.], # [ 2., 1., 4., 3.], # [ 1., 2., 3., 4.], # [ 4., 3., 2., 1.]]) print(torch.cat((X, Y), dim=1)) # tensor([[ 0., 1., 2., 3., 2., 1., 4., 3.], # [ 4., 5., 6., 7., 1., 2., 3., 4.], # [ 8., 9., 10., 11., 4., 3., 2., 1.]])邏輯判斷True、False 逐個對比張量中的元素 ==
import torchX = torch.arange(12, dtype=torch.float32).reshape((3, 4)) Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) print(X == Y) # tensor([[False, True, False, True], # [False, False, False, False], # [False, False, False, False]])對張量中所有元素求和 sum
import torchX = torch.arange(12, dtype=torch.float32).reshape((3, 4)) Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) print(X.sum()) # tensor(66.)2.1.3 廣播機(jī)制(broadcasting mechanism)(自動匹配形狀)(62)
import torcha = torch.arange(3).reshape((3, 1)) b = torch.arange(2).reshape((1, 2)) print(a) # tensor([[0], # [1], # [2]]) print(b) # tensor([[0, 1]])print(a + b) # tensor([[0, 1], # [1, 2], # [2, 3]])由于 a 和 b 分別是 3 × 1 和 1 × 2 矩陣,如果我們讓它們相加,它們的形狀不匹配。我們將兩個矩陣?播為?個更?的 3 × 2 矩陣,如下所?:矩陣 a將復(fù)制列,矩陣 b將復(fù)制?,然后再按元素相加。
2.1.4 索引和切片(63)
- 利用索引和切片獲取張量中指定(范圍)元素的值
-1表示倒數(shù)第一個元素,1:3表示下標(biāo)為1、2的元素
import torchX = torch.arange(12, dtype=torch.float32).reshape((3, 4)) print(X) # tensor([[ 0., 1., 2., 3.], # [ 4., 5., 6., 7.], # [ 8., 9., 10., 11.]]) print(X[-1]) # tensor([ 8., 9., 10., 11.]) print(X[1:3]) # tensor([[ 4., 5., 6., 7.], # [ 8., 9., 10., 11.]])- 利用索引或切片為張量元素賦值
2.1.5 節(jié)省內(nèi)存(張量內(nèi)存使用規(guī)范)(63)
張量計算中使用Y = X + Y,將為Y開辟新的內(nèi)存空間,頻繁開辟內(nèi)存空間將降低運(yùn)行效率;同時如果Y作為神經(jīng)網(wǎng)絡(luò)的參數(shù)時,如果使用多線程,這樣的賦值有可能使調(diào)用對象引用到未更新的參數(shù),導(dǎo)致錯漏
驗證:
import torchX = torch.tensor([1.0, 2, 4, 8]) Y = torch.tensor([2, 2, 2, 2])before = id(Y) Y = Y + X new = id(Y)print(before) # 2112489973184 print(new) # 2112489973248解決辦法:(切?表?法)
感受一下使用切片與不使用切片的區(qū)別
當(dāng)然,如果使用相同參數(shù)的時間跨度比參數(shù)更新的時間跨度短,那么用切片表示法給參數(shù)變量自己更新也是可以的,如:
注意用Y += X的時候,數(shù)據(jù)類型要一致,否則會報錯
import torchX = torch.tensor([1.0, 2, 4, 8]) Y = torch.tensor([2., 2, 2, 2])before = id(Y) Y[:] = Y + X # 或者 # Y += X new = id(Y)print(before) # 2112489973184 print(new) # 21124899732482.1.6 轉(zhuǎn)換為其他 Python 對象(64)
轉(zhuǎn)換為 NumPy 張量很容易,反之也很容易。轉(zhuǎn)換后的結(jié)果不共享內(nèi)存。這個小的不便實際上是?常重要的:
當(dāng)你在 CPU 或 GPU 上執(zhí)?操作的時候,如果 Python 的 NumPy 包也希望使?相同的內(nèi)存塊執(zhí)?其他操作,你不希望停下計算來等它。
作者的意思是說,這個功能是非常有用的!你可以讓cpu或gpu處于一直計算中,
import torchX = torch.tensor([1.0, 2, 4, 8])A = X.numpy() B = torch.tensor(A)print(type(A)) # <class 'numpy.ndarray'> print(type(B)) # <class 'torch.Tensor'>print(id(X)) # 2135794058304 print(id(A)) # 2135793641680 print(id(B)) # 2135794058368要將?小為1的張量轉(zhuǎn)換為 Python 標(biāo)量,我們可以調(diào)? item 函數(shù)或 Python 的內(nèi)置函數(shù)。
item()函數(shù)是得到張量元素的值
import torcha = torch.tensor([3.5]) print(a) # tensor([3.5000]) print(a.item()) # 3.5 print(float(a)) # 3.5 print(int(a)) # 32.1.7 小結(jié)(65)
? 深度學(xué)習(xí)存儲和操作數(shù)據(jù)的主要接口是張量(n維數(shù)組)。它提供了各種功能,包括基本數(shù)學(xué)運(yùn)算、?播、索引、切?、內(nèi)存節(jié)省和轉(zhuǎn)換其他 Python 對象。
2.1.8 練習(xí)(65)
2.2 數(shù)據(jù)預(yù)處理(65)
pandas軟件包:將原始數(shù)據(jù)轉(zhuǎn)換為張量格式
2.2.1 讀取數(shù)據(jù)集(65)
- 創(chuàng)建csv數(shù)據(jù):
- 從創(chuàng)建的csv?件中加載原始數(shù)據(jù)集,我們導(dǎo)?pandas包并調(diào)?read_csv函數(shù)。該數(shù)據(jù)集有四?三列。其中每?描述了房間數(shù)量(“NumRooms”)、巷?類型(“Alley”)和房屋價格(“Price”)。
2.2.2 處理缺失值NaN(插值和刪除)(66)
注意,“NaN”項代表缺失值。為了處理缺失的數(shù)據(jù),典型的?法包括插值和刪除,其中插值?替代值代替缺失值。而刪除則忽略缺失值。在這?,我們將考慮插值。
通過位置索引iloc,我們將data分成inputs和outputs,其中前者為data的前兩列,而后者為data的最后?列。對于inputs中缺少的數(shù)值,我們?同?列的均值替換“NaN”項。
(iloc函數(shù)怎么感覺有點(diǎn)復(fù)雜??看選取元素有點(diǎn)懵)
# -*- coding: utf-8 -*- """ @File : read_data.py @Time : 2021/8/6 11:35 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import pandas as pd data_file = '../data/house_tiny.csv' data = pd.read_csv(data_file) print(data) # NumRooms Alley Price # 0 NaN Pave 127500 # 1 2.0 NaN 106000 # 2 4.0 NaN 178100 # 3 NaN NaN 140000# iloc 高級切片 inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # 將NaN補(bǔ)全 inputs = inputs.fillna(inputs.mean()) print(inputs) # NumRooms Alley # 0 3.0 Pave # 1 2.0 NaN # 2 4.0 NaN # 3 3.0 NaN# 根據(jù)NaN復(fù)制列,dummy_na=True表示把NaN提出作為單獨(dú)一列 inputs = pd.get_dummies(inputs, dummy_na=True) print(inputs) # NumRooms Alley_Pave Alley_nan # 0 3.0 1 0 # 1 2.0 0 1 # 2 4.0 0 1 # 3 3.0 0 12.2.3 轉(zhuǎn)換為張量格式(67)iloc、fillna、get_dummies
Pandas csv文件中的條目可以轉(zhuǎn)換為張量格式
# -*- coding: utf-8 -*- """ @File : read_data.py @Time : 2021/8/6 11:35 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import pandas as pd import torchdata_file = '../data/house_tiny.csv' data = pd.read_csv(data_file) print(data) # NumRooms Alley Price # 0 NaN Pave 127500 # 1 2.0 NaN 106000 # 2 4.0 NaN 178100 # 3 NaN NaN 140000# iloc 高級切片 inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] # 將NaN補(bǔ)全 inputs = inputs.fillna(inputs.mean()) print(inputs) # NumRooms Alley # 0 3.0 Pave # 1 2.0 NaN # 2 4.0 NaN # 3 3.0 NaN# 根據(jù)NaN復(fù)制列,dummy_na=True表示把NaN提出作為單獨(dú)一列 inputs = pd.get_dummies(inputs, dummy_na=True) print(inputs) # NumRooms Alley_Pave Alley_nan # 0 3.0 1 0 # 1 2.0 0 1 # 2 4.0 0 1 # 3 3.0 0 1X, y = torch.tensor(inputs.values), torch.tensor(outputs.values) print(X) # tensor([[3., 1., 0.], # [2., 0., 1.], # [4., 0., 1.], # [3., 0., 1.]], dtype=torch.float64) print(y) # tensor([127500, 106000, 178100, 140000])2.2.4 小結(jié)(67)
? 像龐?的Python?態(tài)系統(tǒng)中的許多其他擴(kuò)展包?樣,pandas可以與張量兼容。
? 插值和刪除可?于處理缺失的數(shù)據(jù)。
2.2.5 練習(xí)(68)
總結(jié)
以上是生活随笔為你收集整理的(d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10无法显示的AppData文件夹
- 下一篇: wandb(wb)(weights an