動手學深度學習 | 資料操作+資料預處理 | 02
阿新 • • 發佈:2021-09-17
目錄
資料操作
圖片是三維的: w*h*channel
圖片集是四維的:batch_size*w*h*channel
一個視訊批量是五維的:batch_size*t*w*h*channel
這裡解釋最後一個,行::3
表示從第一個開始,每次步長為3,::2
表示從第一個開始,每次步長為2
資料操作實現
操作總結
import torch # 匯入torch x = torch.arange(12) # 建立一個一維張量 x.shape # 檢視tensor的shape的元素個數 X = x.reshape(3,4) # 改變一個tensor的形狀 torch.zeros((2,3,4)) torch.ones((2,3,4)) torch.randn(3,4) # 建立特定的tensor torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]]) # 將Python的list轉換為tensor x = torch.tensor([1.0, 2, 4, 8]) y = torch.tensor([2, 2, 2, 2]) x + y, x - y, x * y, x / y, x ** y # tensor的基本運算 torch.exp(x) # e^x X = 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]]) torch.cat((X,Y),dim=0) # 行合併 豎直堆疊 torch.cat((X,y),dim=1) # 列合併 水平拼接 X==Y # 給一個bool tensor,判斷其中的元素是否相等 X.sum() # 將所有元素相加, 最後只產生一個元素的tensor # 廣播機制 # 沒有維度或維度為1才能進行廣播機制(就是按照原來的元素按照維度進行復制) a = torch.arange(3).reshape((3, 1)) b = torch.arange(2).reshape((1, 2)) a + b # 兩張量的shape不一致,符合條件會進行廣播機制 X[-1], X[1:3] # 元素的選擇 X[1, 2] = 9 # 給指定元素賦值 X[0:2, :] = 12 # 切片賦值 # 什麼操作會導致新的變數產生 Y = Y + X # Y會變成新的變數 Z = torch.zeros_like(Y) Z[:] = Y+X # 修改操作,Z不會是一個新的變數 X += Y # +=這樣的操作也不會有新的變數產生 A = X.numpy() # tensor轉換為tensor a = torch.tensor([3.5]) a,a.item(),float(a),int(a) # 將tensor轉換為標量
資料預處理實現
操作總結
# 自己建立一個人工資料集 import os 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') f.write('2,NA,106000\n') f.write('4,NA,178100\n') f.write('NA,NA,140000\n') import pandas as pd data = pd.read_csv(data_file) # 讀取csv檔案,成df物件 # 將資料分為inputs、outputs inputs,outputs = data.iloc[:,:2],data[:,2] inputs = input.fillna(inputs.mean()) # 使用插值的方法補缺失值 # 將字串的缺失值(缺失值也是一種類別),使用one-hot編碼處理 # 要給字串類別編碼就是使用 one-hot 阿! inputs = pd.get_dummies(inputs,dummy_nan=True) # 現在inputs,outputs都是數值了,可以直接轉換為tensor import torch X,y = torch.tensor(inputs.values),torch.tensor(outputs.values)
QA
- reshape是不會產生新的物件的,還是和原來同一個記憶體地址
- tensor和array有什麼區別?
tensor是有明確的數學定義的,array是計算機的術語。
但是在這裡我們不做過多區分,可以簡單理解為tensor就是 n-dim array。
- 如果新變數生成,舊變數是否會自動釋放?
如果舊變數沒有使用的話,Python會幫忙釋放記憶體。
所以關於記憶體管理,在Python這裡是不用過分擔心的。