一、創建張量
1.張量基本創建方式
- torch.tensor 根據指定數據創建張量? (最重要)
- torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量
- torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量
1.1 torch.tensor
# 方式一:創建張量 torch.tensor
def create_tensor():# 1.創建標量張量data1 = torch.tensor(3)# print(data1.ndim) # 維度:0# print(data1)# print(data1.shape)# print(data1.dtype)# 2.創建一維向量張量data2 = torch.tensor([2, 3, 4]) # 幾個數字shape就是幾 torch.Size([3]) torch.int64# print(data2,data2.shape,data2.dtype)# print(data2.ndim) # 維度:1# 3.創建二維向量張量data3 = torch.tensor([[2, 3, 4], [6, 7, 8]]) # 2個樣本,每個樣本三個特征 torch.Size([2, 3]) torch.int64# print(data3,data3.shape,data3.dtype)# print(data3.ndim) # 維度:2
if __name__ == '__main__':create_tensor()
1.2 torch.Tensor
# 方式二:創建張量 torch.Tensor
def create_Tensor():# ctrl+p:參數提示# 根據形狀# data=torch.Tensor(2,3)# data=torch.tensor(2,3) #報錯# data=torch.Tensor(3)# 根據數值data = torch.Tensor([3, 4])# print(data)
if __name__ == '__main__':create_Tensor()
1.3 torch.IntTensor、torch.FloatTensor、torch.DoubleTensor
# 方式三:創建張量 torch.IntTensor
def create_IntTensor():# 根據形狀創建# data=torch.IntTensor(3,4)# 根據數值創建data = torch.IntTensor([3, 4])# 嘗試小數# data=torch.IntTensor([3.2,4.3]) #會省略小數點后# data=torch.FloatTensor([3.2,4.3]) #tensor([3.2000, 4.3000]) torch.float32# data=torch.DoubleTensor([3.2,4.3]) #tensor([3.2000, 4.3000], dtype=torch.float64) torch.float64print(data, data.dtype)
if __name__ == '__main__':create_IntTensor()
2.創建線性和隨機張量
- torch.arange 和 torch.linspace 創建線性張量
- torch.random.init_seed 和 torch.random.manual_seed 隨機種子設置
- torch.randn 創建隨機張量
2.1?torch.arange 和 torch.linspace
arange(start,end,step) start默認0,step默認1,表示步長,包左不包右 包含0不包含10
linspace(start,end,steps) 包左且包右,steps取多少個值
# 創建線性張量
def create_arange_linspace_tensor():arange_data=torch.arange(0,10,1)print(arange_data,arange_data.dtype) #tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) torch.int64lin_data=torch.linspace(0,10,5)print(lin_data,lin_data.dtype) #tensor([ 0.0000, 2.5000, 5.0000, 7.5000, 10.0000]) torch.float32
if __name__ == '__main__':create_arange_linspace_tensor()
2.2 torch.random.init_seed 和 torch.random.manual_seed
- torch.initial_seed()
- torch.random.initial_seed() # 與上一行一樣寫法
- ?torch.manual_seed(100)
- ?torch.random.manual_seed(100) ?# 與上一行一樣寫法
# 創建隨機張量
def create_random_tensor():# 創建兩行三列的隨機種子data=torch.randn(2,3)# 查看隨機數種子# print('隨機數種子:', torch.initial_seed()) #值一直在變# print('隨機數種子:', torch.random.initial_seed()) # 與上一行一樣寫法# 手動隨機數種子設置torch.manual_seed(100)# torch.random.manual_seed(100) # 與上一行一樣寫法data = torch.randn(2, 3)print(data,data.dtype)
if __name__ == '__main__':create_random_tensor()
3.創建0-1張量
- torch.ones 和 torch.ones_like 創建全1張量
- torch.zeros 和 torch.zeros_like 創建全0張量 (重要)
- torch.full 和 torch.full_like 創建全為指定值張量
這里的like是模仿數據的形狀進行創建,而不是模仿值
def create_ones_zeros_full_tensor():# 1.1 創建指定形狀全1張量# data = torch.ones(2, 3)# print(data,data.shape,data.size()) # torch.Size([2, 3]) torch.Size([2, 3]),pytorch中shape屬性和size()方法是一樣的# 1.2 根據張量形狀創建全1張量# data = torch.ones_like(data)# print(data)# 2.1 創建指定形狀全0張量# data=torch.zeros(2,3)# print(data,data.dtype)# 2.2 根據張量形狀創建全0張量# data=torch.zeros_like(data)# print(data,data.dtype)# 3.1 創建指定形狀指定值的張量data = torch.full([2, 3], 10)print(data) #tensor([[10, 10, 10],[10, 10, 10]])# 3.2 根據張量形狀創建指定值的張量data = torch.full_like(data, 20)print(data) #tensor([[20, 20, 20],[20, 20, 20]])if __name__ == '__main__':create_ones_zeros_full_tensor()
二、張量的類型轉換
1. 張量之間的類型轉換
- data.type(torch.DoubleTensor)
- data.double() (重點)
# 張量元素類型轉換
def type_transform_tensor():data=torch.full([2, 3], 10)print(data,data.dtype) # torch.int64# 方式一# data1=data.type(torch.DoubleTensor)# print(data1,data1.dtype) # torch.float64# 方式二data2=data.double()print(data2,data2.dtype) #torch.float64
if __name__ == '__main__':type_transform_tensor()
2. 張量與numpy之間的類型轉換
tensor轉numpy
- ?方式一:通過numpy()轉換為numpy,影響data_tensor的值,但可以通過data_numpy=data_tensor.numpy().copy(),深拷貝解決
- ?方式二:通過np.array()轉換為numpy,不影響data_tensor的值,默認不共享內存?
import numpy as np
import torchdef tensor_to_numpy():# 1.tensor轉numpydata_tensor=torch.tensor([1,2,3,4,5])print(data_tensor) # tensor([1, 2, 3, 4, 5])# 方式一:通過numpy()轉換為numpy,影響data_tensor的值,但可以通過data_numpy=data_tensor.numpy().copy(),深拷貝解決data_numpy=data_tensor.numpy()print(data_numpy) # [1 2 3 4 5]# 修改numpy的值data_numpy[0]=200print(data_numpy) #[200 2 3 4 5]print(data_tensor) #tensor([200, 2, 3, 4, 5])# 方式二:通過np.array()轉換為numpy,不影響data_tensor的值# data_numpy = np.array(data_tensor)# print("data_numpy-->", data_numpy) # [1 2 3 4 5]# data_numpy[0] = 200# print("data_numpy-->", data_numpy) # [200 2 3 4 5]# print('data_tensor-->', data_tensor) # tensor([1, 2, 3, 4, 5])
numpy轉tensor
- 方式一:torch.from_numpy 默認共享內存,使用 copy 函數避免共享,解決 data_tensor = torch.from_numpy(data_numpy.copy())
- ?方式2:torch.tensor 默認不共享內存?
def numpy_to_tensor():# 2.numpy轉tensor# 準備一個numpy數據data_numpy=np.array([2,3,4])# print(data_numpy,data_numpy.dtype) # [2 3 4] int64# 方式一:torch.from_numpy 默認共享內存,使用 copy 函數避免共享,解決 data_tensor = torch.from_numpy(data_numpy.copy())# data_tensor = torch.from_numpy(data_numpy)# # print(data_tensor,data_tensor.dtype) # tensor([2, 3, 4]) torch.int64# # 修改tensor的值,發現會影響numpy# data_tensor[0]=200# print(data_tensor,data_tensor.dtype) # tensor([200, 3, 4]) torch.int64# print(data_numpy,data_numpy.dtype) # [200 3 4] int64# 方式2:torch.tensor 默認不共享內存 data_tensor=torch.tensor(data_numpy)data_tensor[0]=200print(data_tensor) # tensor([200, 3, 4])print(data_numpy) # [2 3 4]
if __name__ == '__main__':numpy_to_tensor()
3.標量張量和數字轉換(重要)
data_tensor.item()
def scalar_tensor_to_number():# 標量轉number# data_tensor=torch.tensor(3)# 一維向量轉numberdata_tensor = torch.tensor([3]) # 一個數字 (1,)# 二維矩陣轉number# data_tensor = torch.tensor([[3]]) # 一行一列(1,1)print(data_tensor) # tensor(3) tensor([3]) tensor([[3]])data1=data_tensor.item()print(data1) # 3
if __name__ == '__main__':scalar_tensor_to_number()