自我学习与理解:keras框架下的深度学习(三)回归问题
本文主要是使用keras对其有的波士顿房价数据集做一个回归预测,其代码架构与之前一样(都只是使用多层感知机):数据的预处理、搭建网络框架、编译、循环训练以及测试训练的网络模型。其中除了数据预处理与之前归回模型略有不同,其他基本类似。但是在本文的回归预测代码中会提到一个数据集比较少时常用到的训练方法——交叉验证。
回归预测房价,也就是说选定影响房价的因素,将其量化,然后使用该数据和对应的房价价格训练神经网络,最后使用因素的量化值来预测房价的走势。
Keras中的波士顿房价数据集,其中一共只有506个样本,其中只有404个用来做训练。其他是用来做测试。每个样本有13个特征,也就是有13个房价影响因素(13个因素中有些是具体的数值也有的是给定的权重值)。所以训练数据集是:[404,13]。
1.数据的预处理
首先使用keras导入所需要使用的包以及数据集
from keras.datasets import boston_housing
(train_data,train_targets),(test_data,test_targets)=boston_housing.load_data()
然后对数据进行标准化处理,得到特征平均值为0,标准差为1的数据,这样更加有利于网络的处理及其收敛。
mean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data/=std test_data-=mean
test_data/=std
第一部分代码中的train_data.mean(axis=0)表示是求train_data中每一行的特征平均值,其std所求的也是每一行的标准差,也就是对每一组数据中的13个影响因素做标注化。(使用print(train_data.shape)可以得到训练数据的形状[404,13],上述代码中的axis=0就是指的404)
第二部分代码中,我们直接使用训练集上所得到的特征平均值和标准差来对测试集进行标准化,其原因是不能使得网络提前知道了测试集的数据。
2.搭建网络架构
model=models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(trian_data.shape[1],)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(1))
网络架构的搭建与之前文章一样,但是在最后不需要进行非线性的处理,因为改网络是需要做一个预测,所以直接输出网络得到的数值即可。
3.编译
model.compile(
optimizer='rmsprop',loss='mse',metrics=['mae'] )
编译这里采用的损失函数是mae,也就是平均绝对误差,即取预测值和真实值之间误差的平方作为网络得到的误差进行返回训练。
4.循环网络
k=4
num=len(trian_data)//k
num_epochs=60
all_list=[]
for i in range(k):
print('proccesing #',i)
val_data=trian_data[i*num:(i+1)*num]
val_target=trian_target[i*num:(i+1)*num] par_data=np.concatenate(
[trian_data[:i*num],
trian_data[(i+1)*num:]],
axis=0
)
par_target=np.concatenate(
[trian_target[:i*num],
trian_target[(i+1)*num:]],
axis=0
)
his=model.fit(par_data,par_target,epochs=num_epochs,batch_size=1,validation_data=(val_data,val_target))
history=his.history['mae']
all_list.append(history)
因为该数据集十分稀少(404个),所以为了提升网络的性能,这里使用交叉验证来加强网络性能。交叉验证,也就是把所以的训练数据分成n分,按顺序选取从其中一份做验证集,其余做测试集,直到n份数据都做过验证集为止。如下图所示:

在代码中,用k表示一共分成的份数,然后进行,其中一共需要进行k次验证,每次进行验证时都会运行num_epochs次。最后把每一次的的mae值保存在all_list的列表中,方便后面的画图。
在上述代码中,因为一个训练了k(k=4)轮,每轮60次(epochs=60),所以我们求60次的均值(一共四组数据,求均值,从4*60个数值得到60个数值),然后再使用得到的均值作图,代码如下:
ave_list=[np.mean([x[i] for x in all_list]) for i in range(num_epochs)]
plt.plot(range(1,len(ave_list)+1),ave_list)
plt.xlabel('epochs')
plt.ylabel('validation mae')
plt.show()
第一行代码是分别对4组中的数据求60个epochs的均值;剩下的代码是做mae的验证值曲线,得到的曲线如图所示:

mae越小,表示预测越准确;其余曲线,比如说是验证集的损失值曲线,只需替换 4.循环网络中的history:
#替换前
history=his.history['mae']
#替换后
history=his.history['val_mae']
之后修改y轴名称即可,关于能画什么曲线,因为在model.fit中,我们使用了训练集和验证集,所以最后得到训练集的loss和mae以及验证集的loss和mae。
5.所有代码
from keras.datasets import boston_housing
from keras import layers
from keras import models
import numpy as np
import matplotlib.pyplot as plt
(train_data,train_target),(tesr_data,test_target)=boston_housing.load_data()
print(train_data[1])
mean=np.mean(train_data)
train_data-=mean
str=np.std(train_data)
train_data/=str tesr_data-=mean
tesr_data/=str
print(train_data[1]) model=models.Sequential()
model.add(layers.Dense(32,activation='relu',input_shape=(train_data.shape[1],)))
model.add(layers.Dense(32,activation='relu'))
model.add(layers.Dense(1))
model.compile(
optimizer='rmsprop',loss='mse',metrics=['mae'] ) k=4
num=len(train_data)//k
num_epochs=60
all_list=[]
for i in range(k):
print('proccesing #',i)
val_data=train_data[i*num:(i+1)*num] #从训练集中提取出验证的数据部分
val_target=train_target[i*num:(i+1)*num] #从训练集中提取出验证的标签部分(房价) par_data=np.concatenate( #把训练数据的其他部分粘合在一起
[train_data[:i*num],
train_data[(i+1)*num:]],
axis=0
)
par_target=np.concatenate( #把训练标签的其他部分粘合在一起
[train_target[:i*num],
train_target[(i+1)*num:]],
axis=0
)
his=model.fit(par_data,par_target,epochs=num_epochs,batch_size=1,validation_data=(val_data,val_target))
history=his.history['mae']
all_list.append(history) ave_list=[np.mean([x[i] for x in all_list]) for i in range(num_epochs)]
plt.plot(range(1,len(ave_list)+1),ave_list)
plt.xlabel('epochs')
plt.ylabel('train mae')
plt.show()
目前为之所有用到的网络层次都是使用多层感知机,也就是神经网络算法,在后面的文章中会开始介绍卷积神经网络算法。
自我学习与理解:keras框架下的深度学习(三)回归问题的更多相关文章
- keras框架下的深度学习(一)手写体识别
这个系列文章主要记录使用keras框架来搭建深度学习模型的学习过程,其中有一些自己的想法和体会,主要学习的书籍是:Deep Learning with Python,使用的IDE是pycharm. 在 ...
- keras框架下的深度学习(二)二分类和多分类问题
本文第一部分是对数据处理中one-hot编码的讲解,第二部分是对二分类模型的代码讲解,其模型的建立以及训练过程与上篇文章一样:在最后我们将训练好的模型保存下来,再用自己的数据放入保存下来的模型中进行分 ...
- Keras框架下的保存模型和加载模型
在Keras框架下训练深度学习模型时,一般思路是在训练环境下训练出模型,然后拿训练好的模型(即保存模型相应信息的文件)到生产环境下去部署.在训练过程中我们可能会遇到以下情况: 需要运行很长时间的程序在 ...
- win10下搭建深度学习--总结【学习笔记】
win10 下搭建深度学习开发环境总结: 1.本人环境如下:win10,GTX1050TI.i7,anaconda3,vs2015,cuda9.0,cudnn7.1.4,tensorflow-gpu= ...
- ubuntu18.04下搭建深度学习环境anaconda2+ cuda9.0+cudnn7.0.5+tensorflow1.7【原创】【学习笔记】
PC:ubuntu18.04.i5.七彩虹GTX1060显卡.固态硬盘.机械硬盘 作者:庄泽彬(欢迎转载,请注明作者) 说明:记录在ubuntu18.04环境下搭建深度学习的环境,之前安装了cuda9 ...
- Ubuntu18.04下配置深度学习开发环境
在Ubuntu18.04下配置深度学习/机器学习开发环境 1.下载并安装Anaconda 下载地址:https://www.anaconda.com/distribution/#linux 安装步骤: ...
- 深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全
深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全 原文地址:Image Completion with Deep Learning in TensorFlow by Bra ...
- 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF
随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...
- 3.keras实现-->高级的深度学习最佳实践
一.不用Sequential模型的解决方案:keras函数式API 1.多输入模型 简单的问答模型 输入:问题 + 文本片段 输出:回答(一个词) from keras.models import M ...
随机推荐
- 为什么重写equals必须重写hashCode
目录 equals常见面试题 为什么要重写equals 重写equals不重写hashCode会存在什么问题 总结 equals常见面试题 在开始聊之前,我们先看几个常见的面试题,看看你能不能都回答上 ...
- HTTP 之 options预请求
一.HTTP一共有八种常见请求方法 get:参数在url上,浏览器长度有限制,不安全 post:参数不可见,长度不受限制 put:上传最新内容到指定位置 delete:删除请求的url所表示的资源 h ...
- android 下动态获取控件的id
有时候我们需要动态的取得一个一个控件的id,然后进行操作,经过在网上查找,找到了一下方法getResources().getIdentifier("textView01", &qu ...
- 记录一下使用MySQL的left join时,遇到的坑
# 现象 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对join.on.where等关键字 ...
- 解决CSV文件用Excel打开乱码问题
这篇文章适合有一定编码基础的人看,纯手动解决乱码问题请参见: 转码保存后,重新打开即可. 转码操作如下: 编辑器->另存为->ASCII码格式文件/UTF-8含BOM格式->保存. ...
- MyBatis(4):使用limit实现分页
用limit实现分页,首先要创建一个Maven项目,搭建好mybatis的实验环境,并且连接好数据库 代码 1,编写dao接口 UserMapper //查询全部用户实现分页 List<User ...
- 2.ElasticSearch集群的搭建
1.创建elasticsearch-cluster文件夹,在内部复制三个elasticsearch服务 2.修改elasticsearch-cluster\node*\config\elasticse ...
- 图形学之Unity渲染管线流程
Unity中的渲染管线流程 下图是<Unity Shader 入门精要>一书中的渲染流程图: ApplicationStage阶段:准备场景信息(视景体,摄像机参数).粗粒度剔除.定义每个 ...
- 【antd】如何自定义antd组件form表单中Form.Item里的内容组件
需求:现有一个form表单,但是其中一个元素比较复杂,并不是简单的输入框或者下拉框之类的.但是我又希望能通过form.validateFields().then()去获得它的值,就不需要在当前页面写大 ...
- 前置任务(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 在[前置任务列]中编辑任务关联,这是个正经的设置. 说他"正经",是因为在[手动模式]下,这个设置也是 ...