赞
踩
深度学习模型具有一定的通用性,使得深度学习的门槛降低,这是深度学习得以重新占据计算机领域一席之地的重要原因,深度学习均可以从下述五个步骤来完成模型的构建和训练。
- def load_data():
- # 从文件导入数据
- datafile = './work/housing.data'
- data = np.fromfile(datafile, sep=' ')
-
- # 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
- feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
- 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
- feature_num = len(feature_names)
-
- # 将原始数据进行Reshape,变成[N, 14]这样的形状
- 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]
-
- # 计算train数据集的最大值,最小值,平均值
- maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
- training_data.sum(axis=0) / training_data.shape[0]
-
- # 对数据进行归一化处理
- for i in range(feature_num):
- #print(maximums[i], minimums[i], avgs[i])
- data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
-
- # 训练集和测试集的划分比例
- training_data = data[:offset]
- test_data = data[offset:]
- return training_data, test_data

首先我们要清楚神经网络负责什么,我们起初假设了波士顿的房价和各个因素成线性关系,神经网络根据数据训练出一组最适合,最能拟合数据的一组参数,这就是神经网络需要做的事情,输入是数据,输出的一组最优参数。
首先,必须先了解以下几个概念:
我们使用神经网络进行训练的过程可以用下面的伪代码进行表述:
- iteration=N; # 迭代的次数
- init(w,b); # 为参数赋初值
- while(i<iteration)
- z = forward(w,b,data); # 计算这一组参数对数据的预测值
- Loss = cul_loss(z,y); # 计算预测值和真实值之间的损失
- gradient = cul_gradient(); # 房价预测模型很简单,我们用梯度下降法更新参数,计算梯度,梯度的计算过程如上。
- w,b = update(w, b, gradient); # 根据梯度更新参数
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
-
- def load_data():
- # 从文件导入数据
- datafile = './data/housing.data'
- data = np.fromfile(datafile, sep=' ')
-
- # 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
- feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
- 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
- feature_num = len(feature_names)
-
- # 将原始数据进行Reshape,变成[N, 14]这样的形状
- 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]
-
- # 计算train数据集的最大值,最小值,平均值
- maximums, minimums, avgs = training_data.max(axis=0), training_data.min(axis=0), \
- training_data.sum(axis=0) / training_data.shape[0]
-
- # 对数据进行归一化处理
- for i in range(feature_num):
- #print(maximums[i], minimums[i], avgs[i])
- data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
-
- # 训练集和测试集的划分比例
- training_data = data[:offset]
- test_data = data[offset:]
- return training_data, test_data
-
- class Network(object):
- def __init__(self, num_of_weights):
- # 随机产生w的初始值
- # 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子
- #np.random.seed(0)
- self.w = np.random.randn(num_of_weights, 1)
- self.b = 0.
-
- def forward(self, x):
- z = np.dot(x, self.w) + self.b
- return z
-
- def loss(self, z, y):
- error = z - y
- num_samples = error.shape[0]
- cost = error * error
- cost = np.sum(cost) / num_samples
- return cost
-
- def gradient(self, x, y):
- z = self.forward(x)
- N = x.shape[0]
- gradient_w = 1. / N * np.sum((z-y) * x, axis=0)
- gradient_w = gradient_w[:, np.newaxis]
- gradient_b = 1. / N * np.sum(z-y)
- return gradient_w, gradient_b
-
- def update(self, gradient_w, gradient_b, eta = 0.01):
- self.w = self.w - eta * gradient_w
- self.b = self.b - eta * gradient_b
-
-
- def train(self, training_data, num_epoches, batch_size=10, eta=0.01):
- n = len(training_data)
- losses = []
- for epoch_id in range(num_epoches):
- # 在每轮迭代开始之前,将训练数据的顺序随机的打乱,
- # 然后再按每次取batch_size条数据的方式取出
- np.random.shuffle(training_data)
- # 将训练数据进行拆分,每个mini_batch包含batch_size条的数据
- mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]
- for iter_id, mini_batch in enumerate(mini_batches):
- #print(self.w.shape)
- #print(self.b)
- x = mini_batch[:, :-1]
- y = mini_batch[:, -1:]
- a = self.forward(x)
- loss = self.loss(a, y)
- gradient_w, gradient_b = self.gradient(x, y)
- self.update(gradient_w, gradient_b, eta)
- losses.append(loss)
- print('Epoch {:3d} / iter {:3d}, loss = {:.4f}'.
- format(epoch_id, iter_id, loss))
-
- return losses
-
- # 获取数据
- train_data, test_data = load_data()
-
- # 创建网络
- net = Network(13)
- # 启动训练
- losses = net.train(train_data, num_epoches=50, batch_size=100, eta=0.1)
-
- # 画出损失函数的变化趋势
- plot_x = np.arange(len(losses))
- plot_y = np.array(losses)
- plt.plot(plot_x, plot_y)
- plt.show()

假设房价和各影响因素之间能够用线性关系来描述:y = ∑ i = 0 M x i w i + b y = \sum_{i=0}^M x_iw_i+by=∑i=0Mxiwi+b
模型的求解即是通过数据拟合出每个w i w_iwi和b bb,w i w_iwi和b bb分别表示线性模型的权重和偏值,一维情况下代表直线的斜率和截距。
下面代码中数据处理的部分可以简单概括为:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。