首先让我们了解一下人工神经元:
神经科学家们对大脑进行深人研究后,发现人脑的智能活动离不开脑内的物质基础,包括它的结构以及其中的生物、化学、电学作用。在神经元网络理论和神经系统结构理论中,以神经元作为脑神经系统的基本结构。人工智能研究者们基于对神经元基本结构的掌握,提出了人工神经元模型和人工神经网络。他们发现人工神经网络在理论上可以拟合任何非线性函数。一般情况下,神经元的数目越多,连接数越多,神经网络的复杂度就越高,其所能表达复杂函数的能力就越强。
因此,我们可以将神经元进行数学上的抽象,得到人工神经元模型。我们把神经元树突接收到的不同信号当作不同的x变量,并为不同的信号赋予不同的传输权重wi。每个变量根据权重进行线性累加,然后经过一个激活函数f得到一个新值,这个值就是输出y。
多个人工神经元组成了人工神经网络,人工神经网络分为三层,输入层,隐含层,输出层
在没有激活函数的时候相当于多个线性模型叠加
下面是代码的实现:
导入包
import torch
import matplotlib.pyplot as plt
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
生成一批数据样本:
x = torch.unsqueeze(torch.linspace(-3, 3, 1000), dim=1)
y = x.pow(3) + 0.3 * torch.rand(x.size())
下面定义一个只有一层隐含层的神经网络,这里我们用ReLU作为激活函数
Linear是一个类,实例化了两个Linear类hide和out
可以说 nn.Linear
是属于 nn.Module
的一个组成部分,用于定义线性变换层
class Net(nn.Module):
def __init__(self, input_feature, num_hide, outputs):
super(Net, self).__init__() # 超类,执行父类的初始化
self.hide = nn.Linear(input_feature, num_hide)
self.out = nn.Linear(num_hide, outputs)
def forward(self, x):
x = F.relu(self.hide(x))
x = self.out(x)
return x
cuda = torch.cuda.is_available()
if cuda:
net = Net(input_feature=1, num_hide=20, outputs=1).cuda()
inputs = x.cuda()
target = y.cuda()
else:
net = Net(input_feature=1, num_hide=20, outputs=1)
inputs = x
target = y
这里是想要在GPU上进行运算,在GPU上的运行速度是CPU几倍到几十倍不等
定义优化函数和损失函数
sge = optim.SGD(net.parameters(), lr=0.01)
criterion = nn.MSELoss()
训练函数
def train(model, criterion, sge, epochs):
for _ in range(epochs):
output = model(inputs)
loss = criterion(output, target)
sge.zero_grad()
loss.backward()
sge.step()
if epochs % 80 == 0:
draw(output, loss)
- 如果使用了 CUDA 加速,将
output
转移到 CPU 上(output = output.cpu()
)。- 使用
plt.cla()
清除当前图形中的所有轴。- 使用
plt.scatter()
绘制原始数据的散点图,其中x.numpy()
和y.numpy()
分别表示数据的 x 值和 y 值。- 使用
plt.plot()
绘制输出曲线,其中x.numpy()
表示 x 值,output.data.numpy()
表示模型输出的 y 值,'r-' 表示红色实线,lw=5
表示线宽为 5。- 使用
plt.text()
在图形中添加一个文本框,显示损失值。- 使用
plt.pause(0.005)
暂停一小段时间以更新图形。
def draw(output, loss):
if cuda:
output = output.cpu() # 若使用了CUDA加速这一步要还原为CPU数据类型
plt.cla()
plt.scatter(x.numpy(), y.numpy())
plt.plot(x.numpy(), output.data.numpy(), 'r-', lw=5) # 红色,宽度5
plt.text(1, 1, 'loss=%s' % (loss.item()), fontdict={'size': 20, 'color': 'red'})
plt.pause(0.005)
训练10000次
if __name__ == '__main__':
train(net, criterion, sge, 10000)
print('train_over')