深度学习课程 DAY 2 - 构建神经网络模型(一)
Chapter 2 构建神经网络模型
上一节我们初步认识了神经网络的基本概念(如神经元、多层连接、前向计算、计算图)和模型结构三要素(模型假设、评价函数和优化算法)。本节将以“波士顿房价”任务为例,使用Python语言和Numpy库来构建神经网络模型的思考过程和操作方法。
2.1 问题分析-房价预测任务
(1)问题阐述和定性分析
- 问题阐述
波士顿地区的房价是由诸多因素影响的。该数据集统计了13种可能影响房价的因素和该类型房屋的均价,期望构建一个基于13个因素进行房价预测的模型。
下图为模型的13个特征变量。
* 定性分析:
对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散的标签,区分为回归任务和分类任务。因为房价是一个连续值,所以房价预测显然是一个回归任务。下面我们尝试用最简单的线性回归模型解决这个问题,并用神经网络来实现这个模型。
(2)线性回归模型(模型假设和评价函数)
- 模型假设
问题可以归结成一个多元线性回归的模型。需要求参数w的值。
回归问题输出为连续值(如身高),分类问题输出为离散值(如性别)
假设房价和各影响因素之间能够用线性关系来描述:
模型的求解即是通过数据拟合出每个wj和b。其中,wj和b分别表示该线性模型的权重和偏置。一维情况下,wj和b是直线的斜率和截距。
- 损失函数
线性回归模型使用均方误差作为损失函数(Loss),用以衡量预测房价和真实房价的差异,公式如下:
为什么要以均方误差作为损失函数?(为什么残差取平方?)即将模型在每个训练样本上的预测误差加和,来衡量整体样本的准确性。这是因为损失函数的设计不仅仅要考虑“合理性”,同样需要考虑“易解性”。
作业题:为什么损失函数选择均方误差函数,而不选择绝对值误差函数?
均方误差可微积分,但绝对值误差不可微。均方误差约接近最低点的曲线坡度逐渐放缓,
为什么损失函数越少越好?预测值和真实值差距越小越好,说明模型更为准确。因此损失函数期望最小化。
==============================================================================
【个人理解】联系最小二乘问题。损失函数的本质是最大化似然公式的求解,通过求偏导变换为最小二乘问题求解。结合Risk Mangement的loss size计算理解。
参考:https://blog.csdn.net/Wang_Da_Yang/article/details/78594309
(3)神经网络模型(优化算法)
神经网络的标准结构中每个神经元是由加权和与非线性变换构成,将多个神经元分层的摆放并连接形成神经网络。线性回归模型可以认为是神经网络模型的一种极简特例,是一个只有加权和、没有非线性变换的神经元,无需形成网络。
线性回归模型的神经网络结构:
2.2 代码实现-构建神经网络模型
模型的构建和训练可分为五个步骤:数据处理、模型设计、训练配置、训练过程和模型保存。
(1)数据处理
数据存放在本地目录下housing.data文件中
1)读入数据
查看一下存储在文本文件的数据形式:(共506行,13列x特征变量,y为房价)
使用Numpy库的命令
np.fromfile
,从文件中导入数据。
# 将库导入需要用到的package
import numpy as np
import json
# 读入训练数据
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ')
data
输出
array([6.320e-03, 1.800e+01, 2.310e+00, ..., 3.969e+02, 7.880e+00, 1.190e+01])
打印后发现是一个长度为7084的array数组,0-13是第一条数据,14-27项是第二条数据。一个样本14个值,共506个样本。所有样本混在一个数组中,需要进行变换成506×14维的数据。
2)数据形状变换
读入的原始数据是1维的,需要我们将数据的形状进行变换,形成一个2维的矩阵,每行为一个数据样本(14个值),每个数据样本包含13个X(影响房价的特征)和一个Y(该类型房屋的均价)。
利用Numpy库的reshape()
函数进行。reshape()是数组对象中的方法,用于改变数组的形状。
使用方法为reshape(行数,列数)
# 读入之后的数据被转化成1维array,其中array的第0-13项是第一条数据,第14-27项是第二条数据,以此类推....
# 这里对原始数据做reshape,变成N x 14的形式
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]) #shape()读取矩阵的第一维的长度为7084,//表示整数除法,7084÷14=506,即变为506行,14列的array矩阵。
# 查看数据
x = data[0]
print(</