“sample”“batch”“epoch”

Sample:样本,比如:一张图像是一个样本,一段音频也是一个样本。

Batch:批,含有N个样本的集合。每一个batch的样本都是独立的并行处理。在训练是,一个batch的结果只会用来更新一次模型。

Epoch:轮次,通常通常定义为 [在整个数据集上的一轮迭代],用于训练的不同的阶段,这有利于记录和定期

保存/加载Keras模型(结构+权重+优化器状态)

model.save(filepath)将Keras模型保存到单个HDF5文件中,该文件将包含:

  • 模型的结构,允许重新创建模型
  • 模型的权重
  • 训练配置项(损失函数、优化器)
  • 优化器状态,允许准确地从你上次结束的地方继续训练

keras.models.load_model(filepath)重新实例化模型,load_model还将负责使用保存的训练配置项来编译模型(除非模型从未编译过)

from keras.models import load_model

model.save('my_model.h5')  # 创建 HDF5 文件 'my_model.h5'
del model # 删除现有模型 # 返回一个编译好的模型
# 与之前那个相同
model = load_model('my_model.h5')

只保存/加载模型的结构

如果我们只需要保存模型的结构,而非其权重或训练配置项,则:

model.save_weights('my_model_weights.h5')

假如我们有用于实例化模型的代码,则可以将保存的权重加载到具有相同结构的模型中:

model.load_weights('my_model_weights.h5')

如果你需要将权重加载到不同的结构(有一些共同层)的模型中,例如微调或迁移学习,则可以按层的名字来加载权重:

model.load_weights('my_model_weights.h5', by_name=True)

例如:

"""
假设原始模型如下所示:
model = Sequential()
model.add(Dense(2, input_dim=3, name='dense_1'))
model.add(Dense(3, name='dense_2'))
...
model.save_weights(fname)
""" # 新模型
model = Sequential()
model.add(Dense(2, input_dim=3, name='dense_1')) # 将被加载
model.add(Dense(10, name='new_dense')) # 将不被加载 # 从第一个模型加载权重;只会影响第一层,dense_1
model.load_weights(fname, by_name=True)

获取中间层的输出

创建一个新的Model来输出:

from keras.models import Model

model = ...  # 创建原始模型

layer_name = 'my_layer'
intermediate_layer_model = Model(inputs=model.input,
outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)

或者构建一个Keras函数,该函数将在给定输入的情况下返回某一层的输出,例如:

from keras import backend as K

# 以 Sequential 模型为例
get_3rd_layer_output = K.function([model.layers[0].input],
[model.layers[3].output])
# 测试模式的输出
layer_output = get_3rd_layer_output([x])[0]

使用Keras处理超过内存的数据集

使用 model.train_on_batch(x,y) 和 model.test_on_batch(x,y) 进行批量训练与测试。请参阅 模型文档

或者,你可以编写一个生成批处理训练数据的生成器,然后使用 model.fit_generator(data_generator,steps_per_epoch,epochs) 方法。可以在 CIFAR10 example 中找到实践代码。

在验证集的误差不再下降时,中断训练

使用 EarlyStopping 回调:

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=2)
model.fit(x, y, validation_split=0.2, callbacks=[early_stopping])

Keras 验证集的划分

如果您将 model.fit 中的 validation_split 参数设置为 0.1,那么使用的验证数据将是最后 10% 的数据。如果设置为 0.25,就是最后 25% 的数据。注意,在提取分割验证集之前,数据不会被混洗,因此验证集仅仅是传递的输入中最后一个 x% 的样本。

所有 epoch 都使用相同的验证集(在同一个 fit 中调用)。

在训练过程中数据是否会混洗?

是的,如果 model.fit中的 shuffle参数设置为 True(默认值),则训练数据将在每个 epoch 混洗。

验证集永远不会混洗。

如何在每个 epoch 后记录训练集和验证集的误差和准确率?

model.fit 方法返回一个 History 回调,它具有包含连续误差的列表和其他度量的 history 属性。

hist = model.fit(x, y, validation_split=0.2)
print(hist.history)

如何「冻结」网络层?

「冻结」一个层意味着将其排除在训练之外,即其权重将永远不会更新。

可以将 trainable 参数(布尔值)传递给一个层的构造器,以将该层设置为不可训练的:

frozen_layer = Dense(32, trainable=False)

另外,可以在实例化之后将网络层的 trainable 属性设置为 True 或 False。为了使之生效,在修改 trainable 属性之后,需要在模型上调用 compile()。这是一个例子:

x = Input(shape=(32,))
layer = Dense(32)
layer.trainable = False
y = layer(x) frozen_model = Model(x, y)
# 在下面的模型中,训练期间不会更新层的权重
frozen_model.compile(optimizer='rmsprop', loss='mse') layer.trainable = True
trainable_model = Model(x, y)
# 使用这个模型,训练期间 `layer` 的权重将被更新
# (这也会影响上面的模型,因为它使用了同一个网络层实例)
trainable_model.compile(optimizer='rmsprop', loss='mse') frozen_model.fit(data, labels) # 这不会更新 `layer` 的权重
trainable_model.fit(data, labels) # 这会更新 `layer` 的权重

如何从 Sequential 模型中移除一个层?

你可以通过调用 .pop() 来删除 Sequential 模型中最后添加的层:

model = Sequential()
model.add(Dense(32, activation='relu', input_dim=784))
model.add(Dense(32, activation='relu')) print(len(model.layers)) # "2" model.pop()
print(len(model.layers)) # "1"

全连接网络

keras.layers.Dense(units, activation=None, use_bias=True,

      kernel_initializer='glorot_uniform', bias_initializer='zeros',

      kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,

      kernel_constraint=None, bias_constraint=None)

参数

  • units: 正整数,输出空间维度。
  • activation: 激活函数 (activations)。 若不指定,则不使用激活函数 (即,「线性」激活: a(x) = x)。
  • use_bias: 布尔值,该层是否使用偏置向量。
  • kernel_initializerkernel 权值矩阵的初始化器 (initializers)。
  • bias_initializer: 偏置向量的初始化器 (initializers).
  • kernel_regularizer: 运用到 kernel 权值矩阵的正则化函数 (regularizer)。
  • bias_regularizer: 运用到偏置向的的正则化函数 (regularizer)。
  • activity_regularizer: 运用到层的输出的正则化函数 (它的 "activation")。 (regularizer)。
  • kernel_constraint: 运用到 kernel 权值矩阵的约束函数 (constraints)。
  • bias_constraint: 运用到偏置向量的约束函数 (constraints)。

输入尺寸

n维张量,size:(batch_size, ..., input_dim),最常见的情况是一个尺寸为(batch, input_dim)的二维输入。

输出尺寸

n维张量,size:(batch_size, ..., units),例如对于尺寸为 (batch, input_dim)的二维输入,输出尺寸为(datch_size, units)

Activation

keras.layers.Activation(activation)

参数

  • activation: 要使用的激活函数的名称 (详见: activations), 或者选择一个 Theano 或 TensorFlow 操作。

输入尺寸和输出尺寸

任意尺寸。 当使用此层作为模型中的第一层时, 使用参数 input_shape (整数元组,不包括样本数的轴)。

循环网络:简单RNN、LSTM和GRU

在代码仓库的 examples 目录中,你会找到更多高级模型:基于记忆网络的问答系统、基于栈式 LSTM 的文本生成等等。

卷积层和池化层

正则化

批归一化

预定义激活函数概述

Keras实现手写数字识别

MNIST是一个由美国由美国邮政系统开发的手写数字识别数据集。手写内容是0~9,一共有60000个图片样本,我们可以到MNIST官网免费下载,总共4个文件,该文件是二进制内容。

train-images-idx3-ubyte.gz:  training set images (9912422 bytes)   图片样本,用来训练模型
train-labels-idx1-ubyte.gz:  training set labels (28881 bytes)    图片样本对应的数字标签
t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes)     测试样本
t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)      测试样本对应的数字标签

我们下载下来的文件是.gz后缀的,表明是一个压缩文件,我们设计代码的时候,需要考虑对文件进行解压。

训练数据集包含 60,000 个样本, 测试数据集包含 10,000 样本。在 MNIST 数据集中的每张图片由 28 x 28 个像素点构成, 每个像素点用一个灰度值表示。

Keras目标函数常见的一些选项

MSE:预测值和真实值指之间的均方误差

Binary cross-entropy:二分对数损失,该目标函数适合二元标签预测

$$-tlog(p)-(1-t)log(1-p)$$

Categorical cross-entropy:多元对数损失,该目标函数适合多分类预测,他也是与激活函数softmax相关联的默认选择

$$L_i=-\sum _jt_{t,j}log(p_{i,j})$$

Keras常见的性能估计指标

  • Accuracy:准确率,针对预测目标的预测正确的比例
  • Precision:查准率,衡量多分类问题中多少选择项是关联正确的
  • Recall:查全率,衡量多分类问题中多少关联正确的数据被选出来

先用model.compile(lose, optimizer, metrics)编译模型

model.compile(loss='categorical_crossentropy', optimizer=SGD(), metrics=['accuracy'])

然后用model.fit()训练模型

model.fit(X_train, Y_train, batch_size, epochs, verbpose, validation_split)

改进神经网络的方法

增加隐层

dropout

DropOut是深度学习中常用的方法,主要是为了克服过拟合的现象。全连接网络极高的VC维,使得它的记忆能力非常强,甚至把一下无关紧要的细枝末节都记住,一来使得网络的参数过多过大,二来这样训练出来的模型容易过拟合。

  DropOut:是指在在一轮训练阶段临时关闭一部分网络节点。让这些关闭的节点相当去去掉。如下图所示去掉虚线圆和虚线,原则上是去掉的神经元是随机的。

keras.layers.Dropout(rate, noise_shape=None, seed=None)

将 Dropout 应用于输入。

参数

  • rate: 在 0 和 1 之间浮动。需要丢弃的输入比例。
  • noise_shape: 1D 整数张量, 表示将与输入相乘的二进制 dropout 掩层的形状。 例如,如果你的输入尺寸为 (batch_size, timesteps, features),然后 你希望 dropout 掩层在所有时间步都是一样的, 你可以使用 noise_shape=(batch_size, 1, features)
  • seed: 一个作为随机种子的 Python 整数。

选择更好的优化器

SGD、RMSprop、Adam

增加训练轮次

优化器的学习率

增加内部隐藏神经元的数量

增加批处理的大小

采用正则化方法避免过拟合

机器学习中有3种不同类型的正则化方法

  • L1正则化(也称为 lasso):模型复杂度表示为权重的绝对值
  • L2正则化(也称为 ridge):模型复杂度表示为权重的平方和
  • 弹性网络正则化:模型复杂度通过联合前述两种技术捕捉

L1正则化惩罚项:  $Lose = {Lose}_0 + \frac{\lambda }{n}\sum_{w}|w|$

L2正则化惩罚项:  $Lose = {Lose}_0 + \frac{\lambda }{2n}\sum_{w}|w^2|$

  我们对损失方式添加了正则化惩罚项来进行改造。加上正则化惩罚项能在一定程度上避免过拟合。

  前一部分的损失函数叫做“经验风险”,经验风险就是由于拟合结果和样本标签之间的残差总和所产生的这种经验差距所带来的风险。

  后一部分的损失函数叫做“结构风险”,结构风险是因为我们希望这种描述能够简洁来保证其泛化性的良好。

  注意λλ不是指学习率,而是一个权重,也可以称为正则化系数,表示对后面这部分的“重视程度”。

举个例子,比如我们两个模型的输入权重系数为下所示,我们使用L2正则化惩罚系数,为了方便我们只计算“结构风险”

$$W_1=\begin{pmatrix}1\\ 0\\ 0\\ 0\end{pmatrix}
W_2=\begin{pmatrix}\frac{1}{4}\\ \frac{1}{4}\\ \frac{1}{4}\\ \frac{1}{4}\end{pmatrix}$$

$$\sum W_1^2=[1,0,0,0]^2=1^2+0^2+0^2+0^2=1$$

$$\sum W_2^2=[\frac{1}{4},\frac{1}{4},\frac{1}{4},\frac{1}{4}]^2={\frac{1}{4}}^2+{\frac{1}{4}}^2+{\frac{1}{4}}^2+{\frac{1}{4}}^2={\frac{1}{4}}$$

  由上可见,模型2的结构风险比模型1的小,所以模型2的损失函数小,模型2的泛化能力更强。这就是正则化的好处。

相同的正则化方案可以独立地应用于权重、模型和激活函数

model.add(Dense(64, input_dim=64, kernel_regularizer= regularizers.l2(0.01)))

超参数

超参数是指那些在机器学习算法中训练前设定的一些初始化参数,这些参数没法通过算法本身来学习。比如:$W_0$,$b_0$,还有学习率$\eta $

在搭建神经网络的时候,我们有件事情不得不做,那就是参数w、b等的初始化,业界来说,把整个网路中所有的w初始化成以0为均值、以一个很小的$\mu $为标准差的正态分布的方式会比较好。

  最常见的是以0为均值、1为方差的正态分布来随机初始化。

  还有一种常见的初始化方法是以0为均值、1为方差的正态分布生成后除以当前层的神经元个数的算术平方来获得初始化。

  如果你非要问为什么,思路大致是这样的:对于一个模型中输入权重的设置相当于一种重视程度,而一个模型中需要我们非常重视或者不怎么重视的输入一定是少数,而其他大部分输入的信息可能就比较中庸,对判断结果影响比较小的因素的信息比较多。

  说来也有意思,自然界中大部分数据的统计分布都服从高斯分布的特点。

输出预测

当模型训练好之后,就可以用于测试了。

predictions = model.predict(X)

对于给定的输入,我们可以计算几种类型的输出:

model.evaluate() :用于计算损失值

model.predict_classes() :用于计算输出类别

model.predict_proba() :用于计算类别概率

Keras 入门的更多相关文章

  1. Keras入门(四)之利用CNN模型轻松破解网站验证码

    项目简介   在之前的文章keras入门(三)搭建CNN模型破解网站验证码中,笔者介绍介绍了如何用Keras来搭建CNN模型来破解网站的验证码,其中验证码含有字母和数字.   让我们一起回顾一下那篇文 ...

  2. keras 入门整理 如何shuffle,如何使用fit_generator 整理合集

    keras入门参考网址: 中文文档教你快速建立model keras不同的模块-基本结构的简介-类似xmind整理 Keras的基本使用(1)--创建,编译,训练模型 Keras学习笔记(完结) ke ...

  3. Keras入门(二)模型的保存、读取及加载

    本文将会介绍如何利用Keras来实现模型的保存.读取以及加载.   本文使用的模型为解决IRIS数据集的多分类问题而设计的深度神经网络(DNN)模型,模型的结构示意图如下: 具体的模型参数可以参考文章 ...

  4. Keras入门(一)搭建深度神经网络(DNN)解决多分类问题

    Keras介绍   Keras是一个开源的高层神经网络API,由纯Python编写而成,其后端可以基于Tensorflow.Theano.MXNet以及CNTK.Keras 为支持快速实验而生,能够把 ...

  5. Keras入门(六)模型训练实时可视化

      在北京做某个项目的时候,客户要求能够对数据进行训练.预测,同时能导出模型,还有在页面上显示训练的进度.前面的几个要求都不难实现,但在页面上显示训练进度当时笔者并没有实现.   本文将会分享如何在K ...

  6. 数据挖掘入门系列教程(十一)之keras入门使用以及构建DNN网络识别MNIST

    简介 在上一篇博客:数据挖掘入门系列教程(十点五)之DNN介绍及公式推导中,详细的介绍了DNN,并对其进行了公式推导.本来这篇博客是准备直接介绍CNN的,但是想了一下,觉得还是使用keras构建一个D ...

  7. keras 入门之 regression

    本实验分三步: 1. 建立数据集 2. 建立网络并训练 3. 可视化 import numpy as np from keras.models import Sequential from keras ...

  8. 深度学习:Keras入门(一)之基础篇

    1.关于Keras 1)简介 Keras是由纯python编写的基于theano/tensorflow的深度学习框架. Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结 ...

  9. 深度学习:Keras入门(二)之卷积神经网络(CNN)

    说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的运算.(具体含义或者数学公式 ...

  10. keras入门(三)搭建CNN模型破解网站验证码

    项目介绍   在文章CNN大战验证码中,我们利用TensorFlow搭建了简单的CNN模型来破解某个网站的验证码.验证码如下: 在本文中,我们将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的 ...

随机推荐

  1. shell 计时获取输入

    #!/bin/bash   if read -t 5 -p "please enter your name:" name   then       echo "hello ...

  2. 【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

    布局设置说明 参数说明: Number of Simulated Users to Group 每次释放的线程数量.如果设置为0,等同于设置为线程租中的线程数量. Timeout in millise ...

  3. UVALive-3645 Objective: Berlin (最大流:时序模型)

    题目大意:有n个城市,m条航班.已知每条航班的起点和终点,还有每条航班的载客量.出发时间.到达时间.并且要求在任何一个城市(起点.终点除外)都至少要有30分钟的中转时间,求起点到终点的最大客流量. 题 ...

  4. poj 3744 概率dp 快速幂 注意排序 难度:2

    /* Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5304   Accepted: 1455 De ...

  5. linux 网络测试命令 长期更新

    一.网络测试命令 1.测试 网络连接 发送两包后停发 [oracle@hadoop ~]$ PING www.a.shifen.com (() bytes of data. bytes from tt ...

  6. ISE创建Microblaze软核(一)

    在使用FPGA时,有时会用到它做为主控芯片.对于习惯于单片机及C语言开发的人,使用FPGA做主控芯片,首先还是想到它的嵌入式软核功能.如果能够基于Microblze软核进行C语言程序的开发,相对于使用 ...

  7. 201621123005《Java程序设计》第十三次实验总结

    <Java程序设计>第十三周实验总结 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主 ...

  8. memcache+php实现页面访问的加速

    一.什么是memcache memcache是目前主流的一个高性能的分布式内存对象缓存系统:它以key-value形式在内存中存储数据.由于数据缓存在内存中,所以相比操作DB而言,它不需要解析SQL. ...

  9. 银行卡号每隔4位插入空格 (再用户填写银行卡号的时候挺有用的) IE9+

    链接 输入4为数字, 再输入一个数字调试一下就能看懂了 <head lang="en"> <meta charset="UTF-8"> ...

  10. Monkey测试练习

    1.下载Android SDK 2.打开SDK Manager.exe自动下载 3.配置环境变量 将platform-tools的路径(如: C:\001myWorkspace\eclipse(MAV ...