张量类似于Numpy的数组,可以在GPU上使用,并能改善性能
1、标量 (0维张量)
包含一个元素的张量称为标量。标量的类型通常是FloatTensor或LongTensor。如下:
import torch
x = torch.rand(6)
x.size()
print(type(x.size(0)))
# 输出:torch.Size([6])
#
2、向量(一维张量)
他是一个元素序列的数组
例如:存储一周的最高气温
temp_max = torch.FloatTensor([23.6,25.9,29.3,30.1,31.4,30.8,29.5])
print(temp_max.size())
print(type(temp_max))
'''
torch.Size([7])
'''
3、矩阵(二维张量)
把csv文件打开为numpy数组,用torch提供的函数from_numpy将数组转换为torch张量,输出的张量形状为506行*14列的矩阵
import numpy as np
np1 = np.loadtxt('housing.csv')
boston_tensor = torch.from_numpy((np1))
print(boston_tensor.size())
# torch.Size([506, 14])
获取前两份内容并打印:
print(boston_tensor[:2])
'''
tensor([[6.3200e-03, 1.8000e+01, 2.3100e+00, 0.0000e+00, 5.3800e-01, 6.5750e+00,
6.5200e+01, 4.0900e+00, 1.0000e+00, 2.9600e+02, 1.5300e+01, 3.9690e+02,
4.9800e+00, 2.4000e+01],
[2.7310e-02, 0.0000e+00, 7.0700e+00, 0.0000e+00, 4.6900e-01, 6.4210e+00,
7.8900e+01, 4.9671e+00, 2.0000e+00, 2.4200e+02, 1.7800e+01, 3.9690e+02,
9.1400e+00, 2.1600e+01]], dtype=torch.float64)
'''
4、3维张量
把几个矩阵累加到一起,就得到了一个三维张量。举个例子,就是图片。
一般进行图像分类的图片,我们会将它处理成(224,224,3)张量,这三个(RGB)依次表示:高度,宽度,通道数。
from PIL import Image
pic = np.array(Image.open('pic.jpg').resize((224,224)))
pic_tensor = torch.tensor(pic)
print(pic_tensor.size())
plt.imshow(pic_tensor)
plt.show()
5、切片张量
张量的一个常见操作就是切片,以前面所写的最高温度为例:
temp_max[:5] # tensor([23.6000, 25.9000, 29.3000, 30.1000, 31.4000])
还可以做一些有趣的事,比如裁剪出图片中的面部
plt.imshow(pic_tensor[25:100,100:150,].numpy())
6、四维张量
常见的类型是用于批处理图像,由于GPU内存的限制,一般常用的批处理尺寸是16,32,64.
7、五维张量
使用到五维张量的例子可能就是视频数据了,视频可以划分为帧,比如一个一分钟的短视频,假设包含的帧数为60,那么,这个视频表示的形状可能就是(1,60,224,224,3)的张量。
8、GPU上的张量
进行一些张量计算,同时可以体现出CPU和GPU之间的性能
a = torch.rand(10000,10000)
b = torch.rand(10000,10000)
start = time.time()
a.matmul(b)
end = time.time()
print('a*b耗时:',end - start) # a*b耗时: 10.270581245422363
a = torch.rand(10000,10000)
b = torch.rand(10000,10000)
a = a.cuda()
b = b.cuda()
start = time.time()
a.matmul(b)
end = time.time()
print('a*b耗时:',end - start) # a*b耗时: 0.6859965324401855
可以直观的看出两者之间的算力差距
文中用到的housing.csv;pic.jpg,会上传到我的资源中,有需要可以下载操作。其实也没那么需要,大家改成自己想操作的文件就可以。