1. 程式人生 > 其它 >動手學深度學習 | 資料操作+資料預處理 | 02

動手學深度學習 | 資料操作+資料預處理 | 02

目錄

資料操作

圖片是三維的: 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

  1. reshape是不會產生新的物件的,還是和原來同一個記憶體地址
  1. tensor和array有什麼區別?

tensor是有明確的數學定義的,array是計算機的術語。

但是在這裡我們不做過多區分,可以簡單理解為tensor就是 n-dim array。

  1. 如果新變數生成,舊變數是否會自動釋放?

如果舊變數沒有使用的話,Python會幫忙釋放記憶體。

所以關於記憶體管理,在Python這裡是不用過分擔心的。