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 = ...
随机推荐
- Android自定义组件——四个方向滑动的菜单实现
今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...
- Qt编写activex控件在网页中运行
qt能够实现的东西非常多,还可以写activex控件直接在网页中运行.参照qtdemo下的例子即可. 方案一:可执行文件下载:https://pan.baidu.com/s/14ge9ix2Ny0x7 ...
- 【大数据系列】在windows下连接linux 下的hadoop环境进行开发
一.下载Eclipse并安装 二.下载exlipse的hadoop plugin 三.打开Map Reduce视图 Window --> Perspective --> Open pers ...
- css笔记 - transform学习笔记(二)
transform转换 CSS transform 属于2D/3D上的转换.变形效果.他不是一个动画,他就是变形.比如正方形变平行四边形,再变圆形.都是形状变成另一个形状. 但是如果配合上transi ...
- eagle学习汇总
一.原理图编辑器 1. 编辑->全局属性->可以设置全局变量,选择“文本框”,以‘>’开头代表引用全局属性的值. 2. 绘制->Frame->可绘制原理图边框,一般选择“ ...
- 子页面iframe跨域执行父页面定义的JS方法
问题需求:父页面与子页面iframe跨域嵌套,子页面要触发父页面所定义的js方法.父子页面的数据传递. 下文中会用到一些文件:父页面: parent.html嵌在父页面的子iframe页面:child ...
- Clojure学习之defmulti
1. defmulti 宏defmulti 和defmethod 经常被用在一起来定义 multimethod. 宏defmulti 的参数包括一个方法名以及一个dispatch函数,这个dispat ...
- Windows应急响应操作手册
查看表征异常 系统卡慢.宕机.CPU和内存占用高.网络拥塞或断网.磁盘空余空间无理由大幅度缩小等,根据以上表征,可以初步猜测系统面临的问题. windows 下查看系统基本信息 PS C:\Users ...
- Unity3D动作资源(AnimatinClip)优化
能做到去掉Scale曲线,降低浮点精度 using System; using UnityEngine; using System.Collections; using System.Collecti ...
- 基于spring-cloud的微服务(4)API网关zuul
API网关是微服务架构中的很重要的一个部分,内部有多个不同的服务提供给外部来使用,API网关可以对外做统一的入口,也可以在网关上做协议转换,权限控制和请求统计和限流等其他的工作 spring-clou ...