自我学习与理解: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 ...
随机推荐
- 商业爬虫学习笔记day6
一. 正则解析数据 解析百度新闻中每个新闻的title,url,检查每个新闻的源码可知道,其title和url都位于<a></a>标签中,因为里面参数的具体形式不一样,同一个正 ...
- 100个Shell脚本——【脚本3】tomcat启动脚本
[脚本3]tomcat启动脚本 一.脚本tomcatd.sh #!/bin/bash # chkconfig:2345 64 36 # description: Tomcat start/stop/r ...
- spring认证的一些核心类
SecurityContextHolder, to provide access to the SecurityContext. SecurityContext: to hold the Authen ...
- MyBatis(2):CRUD操作
编写接口 import com.shandx.pojo.User; import java.util.List; public interface UserMapper { <span clas ...
- springboot项目中集成ip2region遇到的问题及终极解决办法
1.问题回顾 按照ip2region项目的官方集成到springboot项目后,运行测试一切都ok,没有任何问题.但是当项目打成可执行的jar包后再运行,却显示找不到ip2region.db,无法找到 ...
- 【编程思想】【设计模式】【行为模式Behavioral】策略模式strategy
Python版 转自https://github.com/faif/python-patterns/blob/master/behavioral/strategy.py #!/usr/bin/env ...
- linux系统目录初识
目录 今日内容概要 内容详细 系统目录结构介绍 目录结构知识描述 今日内容概要 系统目录结构介绍 目录结构详细描述 内容详细 系统目录结构介绍 # 1.linux系统中的目录 一切从根开始 结构拥有层 ...
- Python格式处理
目录 一.CVS表格 二.xml 三.json 四.yml 五.配置文件 六.数据库 一.CVS表格 import csv villains = [ ['Doctor', 'No'], ...
- [BUUCTF]PWN——roarctf_2019_easy_pwn(详解)
roarctf_2019_easy_pwn 附件 步骤: 例行检查,64位程序,保护全开 试运行一下程序,看看大概的情况,经典的堆块的菜单 64位ida载入,改了一下各个选项的函数名,方便看程序(按N ...
- [BUUCTF]PWN——[V&N2020 公开赛]simpleHeap
[V&N2020 公开赛]simpleHeap 附件 步骤: 例行检查,64位,保护全开 根据题目可知是一道堆,直接用64位ida打开 我修改了这些函数的名称,这样方便看程序 add,我们可以 ...