问题一: 机器学习的基本流程(17)

< best_loss:best_loss = torch.abs(loss).item()best_epoch = epochtorch.save(myNet.state_dict(), 'new_best_interpolation.mdl')# 连续绘图if epoch % 10 == 0:plt.ion()# 打开交互模式plt.close('all')myNet.load_state_dict(torch.load('new_best_interpolation.mdl'))with torch.no_grad():pred = myNet(x_data)plt.plot(x_data, y_data, label='real')plt.plot(x_data, pred, label='predict')plt.title("Training times:" + str(epoch))# 画散点图colors1 = '#00CED1'# 点的颜色colors2 = '#DC143C'area = np.pi * 2 ** 2# 点面积plt.scatter(input, label, s=area, c=colors2, alpha=0.9, label='node')plt.legend(loc="upper right")plt.savefig('./Training_process/Interpolation_'+str(epoch)+'.png')if epoch == best_epoch:plt.savefig('Best_nterpolation.png')# plt.show()# plt.pause(0.01)print('=' * 55)print('学习结束'.center(55))print('-' * 55)print('最优学习批次:', best_epoch, '最优误差:', best_loss)plt.close('all')plt.ioff()# 关闭交互模式plt.title('Error curve')plt.xlabel('loss vs. epoches')plt.ylabel('loss')plt.plot(range(0, epochs + 1), Loss_list, label='Loss')plt.savefig('Error_curve_interpolation.png')# plt.show()print('已生成"最优插值结果图",请打开文件"Best_interpolation.png"查看')print('已生成"误差曲线图",请打开文件"Error_curve_interpolation.png"查看')print('-' * 55)print('准备绘制训练过程动态图')image2gif.image2gif('Interpolation')print('=' * 55)
二、拟合
问题描述
在函数 f ( x ) = s i n ( x ) ? 0.5 f(x)=sin(x)-0.5 f(x)=sin(x)?0.5, x ∈ ( ? 2 π , 2 π ) x\in(-2\pi,2\pi) x∈(?2π,2π)上添加噪声后,使用 ANN 对300个点进行拟合的数值计算结果如下:
程序源代码
# 开发者:Leo 刘# 开发环境: macOs Big Sur# 开发时间: 2021/8/1 11:43 上午# 邮箱: 517093978@qq.com# @Software: PyCharmimport torchimport torch.nn as nnimport numpy as npimport matplotlib.pyplot as pltfrom Dynamic_drawing import image2gif# 构建输入集x_data = http://www.kingceram.com/post/np.linspace(-2 * np.pi, 2 * np.pi, 300)[:, np.newaxis]x_data = torch.tensor(x_data).float()noise = np.random.normal(0, 0.05, x_data.shape)y_data = np.sin(x_data) - 0.5 + noisey_data = torch.tensor(y_data).float()# 定义神经网络class Net(torch.nn.Module):# 初始化数组,参数分别是初始化信息,特征数,隐藏单元数,输出单元数def __init__(self, n_feature, n_hidden, n_output):# 此步骤是官方要求super(Net, self).__init__()# 设置输入层到隐藏层的函数self.input = torch.nn.Linear(n_feature, n_hidden)# 设置隐藏层到隐藏层的函数self.hidden = torch.nn.Linear(n_hidden, n_hidden)# 设置隐藏层到输出层的函数self.predict = torch.nn.Linear(n_hidden, n_output)# 定义向前传播函数def forward(self, input):# 给x加权成为a,用激活函数将a变成特征b# input = torch.relu(self.hidden(input))# 线性插值input = torch.tanh(self.input(input))# 非线性插值# 给a加权成为b,用激活函数将b变成特征cinput = torch.tanh(self.hidden(input))# 给c加权,预测最终结果input = self.predict(input)return input# 初始化网络myNet = Net(1, 10, 1)print('神经网络结构:')print(myNet)# 设置优化器# optimizer = torch.optim.SGD(myNet.parameters(), lr=0.05)optimizer = torch.optim.Adam(myNet.parameters(), lr=0.05)loss_func = nn.MSELoss()best_loss, best_epoch = 1000, 0epochs = 2000# 训练次数input = x_datalabel = y_dataLoss_list = []print('开始学习:')for epoch in range(epochs + 1):output = myNet(input)loss = loss_func(output, label)# 计算误差Loss_list.append(loss / (len(x_data)))optimizer.zero_grad()# 清除梯度loss.backward()# 误差反向传播optimizer.step()# 梯度更新torch.save(myNet.state_dict(), 'new_best_fitting.mdl')# 记录误差if epoch % 100 == 0:print('epoch:', epoch, 'loss:', loss.item(), )# 记录最佳训练次数if epoch> int(4 * epochs / 5):if torch.abs(loss)