一、PyTorch
1.1 安装无CUDA
pip install torch==1.7.0+cpu torchvision==0.8.1+cpu torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html
二、Numpy VS Torch
Torch自称为神经网络界的Numpy,因为他能将torch产生的tensor放在GPU中加速运算(前提是你有合适的GPU),就像Numpy会把array放在CPU中加速运算.所以神经网络的话,当然是用Torch的tensor形式数据最好咯.就像Tensorflow当中的tensor一样.
当然,我们对Numpy还是爱不释手的,因为我们太习惯numpy的形式了.不过torch看出来我们的喜爱,他把torch做的和numpy能很好的兼容.比如这样就能自由地转换numpy array和torch tensor了
2.1 数据格式对比
import torch import numpy as np # 1.构造二维数据 0 1 2 3 4 5 np_data = np.arange(6).reshape((2,3)) # 2.转换Numpy数据为Torch数据 torch_data = torch.from_numpy(np_data) # 3.Torch数据转换成Numpy数据 tensor2array = torch_data.numpy() # 4.打印数据格式 print( '\nnumpy',np_data, '\ntorch',torch_data, '\ntensor2array',tensor2array )
1.运行报错!
2.然后双击文件安装即可,其实出现这个问题,就是VC没有安装导致的。
2.2 矩阵运算对比
import torch import numpy as np # 矩阵 data = [[1,2],[3,4]] # 32bit floating point tensor = torch.FloatTensor(data) # 打印 print( '\nnumpy矩阵相乘',np.matmul(data,data), '\ntorch矩阵相乘',torch.mm(tensor,tensor) )
2.3 激活函数
import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.pyplot as plt # 数据 200个点数据 x = torch.linspace(-5,5,200) x = Variable(x) # 画图需要numpy格式的数据 x_np = x.data.numpy() # 激活值 函数 y_relu = torch.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() # 作图 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') print(plt.show())
三、神经网络回归
import torch import torch.nn.functional as F from torch.autograd import Variable import matplotlib.pyplot as plt # 数据维度为1,y为2次方+噪声 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_feature,n_hidden,n_output): super(Net, self).__init__() self.hidden = torch.nn.Linear(n_feature,n_hidden) #一个隐藏层 self.predict = torch.nn.Linear(n_hidden,n_output) #预测神经元层,预测一个Y def forward(self,x): x = torch.relu(self.hidden(x)) x = self.predict(x) return x net = Net(1,10,1) # 神经网络的结构1-10-1 print(net) # 实时打印的过程 plt.ion() plt.show() # 优化神经网络 学习效率,均方误差 optimizer = torch.optim.SGD(net.parameters(),lr=0.5) loss_func = torch.nn.MSELoss() for t in range(100): # 训练100步 prediction = net(x) loss = loss_func(prediction,y) # 预测值与真实值 计算误差 optimizer.zero_grad() # 优化参数 梯度降为0 loss.backward() # 反向传递误差 计算梯度 optimizer.step() # 优化梯度 学习效率0.5 if t % 5 == 0: # 每学习5步就打印一次 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()