keras搭建深度学习模型的一些小tips
定义模型两种方法:
| 1.sequential 类仅用于层的线性堆叠,这是目前最常用的网络架构 | 2.函数式API,用于层组成的有向无环图,让你可以构建任意形式的架构 |
from keras import models |
input_tensor = layers.Input(shape=(784,)) |
训练神经网络模型:

model.summary:打印出模型的概况
model.fet_config:返回包含模型配置信息的python字典。模型也可已从他的config信息中获取。 config=model.get_config()
model=Model.from_config(config)
model=Sequential.from_config(config) model.get_layer:依据层名获取层对象
model.get_weights:返回模型权重张量的列表,类型为numpy array
model.set_weights:从numpy array里面将权重载入给模型
model.to_join:返回代表模型的JSON字符串,仅仅包含网络结构,不包含权值 from models import model_from_json
json_string=model.to_json()
model=model_from_json(json_string) model.to_yaml,```model.to_json ````类似,同样可以产生YAML字符串重构模型 from models import model_from_yaml
yaml_string = model.to_yaml()
model=model_from_yaml(yaml_string) model.save_weights(filepath)将模型的权重保存到指定的路径,文件名是HDFS5
model.load_weights(filepath,by_name=False) 从HDFS中加载权重到模型中
【1】定义问题、收集数据集
处理二分类、多分类问题小tips
(1)二分类:神经网络中间层可以使用带有relu激活的Dense堆叠,网络的最后一层是只有一个单元并使用sigmoid激活的Dense层,网络输出应该是0-1范围内的标量,
表示概率值。
(2)多分类:
处理多分类问题的标签有两种方法
- 通过分类编码对标签进行编码,然后使用categorical_crossentropy损失函数
- 将标签编码为整数,然后使用sparse_categorical_crossentropy损失函数
如果需要将数据划分到许多类别中,应该避免使用太小的中间层,以免在网络中造成信息瓶颈
回归问题
回归问题使用的损失函数与分类问题不同,回归常用的损失函数是均方误差(MSE)
回归问题使用的评估指标与分类问题不同,回归常用的回归指标是平均绝对误差(MAE)
数据少时候的小tips
如果可用的数据很少,使用K折验证可以可靠地评估模型
如果可用的训练数据很少,最好使用隐藏层较少(通常只有一两个)的小型网络,以避免严重的过拟合
【2】选择衡量成功的指标
衡量成功的指标将指引你选择损失函数,即模型要优化什么
- 对于平衡分类问题(每个类别的可能性相同):使用精度和接收者操作特征曲线下面积(ROC AUC area under the receiver operatingcharacteristic curve)
- 对于类别不平衡问题:使用准确率和召回率
- 对于排序问题或多标签分类:使用平均准确率均值
【3】确定评估方法
确定评估方法
- 留出验证集:数据量大时可以采用这种方法
- K折交叉验证:如果留出验证的样本量太少,无法保证可靠性,那么选择用这种方法
- 重复的K折验证:如何可用的数据很少,同时模型评估又需要非常准确,那么应该使用这种方法
大多数情况下,第一种方法足以满足要求
评估模型的注意事项:
(1)数据代表性:数据划分为训练集和测试集之前,应该随机打乱数据;
(2)时间箭头:如果想要根据过去预测未来,那么在划分数据前不应该随机打乱数据,因为这么做会造成时间泄露:你的模型将在未来数据上得到有效训练。
在这种情况下,你应该始终确保测试集所有数据的时间都晚于训练集数据;
(3)数据冗余:如果数据中的某些数据点出现了两次,那么打乱数据并划分成训练集和验证集会导致训练集和验证集之间的冗余,
从效果上来看,你是在部分训练数据上评估模型,这很糟糕。应该确保训练集和验证集之间没有交集。
【4】准备数据
数据预处理
(1)向量化
(2)值标准化
取值较小:大部分值都应该在0-1之间
同质性:所有特征的取值范围都应该在大致相同的范围内
将每个特征分别标准化,使其平均值为0 x -= x.mean(axis=0) 2 x -= x.std(axis=0)
将每个特征分别标准化,使其标准差为1
(3)处理缺失值
在神经网络中,将缺失值设置为0是安全的,只要0不是一个有意义的值。网络能从数据中学到0意味着缺失数据,并且会忽略这个值。
如果测试数据中可能有缺失值,而网络是在没有缺失值的数据上训练的,那么网络不可能学会忽略缺失值。
在这种情况下, 你应该人为生成一些有缺失项的训练样本;多次复制一些训练样本,然后删除测试数据中可能缺失的某些特征。
【5】开发比基准更好的模型
要记住你所做的两个假设:
- 假设输出是可以根据输入进行预测的
- 假设可用的数据保护足够多的信息,足以学习输入和输出之间的关系
如果一切顺利,你还需要选择三个关键参数来构建第一个工作模型:
- 最后一层的激活:分类的例子在最后一层使用了sigmoid,回归的例子在最后一层没有使用激活
- 损失函数:二分类使用binary_crossentropy,回归的例子使用mse
- 优化配置:大多数时候,使用rmsprop及其默认的学习率是稳妥的
关于损失函数的选择,需要注意,直接优化配置成功的指标不一定总是可行的。有时,难以将指标转化为损失函数,
要知道,损失函数需要在小批量数据时即可计算(理想情况下,只有一个数据点时,损失函数也是可以计算的),
而且还必须是可微的(否则无法用反向传播来训练网络)。例如,广泛使用的分类指标ROC AUC就不能直接被优化,
因此在分类任务中,常见的做法是优化ROC AUC的替代指标,比如交叉熵。一般来说,交叉熵越小,ROC AUC越大
| 问题类型 | 最后一层激活 | 损失函数 |
| 二分类问题 | sigmoid | binary_crossentropy |
| 多分类、单标签问题 | softmax | categorical_crossentropy |
| 多分类、多标签问题 | sigmoid | binary_crossentropy |
| 回归到任意值 | 无 | mse |
| 回归到0-1范围内的值 | sigmoid | mse或binary_crossentropy |
【6】模型正则化与调节超参数
添加正则化
(1)L1 L2正则化
| 方式一 | 方式二 |
1 #可以用keras中下面的权重正则化来代替L2正则化 |
1 from keras import regularizers |
(2)dropout正则化
训练数据 ---> layer_output *= np.random.randint(0,high=2,size=layer_output.shape)
测试数据 ---> layer_output *= 0.5
(3)尝试不同的架构:增加或减少层数
(4)尝试不同的超参数(比如每层的单元个数或优化器的学习率),以找到最佳配置
(5)反复做特征工程
keras搭建深度学习模型的一些小tips的更多相关文章
- ubuntu16.04+七彩虹GTX1060的NVIDIA驱动+Cuda8.0+cudnn5.1+tensorflow+keras搭建深度学习环境【学习笔记】【原创】
平台信息:PC:ubuntu16.04.i5.七彩虹GTX1060显卡 作者:庄泽彬(欢迎转载,请注明作者) 说明:参考了网上的一堆的资料搭建了深度学习的开发环境,下班在宿舍折腾了好几个晚上才搞定,写 ...
- 利用 TFLearn 快速搭建经典深度学习模型
利用 TFLearn 快速搭建经典深度学习模型 使用 TensorFlow 一个最大的好处是可以用各种运算符(Ops)灵活构建计算图,同时可以支持自定义运算符(见本公众号早期文章<Tenso ...
- PyTorch如何构建深度学习模型?
简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...
- 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境
基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...
- 使用Keras进行深度学习:(二)CNN讲解及实践
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 现今最主流的处理图像数据的技术当属深度神经网络了,尤其是卷积神经网 ...
- 深度学习模型调优方法(Deep Learning学习记录)
深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数.模型在训练集和测试集拟合效果.交叉验证.激活函数和优化算法的选择等. 那如何对我们自己的模型进行判断呢?——通过模型训练跑代码,我们可以 ...
- AI佳作解读系列(一)——深度学习模型训练痛点及解决方法
1 模型训练基本步骤 进入了AI领域,学习了手写字识别等几个demo后,就会发现深度学习模型训练是十分关键和有挑战性的.选定了网络结构后,深度学习训练过程基本大同小异,一般分为如下几个步骤 定义算法公 ...
- 『高性能模型』Roofline Model与深度学习模型的性能分析
转载自知乎:Roofline Model与深度学习模型的性能分析 在真实世界中,任何模型(例如 VGG / MobileNet 等)都必须依赖于具体的计算平台(例如CPU / GPU / ASIC 等 ...
- TensorFlow+Keras 02 深度学习的原理
1 神经传递的原理 人类的神经元传递及其作用: 这里有几个关键概念: 树突 - 接受信息 轴突 - 输出信息 突触 - 传递信息 将其延伸到神经元中,示意图如下: 将上图整理成数学公式,则有 y = ...
随机推荐
- 【数据库系列】MySql中的select的锁表范围
由于InnoDB预设的是Row-Level Lock,只有明确指定主键的时候MySql才会执行Row lock,否则MySql将会执行Table Lock. 1.明确指定主键则是行锁 2.明确指定主键 ...
- Android与互联网的交互方式有三种
数据下载:下载网络上的的数据,包括图片.代码文本.XML文件.JSON数据,音/视频等大文件,调用webservice. 数据上传:上传图片.文本.XML.JSON数据.音/视频文件,调用webser ...
- Android org.apache.http.*找不到
https://blog.csdn.net/u012005313/article/details/51499892 直接把 org.apache.http.legacy.jar 报拷贝出来,放到Ecl ...
- SSL延迟有多大?
http://www.ruanyifeng.com/blog/2014/09/ssl-latency.html 作者: 阮一峰 日期: 2014年9月24日 据说,Netscape公司当年设计SSL协 ...
- jenkins与SonarQube集成
一.SonarQube 我的理解是,SonarQube就是一个对代码进行分析的平台,其功能可以通过插件扩展.支持多种语言,也支持静态代码检查.发现潜在bug等. 以下是参考信息: 维基百科:https ...
- screen实战
VPS侦探在刚接触Linux时最怕的就是SSH远程登录Linux VPS编译安装程序时(比如安装lnmp)网络突然断开,或者其他情况导致不得不与远程SSH服务器链接断开,远程执行的命令也被迫停止,只能 ...
- 用ChrootDirectory限制SFTP登录的用户只能访问指定目录且不能进行ssh登录
创建不能ssh登录的用户sftpuser1,密码用于sftp登录: sudo adduser sftpuser1 --home /sftp/sftpuser1 --shell /bin/false s ...
- Android studio was unable to create a local connection in order...
以管理员身份运行cmd 输入netsh winsock reset 重启电脑
- 几种在Linux下查询外网IP的办法(转)
Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo. ...
- Hive FUNCTIONS函数
hive> SHOW FUNCTIONS; ! != % & * + - / < <= <=> <> = == > >= ^ abs ac ...