之前也写过pytorch入门教程的笔记,不过好久不自己动手写都有点忘了,这次这个教程讲了挺多官方教程没讲的东西,还是值得记一下
1、GPU初探
(1)将张量转移到GPU上: *.cuda()
eg. t = t.cuda()
(2)GPU只适合特定任务,比如能分解成多个小任务并行计算的
另外将计算转移到GPU也有不小的开销,所以简单的任务直接用CPU完成就好了
2、Tensor初探
tensor的三个属性:
t.dtype:数据类型
t.device:设备(gpu/cpu)
t.layout:默认为strided
注意:不同类型/设备的tensor无法进行运算
3、Numpy array转换为tensor
data = np.array([1,2,3])
(1)t1 = torch.Tensor(data) #这个为构造函数
(2)t2 = torch.tensor(data) #工厂函数
(3)t3 = torch.as_tensor(data) #工厂函数
(4)t4 = torch.from_numpy(data) #工厂函数
(1)会默认把输入数据转换为float32
(2)(3)(4)则是根据输入数据的类型推断输出数据的类型(这里是int32)
当然也可以在输入时直接设置输出类型
t5 = torch.tensor(np.array([1,2,3]), dtype=torch.float64)
但构造函数不能这样设置
Note:(3)和(4)在转换时只是复制了指针,也就是共享内存,改变numpy也会改变tensor
使用哪个函数?
一、通常使用torch.tensor(),不容易出错
二、性能调优时使用torch.as_tensor()
为什么不适用torch.from_numpy()?
因为它只接收numpy数据类型,其他类型不接收
4、Reshape
(1)获取tensor的元素数量
t.numel()
(2)squeeze和unsqueeze
torch.squeeze(a) #去掉a的所有为1的axis
torch.unsqueeze(a,2) #在a的index=2的axis插入一个1,即增加一个维度
(3)flatten压扁
其实就是先t.reshape(1,-1),然后t.squeeze()去掉为1的轴
不过torch有实现好的:torch.flatten(t)
5、Element-wise操作
这里主要是对axis的理解比较关键
t = torch.tensor([
[1,1,1,1],
[2,2,2,2],
[3,3,3,3]],dtype=int32)
t.sum(dim=0)
out:tensor[6,6,6,6]
我们来看一下这个"dim=0"是什么意思?
dim=0代表以第0轴为单位进行运算
而以第0轴为单位又是什么意思呢?
就是sum变成了[0]+t[1]+t[2]
或者t[0,:]+t[1,:]+t[2,:]
dim=1时,
则为t[:,0]+t[:,1]+t[:,2]+t[:,3]
Note!
运算后的维度即把这个轴去掉后的维度
eg.t.shape=[2,3,4]
则t.sum(dim=0).shape=[3,4]
用这种方法来推它到底是怎么运算的也可以