实验二 pytorch入门

一. 概念:张量、算子

  • 张量(Tensor):深度学习中表示和存储数据的主要形式。在动手实践机器学习之前,需要熟悉张量的概念、性质和运算规则,以及了解飞桨中张量的各种API。
  • 算子(Operator):构建神经网络模型的基础组件。每个算子有前向和反向计算过程,前向计算对应一个数学函数,而反向计算对应这个数学函数的梯度计算。有了算子,我们就可以很方便地通过算子来搭建复杂的神经网络模型,而不需要手工计算梯度。

       张量通俗的说,张量概念是矢量概念和矩阵概念的推广,标量是零阶张量,矢量是一阶张量,矩阵(方阵)是二阶张量,而三阶张量则好比立体矩阵,更高阶的张量用图形无法表达。

       算子简单来说就是进行某种“操作”,“动作”。算法中的一个函数、几行可以重复使用的代码、一个数学中的平方操作,这些都可以认为是算子。

二. 使用pytorch实现张量运算

1.创建张量

创建一个张量可以有多种方式,如:指定数据创建,指定形状创建,指定区间创建等。

1.1指定数据创建张量

1.1.1创建一个一维张量

import torch
# 创建一维Tensor
x = torch.tensor([2.0, 3.0, 4.0])

执行结果:

 1.1.2创建一个二维张量

#创建二维Tensor
x = torch.tensor([[1.0,2.0,3.0],
                 [4.0,5.0,6.0]])
print(x)

执行结果:

1.1.3创建多维张量

#创建多维张量
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)

执行结果:

1.2指定形状创建

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)

执行结果: 

1.3指定区间创建

 

# 创建以步长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)

执行结果:

2.张量的属性

2.1张量的形状

张量具有以下形状属性:

  • Tensor.ndim:张量的维度,例如向量的维度为1,矩阵的维度为2。
  • Tensor.shape: 张量每个维度上元素的数量。
  • Tensor.shape[n]:张量第n维的大小。
  • Tensor.numel:张量中全部元素的个数。

创建一个四维张量,并打印出shapendimshape[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())

执行结果

2.2形状的改变

 要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数。

例如:

# 创建一个从0-11的一维张量
x = torch.arange(12)
print(x)
# 改变x的形状为三行四列
X = x.reshape(3, 4)
print(X)

执行结果:

 注意,通过改变张量的形状,张量的大小不会改变。

2.3张量的数据类型

使用type函数即可

x = torch.arange(12)
print(x.type())

执行结果:

 2.4张量的设备位置

初始化张量时可以通过place来指定其分配的设备位置,可支持的设备位置有三种:CPU、GPU和固定内存。device可以查询具体的设备。

x = torch.arange(12)
print(x.device)

执行结果:

3.张量与Numpy数组转换

x = torch.arange(12)
y = np.array(x)
Y = torch.Tensor(y)
print(Y)

执行结果:

 4.张量的访问

 4.1索引和切片

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)

执行过程:

 4.2访问张量

print(a[1])
print(a[1,2])
print(a[[1,2],[0,1]])

执行结果:

4.3修改张量 

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)

执行结果:

5.张量的运算

5.1数学运算

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)

 执行结果:

5.2逻辑运算

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) # 异或运算

执行结果:

5.3矩阵运算

矩阵转置

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))

 执行结果:

 6.广播机制

处理两个张量维度不同或不匹配时的计算问题时就产生了广播。

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)

执行结果:

7.数据预处理 

7.1读取数据集

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')

7.2处理缺失值

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)

执行结果:

 7.3转换为张量格式

ret = torch.Tensor(df_house_tiny.values)

执行结果:

 8.总结

经过第二周对pytorch的学习,我学会了pytorch中张量的各种基本用法,也了解pandas和pytorch的一些代码转换。现在的了解依旧非常浅显,pytorch之中还有很多值得我们去探索。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值