该篇文章是训练Transformer前的pytorch的知识补充。感谢博主莫凡Python的视频课程https://www.youtube.com/watch?v=lAaCeiqE6CE&feature=emb_title,其主页是:莫烦Python
建议直接观看该博主视频教程完成pytorch的知识补充。也可走马观花浏览我的文字记录。
对于Transformer硬件加速器算法与电路协同设计,算法训练必不可少,故在训练前温习Pytorch知识,对视频教程进行文字整理及总结,作为学习交流使用。
torch各类函数参考网站,很多计算形式均从该网站查:pytorch 查询网站
import torch
import numpy as np
#对比
np_data = np.arange(6).reshape((2,3))
torch_data = torch.from_numpy(np_data)
tensor2array = torch_data.numpy()
print(
'\nnumpy',np_data,
'\ntorch',torch_data,
'\ntensor2array',tensor2array
)
torch是深度学习领域的numpy,如代码所示,numpy数据可以用torch.from_numpy()函数转换为tensor类型,反过来也可以在tensor数据后+.numpy()转换回来。
#算数运算
data = [-1,-2,1,2]
tensor = torch.FloatTensor(data)#32bit
print(
'\nnumpy',np.abs(data),np.sin(data),np.mean(data),
'\ntorch',torch.abs(tensor),torch.sin(tensor),torch.mean(tensor)
)
#矩阵运算
data = [[-1,-2],[1,2]]
tensor = torch.FloatTensor(data)#32bit
data = np.array(data)
print(
'\nnumpy',np.matmul(data,data),data.dot(data),
# '\ntorch',torch.mm(tensor,tensor),tensor.dot(tensor)
)
torch.FloatTensor()函数可以生成tensor数据,data代表numpy可处理数据,numpy的abs,sin,mean等在torch中均有同名函数。对于矩阵运算同理。
#variable变量
import torch
from torch.autograd import Variable
tensor = torch.FloatTensor([[1,2], [3,4]])
variable = Variable(tensor, requires_grad=True)#相当于节点
print(tensor)
print(variable)
t_out = torch.mean(tensor*tensor) #x^2
v_out = torch.mean(variable*variable)
print(t_out)
print(v_out)
v_out.backward()
#vout = 1/4*sum(var*var)
#d(vout)/d(var) =1/4 * 2 var= 1/2 *variable
print(variable.grad)
print(variable)
print(variable.data)
print(variable.data.numpy())
该变量可理解为Torch中的一个节点。这个节点理解为一个篮子,装在里面的tensor可以参与计算。torch.FloatTensor()生成的tensor,通过Variable()函数放入节点中,requires_grad表示该节点是否需要梯度。t_out是tensor的求平均,而v_out是Variable中的tensor求平均,v_out可以计算梯度。v_out.backward()是反向传播,将梯度写进节点中,此时可以打印variable的grad(梯度),data(数据)等。
#激励函数
import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
#fake data
x = torch.linspace(-5,5,200)
x = Variable(x)
x_np = x.data.numpy()
y_relu = F.relu(x).data.numpy()
y_sigmoid = torch.sigmoid(x).data.numpy()
y_tanh = torch.tanh(x).data.numpy()
y_softplus = F.softplus(x).data.numpy()
# y_softmax = F.softmax(x)
#画图
plt.figure(1, figsize=(8,6))
plt.subplot(221)
plt.plot(x_np,y_relu,c='red',label='relu')
plt.ylim((-1,5))
plt.legend(loc='best')
plt.subplot(222)
plt.plot(x_np,y_sigmoid,c='red',label='sigmoid')
plt.ylim((-0.2,1.2))
plt.legend(loc='best')
plt.subplot(223)
plt.plot(x_np,y_tanh,c='red',label='tanh')
plt.ylim((-1.2,1.2))
plt.legend(loc='best')
plt.subplot(224)
plt.plot(x_np,y_softplus,c='red',label='softplus')
plt.ylim((-0.2,6))
plt.legend(loc='best')
plt.show()
该部分介绍torch中的激活函数,分别是F.relu(),F.softplus(),torch.sigmoid(),torch.tanh()。
画图如下:
#回归(关系拟合)
import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
#fake data
x = torch.unsqueeze(torch.linspace(-1,1, 100),dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size())
x, y = Variable(x), Variable(y)
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
class Net(torch.nn.Module):
def __init__(self, n_features, n_hidden, n_output):
super(Net,self).__init__()
self.hidden = torch.nn.Linear(n_features,n_hidden)
self.predict = torch.nn.Linear(n_hidden,1)#预测y的值
def forward(self,x):#搭神经网络
x = F.relu(self.hidden(x))
x = self.predict(x)
return x
net = Net(1,10,1)
print(net)
x和y分别为自变量和因变量,y=x^2+小随机数。将x和y都放在Variable(计算节点)里,之后打印x和y的关系图便于查看。
class Net是构建的模型,torch.nn.Moudle是必须要继承的模型,__init__()里super()函数是继承父类,必须写。之后便是其参数。而forward()函数是具体的神经网络结构。最终net=Net()实例化了一个模型。
plt.ion()#实时打印
plt.show()
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
loss_func = torch.nn.MSELoss()#均方差
for t in range(100):
prediction = net(x)
loss = loss_func(prediction,y)
optimizer.zero_grad()#每次先将梯度清零
loss.backward()#反向传递,给每个节点(Variable)附上梯度。
optimizer.step()#用效率0.5来优化梯度
if t%5 == 0:
#plot and show learning process
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(),'r-',lw=5)
plt.text(0.5, 0, 'Loss=%.4f' % loss.data, fontdict={'size':20,'color':'red'})
plt.pause(0.1)
plt.ioff()
plt.show()
该段代码实时打印训练过程。optimizer是优化器,代表参数更新使用的方案。loss_func是判断实际与预测值得损失。for循环中各步骤已添加注释。每隔5次显示一张图。
正确的关系如图所示:
预测的关系如图所示:
七、Pytorch基础知识补充未完。。。下一篇文章即将到来。