张量通俗的说,张量概念是矢量概念和矩阵概念的推广,标量是零阶张量,矢量是一阶张量,矩阵(方阵)是二阶张量,而三阶张量则好比立体矩阵,更高阶的张量用图形无法表达。
算子简单来说就是进行某种“操作”,“动作”。算法中的一个函数、几行可以重复使用的代码、一个数学中的平方操作,这些都可以认为是算子。
创建一个张量可以有多种方式,如:指定数据创建,指定形状创建,指定区间创建等。
import torch
# 创建一维Tensor
x = torch.tensor([2.0, 3.0, 4.0])
#创建二维Tensor
x = torch.tensor([[1.0,2.0,3.0],
[4.0,5.0,6.0]])
print(x)
#创建多维张量
x = torch.tensor([[[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]],
[[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]]])
print(x)
注意:张量在任何一个维度上的元素数量必须相等。下面尝试定义一个在同一维度上元素数量不等的张量。
例如
x = torch.tensor([[1.0,2.0]
[4.0,5.0,6.0]])
print(x)
m, n = 2, 3
# 创建数据全为0,形状为[m, n]的Tensor
zeros_Tensor = torch.zeros([m, n])
# 创建数据全为1,形状为[m, n]的Tensor
ones_Tensor = torch.ones([m, n])
# 创建数据全为指定值,形状为[m, n]的Tensor,这里我们指定数据为10
full_Tensor = torch.full([m, n], 10)
print('zeros Tensor: ', zeros_Tensor)
print('ones Tensor: ', ones_Tensor)
print('full Tensor: ', full_Tensor)
# 创建以步长step均匀分隔数值区间[start, end)的一维Tensor
arange_Tensor = torch.arange(start=1, end=5, step=1)
# 创建steps段数的均匀分隔数值区间[start, stop]的Tensor
linspace_Tensor = torch.linspace(start=1, end=5, steps=5)
print('arange Tensor: ', arange_Tensor)
print('linspace Tensor: ', linspace_Tensor)
张量具有以下形状属性:
Tensor.ndim
:张量的维度,例如向量的维度为1,矩阵的维度为2。Tensor.shape
: 张量每个维度上元素的数量。Tensor.shape[n]
:张量第n维的大小。Tensor.numel
:张量中全部元素的个数。创建一个四维张量,并打印出shape
、ndim
、shape[n]
、numel属性。
ndim_4_Tensor = torch.ones([2, 3, 4, 5])
print("Number of dimensions:", ndim_4_Tensor.ndim)
print("Shape of Tensor:", ndim_4_Tensor.shape)
print("Elements number along axis 0 of Tensor:", ndim_4_Tensor.shape[0])
print("Elements number along the last axis of Tensor:", ndim_4_Tensor.shape[-1])
print('Number of elements in Tensor: ', ndim_4_Tensor.numel())
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape
函数。
例如:
# 创建一个从0-11的一维张量
x = torch.arange(12)
print(x)
# 改变x的形状为三行四列
X = x.reshape(3, 4)
print(X)
注意,通过改变张量的形状,张量的大小不会改变。
使用type函数即可
x = torch.arange(12)
print(x.type())
初始化张量时可以通过place来指定其分配的设备位置,可支持的设备位置有三种:CPU、GPU和固定内存。device可以查询具体的设备。
x = torch.arange(12)
print(x.device)
x = torch.arange(12)
y = np.array(x)
Y = torch.Tensor(y)
print(Y)
a = torch.Tensor([[6,7,8],
[5,4,3],
[2,1,0]])
a = torch.Tensor([[1,1,4],[5,1,4],[191,98,10]])
b = a.numpy()
print(b)
print(a[1])
print(a[1,2])
print(a[[1,2],[0,1]])
执行结果:
a = torch.Tensor([[6,7,8],
[5,4,3],
[2,1,0]])
a[0] = -1
a[1] = torch.Tensor([-5,-1,-4])
a[2] = a[2] * (-1)
print(a)
执行结果:
a = torch.Tensor([[6,7,8],
[5,4,3],
[2,1,0]])
print(a)
a = a * -1
print(a)
a = a - 1
print(a)
a += 1
print(a)
a /= 6
print(a)
a = torch.Tensor([1,0,1,1,0]).bool()
b = torch.Tensor([0,0,1,0,3]).bool()
print(a)
print(b)
print(a & b) # 与运算
print(a | b) # 或运算
print(~a) # 取反
print(a ^ b) # 异或运算
矩阵转置
a = ([[6,5,4],
[3,2,1],
[9,8,7]])
b = torch.tensor(a)
print(b.t()) # 矩阵转置
矩阵乘法
a = ([[6,5,4],
[3,2,1],
[9,8,7]])
c = ([[3,4,5],
[5,6,7],
[2,3,4]])
b = torch.tensor(a)
d = torch.tensor(c)
print(torch.mm(b,d))
处理两个张量维度不同或不匹配时的计算问题时就产生了广播。
a = ([6,5,4])
c = ([[3,4,5],
[5,6,7],
[2,3,4]])
b = torch.tensor(a)
d = torch.tensor(c)
print(b.shape)
print(d.shape)
print(b+d)
pandas可以读取很多数据集
读取数据集 house_tiny.csv、boston_house_prices.csv、Iris.csv
这里读取的房子、波士顿房价、鸢尾花数据集均为csv格式
import pandas as pd
df_house_tiny = pd.read_csv('./house_tiny.csv')
df_boston_house_prices = pd.read_csv('./boston_house_prices.csv')
df_iris = pd.read_csv('./Iris.csv')
pandas对缺失值有两种处理方式:丢弃(dropna)和填充(fillna)。
例如
df_house_tiny = pd.read_csv('./house_tiny.csv')
df_boston_house_prices = pd.read_csv('./boston_house_prices.csv')
df_iris = pd.read_csv('./Iris.csv')
df_house_tiny = df_house_tiny.fillna(
df_house_tiny.iloc[:,0:2].mean())
print(df_house_tiny)
df_house_tiny = pd.get_dummies(df_house_tiny,dummy_na=True).iloc[:,[0,2,3,1]]
print(df_house_tiny)
ret = torch.Tensor(df_house_tiny.values)
经过第二周对pytorch的学习,我学会了pytorch中张量的各种基本用法,也了解pandas和pytorch的一些代码转换。现在的了解依旧非常浅显,pytorch之中还有很多值得我们去探索。