Tensor基础

1. Tensor

  • Tensor又叫做张量,实际上标量、向量和矩阵都是张量。只是标量是0维张量,向量是一维张量,矩阵是二维张量,除此以外,张量还可以向更高维度扩展,四维五维等等。

张量的创建方法

首先需要导入torch的包,使用**torch.Tensor( )**函数创建,传入的参数(2,4)是构造一个2*4的矩阵

import torch
x = torch.Tensor(2,4)

使用**torch.DoubleTensor( )**函数创建一个234的64位浮点数

y = torch.DoubleTensor(2,3,4)

一些快速创建Tensor的方法

torch.zero_(2,4)  # 创建元素全为0的Tensor
torch.eye(3)  # 创建对角线元素全为1,其余元素为0的3*3的Tensor
torch.ones(2,4)  # 创建元素全为1的Tensor
torch.rand(2,4)  # 用于创建将元素初始化为[0,1)的随机数Tensor
torch.arange(1,4,0.5)  # 创建在区间内按照指定步长递增的一维Tensor
torch.from_numpy()   # 将NumPy的ndarray对象转换成Tensor

Tensor中常用的数学操作
add( )方法,包括以下三种加法形式:

a = torch.Tensor({[1, 2, 3], [4, 5, 6]})
b = torch.rand(2, 3)
b.add(a)  # 直接运算
torch.add(a, b)  # 利用torch包的方法
b.add_(a)  # 如果函数带有下划线,返回值将会覆盖原来的对象
"__________________三种加法____________________"
a = torch.rand(3)
a + 2  # 第一种加法形式
torch.add(a, 2)  # 第二种加法形式
a.add(2)  # 第三种加法形式

除此以外,还有

torch.abs()  # 取Tensor每个元素的绝对值
torch.ceil()  # 向上取整
torch.exp()  # 返回每个元素以e为底的指数
torch.max()  # 返回所有元素的最大值

线性代数运算

torch.dot()  # 求两个向量的点积
torch.mv()  # 矩阵与向量相乘
torch.mm()  # 两个矩阵相乘
torch.eig()  # 计算方阵的特征值和特征向量
torch.ger()  # 计算两个张量的张量积
torch.inverse()  # 对方阵求逆

连接和切片

1.连接

a = torch.rand(2, 2)
b = torch.rand(2, 2)
print(a)
print(b)
# 拼接函数cat需要传入两个参数:第一个参数是需要拼接的tensor组成的元组,第二个参数是拼接的维度
print(torch.cat((a,b),0))  # 按照第一个维度拼接,则第二个参数需要传入0
print(torch.cat((a,b),1))  # 按照第二个维度拼接,则第二个参数需要传入1

运行结果为

tensor([[[ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
         [ 0.0000e+00,  0.0000e+00,  0.0000e+00,  0.0000e+00],
         [5.4323e-311, 2.1990e-308, 1.5342e-319, 2.2131e-308]],

        [[        nan, 2.1903e-308, 1.5316e-319, 2.1903e-308],
         [1.5316e-319, 2.1903e-308, 1.5316e-319, 2.1903e-308],
         [1.5316e-319, 2.1903e-308, 1.5316e-319, 2.1903e-308]]],
       dtype=torch.float64)
tensor([[0.6106, 0.9396],
        [0.6980, 0.1699]])
tensor([[0.8052, 0.7393],
        [0.0585, 0.7705]])
tensor([[0.6106, 0.9396],
        [0.6980, 0.1699],
        [0.8052, 0.7393],
        [0.0585, 0.7705]])
tensor([[0.6106, 0.9396, 0.8052, 0.7393],
        [0.6980, 0.1699, 0.0585, 0.7705]])

2.切片
切片函数torch.chunk( )需要传入三个函数,第一个是需要切片的Tensor对象,第二个参数是被切分的块数,第三个参数是切分的维度
函数torch.t( )负责求转置矩阵,不过只适合于二维的tensor

c = torch.rand(2, 4)
print(c)
print(torch.chunk(c, 2, 1))
print(torch.t(c))

结果如下:

tensor([[0.3695, 0.9640, 0.6598, 0.3485],
        [0.3169, 0.7920, 0.3817, 0.9554]])
(tensor([[0.3695, 0.9640],
        [0.3169, 0.7920]]), tensor([[0.6598, 0.3485],
        [0.3817, 0.9554]]))
tensor([[0.3695, 0.3169],
        [0.9640, 0.7920],
        [0.6598, 0.3817],
        [0.3485, 0.9554]])

变形

x = torch.rand(2, 3, 4)
print(x)
y = x.view(2, 12)  # 转换成一个2*12的Tensor
print(y)
z = x.view(-1, 1)  # -1作为参数时,代表该维度自动计算,代码表示第一维自动运算,得到24*1的Tensor
print(z)

运行结果太占地方,就不演示了

cuda加速

print(torch.cuda.is_available())

如果输出为True,恭喜你,你可以使用GPU进行加速计算

检查GPu是否安装CUDA,进行CUDA加速,输入测试代码,如果是False,则有两种情况:要么就是计算机没有支持CUDA的NVIDIA显卡,要么就是显卡驱动没有安装成功。

为了比较GPU和CPU的计算速度差距,做一个小测试来实验一下,我们以100010000的矩阵与1000010000矩阵相乘为例,对比他们两个所花费的时间,具体代码如下:

import torch
from time import perf_counter
x = torch.rand(1000, 10000)
y = torch.rand(10000, 10000)
# CPU
start = perf_counter()
x.mm(y)
finish = perf_counter()
time = finish - start
print("CPU计算时间:%s" % time)
# GPU
if torch.cuda.is_available():
    x = x.cuda()
    y = y.cuda()
    start = perf_counter()
    x.mm(y)
    finish = perf_counter()
    time_cuda = finish - start
    print("GPU加速计算的时间:%s" % time_cuda)
    print("CPU计算时间是GPU加速计算时间的%s倍" % str(time / time_cuda))
else:
    print("未支持CUDA")

输出结果如下:

CPU计算时间:0.45977439999999997
GPU加速计算的时间:0.42851169999999983
CPU计算时间是GPU加速计算时间的1.0729564676997154倍

搞不懂为什么我的GPU这么慢!!!只比CPU快一点点,是不是与电脑配置有关系,懂得小伙伴评论区告我一声啊

2. Autograd

Autograd是自动微分也就是自动求导,后面会用到特别多,具体在以后学习中再介绍。