虽然之前已经学习了很多有关机器学习的知识,但都是理论了解,真正遇到项目才发现自己实操验证不足,故而选择从基础学习,正好自己做一下笔记。
它是一个基于python的科学计算库,致力于为两类用户提供服务:
张量很像Numpy中的ndarrays,并以此为基础使得他可以运行在GPU上来加速计算。
#导入包
from __future__ import print_function
import torch
#创建一个5x3的张量
x = torch.empty(5, 3)
print(x)
'''打印结果
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
'''
#创建一个均匀分布的初始化的,每个元素从0~1的张量,与第一个要区别开
#另外,还有其它的随机张量生成函数
#如torch.randn()、torch.normal()、torch.linespace()
#分别是标准正态分布,离散正态分布,线性间距向量
x = torch.rand(5, 3)
print(x)
'''打印结果
tensor([[0.0453, 0.6403, 0.7086],
[0.3725, 0.9536, 0.4979],
[0.8880, 0.4022, 0.0191],
[0.0108, 0.3556, 0.3921],
[0.7216, 0.6428, 0.1180]])
'''
# 这个是初始化一个全零张量,可以指定每个元素的类型。
x = torch.zeros(5, 3, dtype=torch.long)
print(x)
"""打印结果
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
"""
#从已有矩阵转化为张量
x = torch.tensor([5.5, 3])
print(x)
"""
tensor([5.5000, 3.0000])
"""
#从已有张量在创建一个张量,新的张量会重用已有张量的数值
#如:若不提供新的值,那么每个值的类型将会被重用。
x = x.new_ones(5, 3, dtype=torch.double) # new_* methods take in sizes
print(x)
x = torch.randn_like(x, dtype=torch.float) # override dtype!
print(x) # result has the same size
'''
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-1.9149, -2.1123, -0.0094],
[-0.0293, -0.7709, 0.2928],
[-0.5862, -0.4560, 0.3048],
[-1.1351, -0.3346, -1.6508],
[-0.2904, -0.2541, 0.6300]])
'''
# 最后我们学习如何获取张量的形状,一个小Tip,torch.Size是一个元组,所以支持元组的操作。
print(x.size())
"""
torch.Size([5, 3])
"""
张量的运算方法有很多,这里以加法为例子讲解,查看更多(100+种Tensor 运算,包括转置、索引、切片、数学运算、线性代数、随机数)。
#设定初始值
x = torch.rand(5, 3)
y = torch.rand(5, 3)
#加法方式1
print(x + y)
'''
tensor([[0.8933, 0.3901, 1.4612],
[1.0388, 1.5159, 0.8598],
[0.6628, 0.7821, 1.4633],
[1.0268, 1.5891, 0.7690],
[0.9112, 0.2712, 0.3129]])
'''
#加法方式2
print(torch.add(x, y))
'''
tensor([[0.8933, 0.3901, 1.4612],
[1.0388, 1.5159, 0.8598],
[0.6628, 0.7821, 1.4633],
[1.0268, 1.5891, 0.7690],
[0.9112, 0.2712, 0.3129]])
'''
#加法方式3 可以添加参数
result = torch.empty(5, 3)
torch.add(x, y, out=result)
print(result)
'''
tensor([[0.8933, 0.3901, 1.4612],
[1.0388, 1.5159, 0.8598],
[0.6628, 0.7821, 1.4633],
[1.0268, 1.5891, 0.7690],
[0.9112, 0.2712, 0.3129]])
'''
#加法方式4 这是方法二的一种变式,注意有一个“_”,
#这个符号在所有替换自身操作符的末尾都有,另外,输出的方式还可以象python一样。
y.add_(x)
print(y)
"""
tensor([[ 1.2461, 0.6067, -0.9796],
[ 0.0663, -0.9046, 0.8010],
[ 0.4199, 1.8893, 0.7887],
[ 0.6264, -0.2058, 1.8550],
[ 0.0445, -0.8441, 2.2513]])
"""
#注意:任何改变自身张量的操作后面都有一个后缀“_”,比如x.copy_(y),x.t_()都将改变张量x
#你也可以使用任何Numpy的操作来操作张量
print(x[:, 1])
'''
tensor([-0.2405, -0.9072, 1.8072, -0.6766, -1.1166])
'''
张量加法运算先到这里,接下来我们看一先如何跳转张量形状及查看张量大小
#如果你想调整张量的维数 你可以使用torch.view()
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8) # the size -1 is inferred from other dimensions
print(x.size(), y.size(), z.size())
'''
torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])
'''
#查看张量大小
x = torch.randn(1)
print(x)
print(x.item())
'''
tensor([0.4379])
0.4378727972507477
'''
Tensor 和 NumPy 将共享其基础内存位置(如果 Tensor 位于 CPU 上),更改一个将更改另一个内存位置。
#tensor转换到Numpy
a = torch.ones(5)
print(a)
"""
tensor([1., 1., 1., 1., 1.])
"""
b = a.numpy()
print(b)
"""
[1. 1. 1. 1. 1.]
"""
#如果要改变值
a.add_(1)
print(a)
print(b)
"""
tensor([2., 2., 2., 2., 2.])
[2. 2. 2. 2. 2.]
"""
#Numpy转换到tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print(a)
print(b)
'''
[2. 2. 2. 2. 2.]
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
'''
#注意 CPU 上的所有 Tensors,除了 Char Tensor 支持转换为 NumPy 和 返回值。
CUDA张量
所有的tensors都可以使用.cuda函数可以将张量移动到GPU上
# let us run this cell only if CUDA is available
# We will use ``torch.device`` objects to move tensors in and out of GPU
if torch.cuda.is_available():
device = torch.device("cuda") # a CUDA device object
y = torch.ones_like(x, device=device) # directly create a tensor on GPU
x = x.to(device) # or just use strings ``.to("cuda")``
z = x + y
print(z)
print(z.to("cpu", torch.double)) # ``.to`` can also change dtype together!
'''
tensor([2.0968], device='cuda:0')
tensor([2.0968], dtype=torch.float64)
'''