日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

(d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ

發(fā)布時間:2025/3/20 pytorch 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

開源項目地址: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)

  • 從一個隨機(jī)初始化參數(shù)的模型開始,這個模型基本毫不”智能“。
  • 獲取?些數(shù)據(jù)樣本(例如,音頻片段以及對應(yīng)的{是,否}標(biāo)簽)。
  • 調(diào)整參數(shù),使模型在這些樣本中表現(xiàn)得更好。
  • 重復(fù)第2步和第3步,直到模型在任務(wù)中的表現(xiàn)令你滿意。
  • 1.2 關(guān)鍵組件(37)

  • 我們可以學(xué)習(xí)的數(shù)據(jù)(data)。
  • 如何轉(zhuǎn)換數(shù)據(jù)的模型(model)。
  • 一個目標(biāo)函數(shù)(objective function),用來量化模型的有效性。
  • 調(diào)整模型參數(shù)以優(yōu)化目標(biāo)函數(shù)的算法。
  • 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.]])
    • 利用索引或切片為張量元素賦值
    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.]]) X[1, 2] = 9 print(X) # tensor([[ 0., 1., 2., 3.], # [ 4., 5., 9., 7.], # [ 8., 9., 10., 11.]]) X[0:2, :] = 12 print(X) # tensor([[12., 12., 12., 12.], # [12., 12., 12., 12.], # [ 8., 9., 10., 11.]]) X[0:2, :] = torch.tensor([[11, 11, 11, 11], [11, 12, 13, 14]]) print(X) # tensor([[11., 11., 11., 11.], # [11., 12., 13., 14.], # [ 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ū)別

    import torchX = torch.tensor([1.0, 2, 4, 8]) Y = torch.tensor([2, 2, 2, 2])Z = torch.zeros_like(Y) print('id(Z):', id(Z)) # id(Z): 2362931341056 Z[:] = X + Y print('id(Z):', id(Z)) # id(Z): 2362931341056Z = X + Y print('id(Z):', id(Z)) # id(Z): 2561881336640

    當(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) # 2112489973248

    2.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)) # 3

    2.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ù):
    # -*- coding: utf-8 -*- """ # -*- coding: utf-8 -*- """ @File : create_data.py @Time : 2021/8/6 11:10 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import os# 新建目錄,exist_ok為True表示即使目錄存在也不拋出FileExistsError異常 os.makedirs(os.path.join('..', 'data'), exist_ok=True) data_file = os.path.join('..', 'data', 'house_tiny.csv') with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA,Pave,127500\n') # 每?表??個數(shù)據(jù)樣本f.write('2,NA,106000\n')f.write('4,NA,178100\n')f.write('NA,NA,140000\n')

    • 從創(chuàng)建的csv?件中加載原始數(shù)據(jù)集,我們導(dǎo)?pandas包并調(diào)?read_csv函數(shù)。該數(shù)據(jù)集有四?三列。其中每?描述了房間數(shù)量(“NumRooms”)、巷?類型(“Alley”)和房屋價格(“Price”)。
    # -*- 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

    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 1

    2.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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。