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