赞
踩
目录
- import paddle #paddle的主库
- from paddle.nn import Linear #神经网络的全连接层函数
- import paddle.nn.functional as F #组网相关的API,包括 Linear、卷积 Conv2D、循环神经网络LSTM、损失函数CrossEntropyLoss、激活函数ReLU等
- import numpy as np
- import os
- import random
代码中参数含义如下:
- #数据处理
- def load_data():
- datafile = "./data/data108228/housing.data"
- data = np.fromfile(datafile, sep =' ' , dtype=np.float32)
-
- #13个特征,一个标签
- feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
- 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
- feature_num = len(feature_names)
-
- #//代表整数除法
- data = data.reshape([data.shape[0] // feature_num, feature_num])
-
- #80%作为训练集,20%作为测试集
- ratio = 0.8
- offset = int(data.shape[0]*ratio)
- training_data = data[:offset]
-
- #归一化
- #计算最大值,最小值,平均值
- max = training_data.max(axis=0)
- min = training_data.min(axis=0)
- avg = training_data.sum(axis=0) / training_data.shape[0]
- global max_values
- global min_values
- global avg_values
- max_values = max
- min_values = min
- avg_values = avg
-
- for i in range(feature_num):
- data[:, i] = (data[:, i] - avg[i]) / (max[i] - min[i])
-
-
- #划分训练集和测试集
- training_data = data[:offset]
- test_data = data[offset:]
- return training_data,test_data
-
- #验证数据集读取
- training_data, test_data = load_data()
- print(training_data.shape)
- print(training_data[1,:])

运行结果:
- class Regressor(paddle.nn.Layer):
- # self代表类的实例自身
- def __init__(self):
- # 初始化父类中的一些参数
- super(Regressor, self).__init__()
-
- # 定义一层全连接层,输入维度是13,输出维度是1
- self.fc = Linear(in_features=13, out_features=1)
-
- # 网络的前向计算
- def forward(self, inputs):
- x = self.fc(inputs)
- return x
init
函数:在类的初始化函数中声明每一层网络的实现函数。在房价预测任务中,只需要定义一层全连接层,模型结构和《使用Python和NumPy构建神经网络模型》章节保持一致;forward
函数:构建神经网络结构,实现前向计算过程,并返回预测结果,在本任务中返回的是房价预测结果。- #训练配置
- #声明定义好的线性回归模型
- model = Regressor()
- #开启训练模式
- model.train()
- #加载数据
- training_data,test_data = load_data()
-
- #定义优化算法,使用随机梯度下降SGD
- #学习率设为0.01
- opt = paddle.optimizer.SGD(learning_rate=0.01,parameters=model.parameters())
- #训练过程
- epoch_num=10
- batch_size=10
-
- for epoch_id in range(epoch_num):
- #每轮迭代开始前,将训练数据随机打乱
- np.random.shuffle(training_data)
- #将训练数据进行拆分,每个batch包含10条数据
- mini_batch = [training_data[k:k+batch_size] for k in range(0,len(training_data),batch_size)]
- #定义内层循环
- for iter_id,mini_batch in enumerate(mini_batch):
- x = np.array(mini_batch[:,:-1]) #获得当前批次的训练数据
- y = np.array(mini_batch[:,-1:]) #获得当前批次训练标签(真实房价)
- #将numpy数据转为飞桨动态图tensor的格式
- house_features = paddle.to_tensor(x)
- prices = paddle.to_tensor(y)
-
- #前向计算
- predicts = model(house_features)
-
- #计算损失
- loss = F.square_error_cost(predicts, label=prices)
- avg_loss = paddle.mean(loss)
- if iter_id%20==0:
- print("epoch: {}, iter: {}, loss is: {}".format(epoch_id, iter_id , avg_loss.numpy()))
-
- #反向传播
- avg_loss.backward()
- #更新参数
- opt.step()
- #清空梯度变量,以备下一轮计算
- opt.clear_grad()

内层循环: 负责整个数据集的一次遍历,采用分批次方式(batch)。假设数据集样本数量为1000,一个批次有10个样本,则遍历一次数据集的批次数量是1000/10=100,即内层循环需要执行100次。
for iter_id, mini_batch in enumerate(mini_batches):
外层循环: 定义遍历数据集的次数,通过参数EPOCH_NUM设置。
for epoch_id in range(EPOCH_NUM):
运行结果:
- #保存模型参数
- paddle.save(model.state_dict(),'LR.model.pdparams')
- print("模型保存成功,模型参数保存在LR.model.pdparams中")
- def load_one_example():
- idx = np.random.randint(0,test_data.shape[0])
- idx = -10
- one_data,label = test_data[idx, :-1] , test_data[idx,-1]
-
- one_data = one_data.reshape([1,-1]) #1行任意列
- return one_data,label
-
-
- model_dict = paddle.load('LR.model.pdparams')
- model.load_dict(model_dict)
- model.eval()
-
- one_data , label = load_one_example()
- one_data = paddle.to_tensor(one_data)
- predict = model(one_data)
-
- # 对结果做反归一化处理
- predict = predict * (max_values[-1] - min_values[-1]) + avg_values[-1]
- # 对label数据做反归一化处理
- label = label * (max_values[-1] - min_values[-1]) + avg_values[-1]
-
- print("Inference result is {}, the corresponding label is {}".format(predict.numpy(), label))

运行结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。