【深度学习】【PaddlePaddle】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(</
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值