自我学习与理解: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 ...
随机推荐
- flask分页功能:基于flask-sqlalchemy和jinja2
先看源码: @app.route('/movie', methods=['GET', 'POST']) @app.route('/home', methods=['GET', 'POST']) @ap ...
- Java SSLSocket
Java SSLSocket JSSE(Java Security Socket Extension)是Sun公司为了解决互联网信息安全传输提出的一个解决方案,它实现了SSL和TSL协议,包含了数据加 ...
- [转]C++中const的使用
原文链接:http://www.cnblogs.com/xudong-bupt/p/3509567.html 平时在写C++代码的时候不怎么注重const的使用,长久以来就把const的用法忘记了 写 ...
- APK 反编译以及遇到的问题
APK反编译: https://www.cnblogs.com/geeksongs/p/10864200.html 遇到的问题 https://www.jianshu.com/p/55bf5f688e ...
- 队列——Java实现
1 package struct; 2 3 interface IQueue{ 4 //入队列 5 void add(Object obj); 6 //出队列 7 Object remove(); 8 ...
- oracle 锁查询
--v$lock中 id1 在锁模式是 TX 时保存的是 实物id 的前2段SELECT * FROM (SELECT s.SID, TRUNC(id1 / power(2, 16)) rbs, bi ...
- shell 截取字符串实例教程
本节内容:shell字符串截取方法 1,去掉字符串最左边的字符 [root@jbxue ~]$ vi test.sh 1 STR="abcd" 2 STR=${STR#" ...
- 第7章 使用性能利器——Redis
在现今互联网应用中,NoSQL已经广为应用,在互联网中起到加速系统的作用.有两种NoSQL使用最为广泛,那就是Redis和MongoDB.本章将介绍Redis和Spring Boot的结合.Redis ...
- zookeeper 异常 :stat is not executed because it is not in the whitelist. Connection closed b
1 .问题 1.启动 zookeeper 后 用指令: telnet 127.0.0.1 2181 连接 提示输入指令 :stat 后报错,然后关闭连接 2.问题解决: 修改启动指令 zkServe ...
- Springboot,SSM及SSH的概念、优点、区别及缺点
Springboot的概念: 是提供的全新框架,使用来简化Spring的初始搭建和开发过程,使用了特定的方式来进行配置,让开发人员不在需要定义样板化的配置.此框架不需要配置xml,依赖于像MAVEN这 ...