numpy与torch一些联系
numpy---->torch转换
使用from_numpy()方法
torch_data=torch.from_numpy(np_data)
torch----->numpy转换
使用numpy()方法
tensor=torch_data.numpy()
# numpy与torch相互转换
np_data = np.arange(6).reshape((2,3)) #改变数组的行列数,2行3列
torch_data=torch.from_numpy(np_data) #使用from_numpy,可以把numpy数据转换为torch数据
print('this is numpy:\n',np_data)
print('this is torch:\n',torch_data)
tensor=torch_data.numpy() #使用numpy,把torch数据再转换为numpy的arrange数据
print('this is numpy:\n',tensor)
'''
this is numpy:
[[0 1 2]
[3 4 5]]
this is torch:
tensor([[0, 1, 2],
[3, 4, 5]], dtype=torch.int32)
this is numpy:
[[0 1 2]
[3 4 5]]
'''
numpy基本操作及对应torch
补充一下:Floattensor()方法是将list或numpy转换为浮点型的tensor
# numpy和torch使用abs绝对值,也可以使用:sin,mean...
data=[-1,-2,2,1]
tensor=torch.FloatTensor(data) #将list或numpy转换为浮点型的tensor
print(
'\nabs ',
'\nnumpy: ',np.abs(data),
'\ntorch: ',np.abs(tensor),
)
'''
abs
numpy: [1 2 2 1]
torch: tensor([1., 2., 2., 1.])
'''
矩阵运算
类似numpy的点乘dot(),叉乘@,下文所用matmul在2维矩阵中与dot相同
tensor形式就用torch.mm(tensor1,tensor2)
求矩阵乘积
# 矩阵运算
data = [[1,2],[3,4]]
tensor = torch.FloatTensor(data) #从python的list创建一个tensor
print(np.matmul(data,data)) #numpy形式乘积,matmul不支持标量乘法,在2维矩阵乘法中,其效果与dot一样。但在N维矩阵乘法中(N>=3),体现出与dot不一样的算法。
print(torch.mm(tensor,tensor)) #tensor形式的矩阵乘积
'''
[[ 7 10]
[15 22]]
tensor([[ 7., 10.],
[15., 22.]])
'''
variable变量
变成variable才能在反向传播中得到更新,所以要将张量(tensor)转换为变量(variable)
但是现在的新版本已经没有区别了,直接对tensor操作,了解即可。
import torch
from torch.autograd import variable # 神经网络中的参数都是variable类型,autograd自动梯度计算
vardata=torch.FloatTensor([[1,2],[3,4]]) # 转换为浮点型
vardata.requires_grad_(requires_grad = True) # reguires_grad属性:是否在反向传播中计算梯度
print(vardata)
t_out= torch.mean(vardata * vardata) #计算平方的平均值
print(t_out)
t_out.backward() #反向传播
print(vardata.grad) #查看梯度值
输出:
tensor([[1., 2.],
[3., 4.]], requires_grad=True)
tensor(7.5000, grad_fn=<MeanBackward0>)
tensor([[0.5000, 1.0000],
[1.5000, 2.0000]])
- 若要设置reguire_grad,请使用直接
vardata.requires_grad_(requires_grad = True)
- 注意:
vardata = variable(tensor,requires_grad=True)
由于新版本中tensor和variable已合并,tensor类型就可以当做variable使用用,这行代码不写
要把variable值转换为numpy,不能像tensor一样numpy(),而是:print(vardata.data.numpy())
此处有疑问
激励函数
常见激励函数
将一个结果转换为某个范围内的结果,例如在relu中,得到复数就输出0,得到正数就输出。有些像数电中的判断电路。
卷积神经网络常用relu
引入激励函数库
-
头文件引入:
import torch.nn.functional as F
其中,nn是神经网络模块,激励函数 -
调用激励函数:
F.relu(x)
将x输入激励函数relu -
若要matplotlib画图,由于matplotlitb仅能处理numpy类型,所以要把variable类型转化为numpy类型
import torch
import torch.nn.functional as F # nn是神经网络模块,激励函数
from torch.autograd import Variable
import matplotlib.pyplot as plt # 引入绘图库,只能识别numpy
#fake data
x = torch.linspace(-5,5,200) # 从-5~5中间取200个数字
x = Variable(x) #将其Variable化
x_np = x.numpy()
y_relu = F.relu(x).numpy() #用F.relu()引用激励函数relu,此处没有relu和numpy之间的data.
y_sigmoid = F.sigmoid(x).numpy()
y_tanh = F.tanh(x).numpy()
y_softplus = F.softplus(x).numpy()
回归
squeeze和unsqueeze的使用
- torch.squeeze()
压缩维度,去掉维数为1的维度,例如1行3列(1,3)去掉第一个维数后变成(3)行
压缩:
a=torch.randn(1,1,3)
print(a.shape)
b=torch.squeeze(a)
print(b.shape)
c=torch.squeeze(a,0)
print(c.shape)
d=torch.squeeze(a,2) #如果去掉第三维变成1,1的平面,则3个数字不能放下,所以直接保留
print(d.shape)
输出:
torch.Size([1, 1, 3])
torch.Size([3]) #不说明的压缩位置的话,就压缩所有1
torch.Size([1, 3]) #压缩下标位置0,即前一个1
torch.Size([1, 1, 3])
- torch.unsqueeze()
扩展维度,对指定位置加上一维,例如将一维的数组,扩展成一个矩阵。
扩展:
a=torch.randn(1,3)
print(a.shape)
b=torch.unsqueeze(a,0)
print(b.shape)
c=torch.unsqueeze(a,2) #给2这个下标位置添加,
print(c.shape)
输出:
torch.Size([1, 3])
torch.Size([1, 1, 3])
torch.Size([1, 3, 1])