实现的效果图:
神经网络的大致步骤:
1.读取数据集
2.定义网络
3.学习
4.预测
代码区:
"""
功能:多项式回归
"""
from datetime import datetime
from matplotlib import pyplot as plt
import torch
from torch.nn import functional as F
#1.读取数据集
#生成在-1~1之间个数为100的向量
#unsqueeze 是把向量转换为矩阵
x1 = torch.unsqueeze(torch.linspace(-2,2,300),dim =1)
y1 =x1**3 + x1**2+ 0.5*torch.rand(x1.size())
plt.figure()
plt.scatter(x1.data,y1.data,s=20,cmap="autumn")
plt.title("数据集",fontproperties="SimHei")
plt.xlabel("x轴",fontproperties="SimHei")
plt.ylabel("y轴",fontproperties="SimHei")
plt.show()
#2.定义网络
"""
建立回归的神经网络,创建一个类,是数据的前向传导方式,
类继承自torch.nn.Module
"""
class SimpleNet1(torch.nn.Module):
#定义一个前向传导方式
def __init__(self,n_feature,n_hidden1,n_hidden2,n_hidden3,n_hidden4,n_output):
#初始化继承类
super(SimpleNet1,self).__init__()
#定义数据传递的前向方式
self.hidden_1 = torch.nn.Linear(n_feature,n_hidden1)
self.hidden_2 = torch.nn.Linear(n_hidden1,n_hidden2)
self.hidden_3 = torch.nn.Linear(n_hidden2,n_hidden3)
self.hidden_4 = torch.nn.Linear(n_hidden3,n_hidden4)
self.predict = torch.nn.Linear(n_hidden4,n_output,)
#定义数据传导过程中数据传导
def forward(self, x1):
#定义一个激活函数
hidden_01 = self.hidden_1(x1)
x1 =F.sigmoid(hidden_01)
hidden_02 = self.hidden_2(x1)
x1 =F.sigmoid(hidden_02)
hidden_03 = self.hidden_3(x1)
x1 =F.sigmoid(hidden_03)
hidden_04 = self.hidden_4(x1)
x1 =F.sigmoid(hidden_04)
x1 = self.predict(x1)
return x1
#3.学习
#实例化网络
net = SimpleNet1(1,100,50,20,10,1)
#print(net) 打印出网络结构
#定义一个优化器
optimizer = torch.optim.SGD(net.parameters(),lr=0.1)
#定义一个损失函数,作为后向传导的基准
func_loss = torch.nn.MSELoss()
#训练网络
#假设循环1000次,查看预测的结果和损失率
d1 = datetime.now()
num_epochs = 10000
for epoch in range(num_epochs):
prediction = net(x1)
#loss作为判断
loss = func_loss(prediction,y1)
#每一次数据运行的过程
#forward + backward + optimizer
optimizer.zero_grad()
loss.backward()
optimizer.step()
#可视化训练结果
if (epoch+1)%1000 == 0:
plt.figure()
print("Epoch[{}/{},loss:{:.6f},acc:{:.3f}%]".format(epoch+1,num_epochs,loss.data,(1-loss.data)*100)) #格式化输出
plt.scatter(x1.data.numpy(),y1.data.numpy())
plt.plot(x1.data.numpy(),prediction.data.numpy(),"r-",lw=5)
plt.text(0.5,0,"Loss=%.4f"%loss.data,fontdict={"size":20,"color":"green"})
plt.show()
d2 = datetime.now()
print("学习的耗时:",d2-d1)
# 4.预测
test_data = torch.tensor([-0.8])
pred = net(test_data)
print(test_data,pred.data)