赞
踩
目录
1.4关于torch tensor和numpy array之间的相互转换
pytorch是一个基于Numpy的科学计算包,向他的使用者提供两大功能
pytorch基本元素操作:
- from __future__ import print_function
- import torch
- x = torch.empty(5,3)
- print(x)
- y=torch.rand(5,3)
- print(y)
注意:对比有无初始化矩阵:当声明一个未初始化的矩阵时,它本身不包含任何确切的值,当创建一个未初始化的矩阵时,分配给矩阵的内存中有什么数值就赋值给这个矩阵,本质上是毫无意义的数据
创建一个全零 矩阵并可指定数据元素的类型为long
- z=torch.zeros(5,3,dtype=torch.long)
- print(z)
- a=torch.tensor([2.5,3.5])
- print(a)
- # 第一种加法
- x=torch.rand(5,3)
- y=torch.rand(5,3)
- print(x+y)
- print('*********************')
- # 第二种加法
- print(torch.add(x,y))
- print('*********************')
- # 第三种加法
- # 提前设定一个空张量
- result=torch.empty(5,3)
- # 将空的张量作为加法的结果存储张量
- torch.add(x,y,out=result)
- print(result)
- print('*********************')
- # 第四种加法
- y.add_(x)
- print(y)
注意:所有in-place的操作函数都有一个下划线的后缀;比如:x.copy_(y)x,x.add_(y),都会直接改变x的值。
- x=torch.empty(5,3)
- print(x[:,:3])
- x=torch.randn(4,4)
- # tensor.view()操作需要保证数据元素的总数量不变
- y=x.view(16)
- # -1代表自动匹配个数
- z=x.view(-1,8)
- print(x.size(),y.size(),z.size())
- x=torch.randn(1)
- print(x)
- print(x.item())
- a=torch.ones(5)
- print(a)
- #将torch tensor转换成numpy array
- b=a.numpy()
- print(b)
- # 对其中一个做加法操作,另一个随之改变
- a.add_(1)
- print(a)
- print(b)
- import numpy as np
- a=np.ones(5)
- b=torch.from_numpy(a)
- np.add(a,1,out=a)
- print(a)
- print(b)
注意:所有的CPU上的tensors,除了CharTensor,都可以转换成numpy array 并可以反向转换
关于Cuda tensor:Tensor可以用.to()方法来将其移动到任意设备上
- import torch
- x=torch.randn(4,4)
- # 如果服务器已经安装了cuda
- if torch.cuda.is_available():
- # 定义一个设备对象,这里指定成CUDA,即使用GPU
- device=torch.device("cuda")
- # 直接在GPU上创建一个Tensor
- y=torch.ones_like(x,device=device)
- # 将在CPU上的x张量移动到GPU上?
- x=torch.to(device)
- # x和y都在GPU上,才能支持加法运算
- z=x+y
- print(z)
- # 也可以将z转移到CPU上面,并同时指定张量元素的数据类型
- print(z.to("cpu",torch.double))
小节总结:
基本元素操作:
矩阵初始化:
其他若干操作:
加法操作:
其他若干操作:
相互转换:
移动到任意设备之上:
在pytorch框架中,所有神经网络本质上都是autograd package(自动求导工具包)
提供一个对tensor上所有操作自动微分的功能
- import torch
- x=torch.ones(3,3)
- print(x)
- y=torch.ones(2,2,requires_grad=True)
- print(y)
-
- # 在具有requires_grad=True的tensor上执行一个加法操作。
- z=y+2
- print(z)
- # 打印tensor的grad_fn属性
- print(x.grad_fn)
- print(y.grad_fn)
在tensor执行更复杂的操作:
- z=y*y*3
- out=z.mean()
- print(z,out)
关于require_grad_():该方法可以原地改变tensor的属性,requires_grad的值,如果没有主动设定默认为False.
- a=torch.randn(2,2)
- a=((a*3)/(a-1))
- print(a.requires_grad)
- a.requires_grad_(True)
- print(a.requires_grad)
- b=(a*a).sum()
- print(b.grad_fn)
2.3 关于梯度Gradients
在python中,反向传播是依靠.backward()实现的
- out.backward()
- print(x.grad)
关于自动求导的属性设置:可以通过设置.requires_grad=True来执行自动求导,也可以通过代码块的限制来停止自动求导。
- print(x.requires_grad)
- print((x**2).requires_grad)
- with torch.no_grad():
- print((x**2).requires_grad)
还可以通过.detach()获得一个新的tensor,拥有相同的内容但不需要自动求导
- print(x.requires_grad)
- y=x.detach()
- print(y.requires_grad)
- print(x.eq(y).all())
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。