TensorFlow2.0 Keras介绍

Keras简介

keras现在是一个非常流行的工具库,包括tensorflow已经把keras合并到了自己的主代码当中了,大家可以直接tf.keras就可以直接调用其中的工具库了。单独讲keras的原因是因为keras有他独特的应用场景如实验室、数据竞赛等小型环境中,使用keras,工程师们可以将更多时间花在设计网络模型上而不是coding上,而且keras是所有工具库当中最容易上手的工具库之一。

Keras是一个高层神经网络API,它本身就是一个上层封装的工具库,它是由纯Python编写而成并基Tensorflow、Theano、mxnet以及CNTK后端。keras非常容易上手可以说是为快速实验而生能将你的idea迅速转换为结果,适合于小型环境(实验室、数据竞赛),但在工业界由于分布式底层封装不好,所以大型项目keras并不能很好的发挥其作用。但是keras也有它独特的优点如下
1.简易和快速的原型设计
2.支持CNN与RNN,或两者结合
3.无缝CPU与GPU切换
TensorFlow2.0自带有Keras,直接可以用tf.keras调用。

keras的主要模块介绍

在这里插入图片描述

我们这里介绍几个主要的模块:

1. 目标函数Objectives

目标函数,或称损失函数,是编译一个模型必须的两个参数之一
可以通过传递预定义目标函数名字指定目标函数,也可以传递一个Theano/TensroFlow的符号函数作为目标函数,该函数对每个数据点应该只返回一个标量值,并以下列两个参数为参数:
y_true:真实的数据标签, Theano/TensorFlow张量
y_pred:预测值,与y_true相同shape的Theano/TensorFlow张量
真实的优化目标函数是在各个数据点得到的损失函数值之和的均值
可用的目标函数
mean_squared_error或mse
mean_absolute_error或mae
mean_absolute_percentage_error或mape
mean_squared_logarithmic_error或msle
squared_hinge
hinge
binary_crossentropy(亦称作对数损失, logloss)
categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如 (nb_samples, nb_classes) 的二值序列
sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度: np.expand_dims(y,-1)
kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
poisson:即 (predictions - targets * log(predictions)) 的均值
cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数

2. 优化器optimizers

优化器是编译Keras模型必要的两个参数之一,可以在调用 model.compile() 之前初始化一个优化器对象,然后传入该函数(如上所示),也可以在调用 model.compile() 时传递一个预定义优化器名。
参数 clipnorm 和 clipvalue 是所有优化器都可以使用的参数,用于对梯度进行裁剪.
2.1. SGD
keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量
lr:大于0的浮点数,学习率
momentum:大于0的浮点数,动量参数
decay:大于0的浮点数,每次更新后的学习率衰减值
nesterov:布尔值,确定是否使用Nesterov动量
2.2. RMSprop
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
除学习率可调整外,建议保持优化器的其他默认参数不变,该优化器通常是面对递归神经网络时的一个良好选择
lr:大于0的浮点数,学习率
rho:大于0的浮点数
epsilon:大于0的小浮点数,防止除0错误
2.3. Adagrad
keras.optimizers.Adagrad(lr=0.01, epsilon=1e-06)
建议保持优化器的默认参数不变
lr:大于0的浮点数,学习率
epsilon:大于0的小浮点数,防止除0错误
2.4. Adadelta
keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=1e-06)
建议保持优化器的默认参数不变
lr:大于0的浮点数,学习率
rho:大于0的浮点数
epsilon:大于0的小浮点数,防止除0错误
2.5. Adam
keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
lr:大于0的浮点数,学习率
beta_1/beta_2:浮点数, 0 epsilon:大于0的小浮点数,防止除0错误
2.6. Adamax
keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
Adamax优化器来自于Adam的论文的Section7,该方法是基于无穷范数的Adam方法的变体。
lr:大于0的浮点数,学习率
beta_1/beta_2:浮点数, 0 epsilon:大于0的小浮点数,防止除0错误
2.7. Nadam
keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004)
Nesterov Adam optimizer: Adam本质上像是带有动量项的RMSprop, Nadam就是带有Nesterov 动量的Adam RMSprop
lr:大于0的浮点数,学习率
beta_1/beta_2:浮点数, 0 epsilon:大于0的小浮点数,防止除0错误

3. 激活函数Activations

激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递 activation 参数实现。

from keras.layers.core import Activation, Dense
model.add(Dense(64))
model.add(Activation('tanh'))

等价于

model.add(Dense(64, activation='tanh'))

也可以通过传递一个逐元素运算的Theano/TensorFlow函数来作为激活函数:
也可以通过传递一个逐元素运算的Theano/TensorFlow函数来作为激活函数:

from keras import backend as K
def tanh(x):
    return K.tanh(x)
model.add(Dense(64, activation=tanh))
model.add(Activation(tanh)

3.1. 预定义激活函数
softmax:对输入数据的最后一维进行softmax,输入数据应形如 (nb_samples, nb_timesteps, nb_dims) 或 (nb_samples,nb_dims)
softplus
softsign
relu
tanh
sigmoid
hard_sigmoid
linear
3.2. 高级激活函数
对于简单的Theano/TensorFlow不能表达的复杂激活函数,如含有可学习参数的激活函数,可通过高级激活函数实现,如PReLU, LeakyReLU等

4. 回调函数Callbacks

回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的 .fit() 中,即可在给定的训练阶段调用该函数集中的函数。
虽然我们称之为回调“函数”,但事实上Keras的回调函数是一个类,回调函数只是习惯性称呼

CallbackList
keras.callbacks.CallbackList(callbacks=[], queue_length=10)

Callback

keras.callbacks.Callback()

这是回调函数的抽象类,定义新的回调函数必须继承自该类

4.1. BaseLogger
keras.callbacks.BaseLogger()
该回调函数用来对每个epoch累加 metrics 指定的监视指标的epoch平均值
该回调函数在每个Keras模型中都会被自动调用

4.2. ProgbarLogger
keras.callbacks.ProgbarLogger()
该回调函数用来将 metrics 指定的监视指标输出到标准输出上

4.3. History
keras.callbacks.History()
该回调函数在Keras模型上会被自动调用, History 对象即为 fit 方法的返回值

4.4. ModelCheckpoint
keras.callbacks.ModelCheckpoint(filepath, monitor=‘val_loss’, verbose=0, save_best_only=False, save_weights_only=False, mode=‘auto’)
该回调函数将在每个epoch后保存模型到 filepath,filepath 可以是格式化的字符串,里面的占位符将会被 epoch 值和传入 on_epoch_end 的 logs 关键字所填入
filename:字符串,保存模型的路径
monitor:需要监视的值
verbose:信息展示模式, 0或1
save_best_only:当设置为 True 时,将只保存在验证集上性能最好的模型
mode: ‘auto’, ‘min’, ‘max’之一,在 save_best_only=True 时决定性能最佳模型的评判准则,例如,当监测值为 val_acc 时,模式应为 max ,当检测值为 val_loss 时,模式应为 min 。在 auto 模式下,评价准则由被监测值的名字自动推断。
save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
4.5. EarlyStopping
keras.callbacks.EarlyStopping(monitor=‘val_loss’, patience=0, verbose=0, mode=‘auto’)
当监测值不再改善时,该回调函数将中止训练
monitor:需要监视的量
patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过 patience 个epoch后停止训练。
verbose:信息展示模式
mode: ‘auto’, ‘min’, ‘max’之一,在 min 模式下,如果检测值停止下降则中止训练。在 max 模式下,当检测值不再上升则停止训练。
4.6. RemoteMonitor

keras.callbacks.RemoteMonitor(root='http://localhost:9000')

该回调函数用于向服务器发送事件流,该回调函数需要 requests 库
root:该参数为根url,回调函数将在每个epoch后把产生的事件流发送到该地址,事件将被发往 root + ‘/publish/epoch/end/’ 。发送方法为HTTP POST,其 data 字段的数据是按JSON格式编码的事件字典。
4.7. LearningRateScheduler

keras.callbacks.LearningRateScheduler(schedule)

该回调函数是学习率调度器
schedule:函数,该函数以epoch号为参数(从0算起的整数),返回一个新学习率(浮点数)
4.8. TensorBoard
keras.callbacks.TensorBoard(log_dir=’./logs’, histogram_freq=0)
该回调函数是一个可视化的展示器
log_dir:保存日志文件的地址,该文件将被TensorBoard解析以用于可视化
histogram_freq:计算各个层激活值直方图的频率(每多少个epoch计算一次),如果设置为0则不计算。
4.9. 自定义回调函数
我们可以通过继承 keras.callbacks.Callback 编写自己的回调函数,回调函数通过类成员 self.model 访问访问,该成员是模型的一个引用。
这里是一个简单的保存每个batch的loss的回调函数:

class LossHistory(keras.callbacks.Callback):
    def on_train_begin(self, logs={}):
        self.losses = []
    def on_batch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))
 
history = LossHistory()
model.fit(X_train, Y_train, batch_size=128, nb_epoch=20, verbose=0, callbacks=[history])

5. 性能评估Metrices
性能评估模块提供了一系列用于模型性能评估的函数,这些函数在模型编译时由 metrices 关键字设置
性能评估函数类似与目标函数, 只不过该性能的评估结果将不会用于训练.
可以通过字符串来使用域定义的性能评估函数,也可以自定义一个Theano/TensorFlow函数并使用之
5.1. 可用预定义
除fbeta_score额外拥有默认参数beta=1外,其他各个性能指标的参数均为y_true和y_pred
binary_accuracy: 对二分类问题,计算在所有预测值上的平均正确率
categorical_accuracy:对多分类问题,计算在所有预测值上的平均正确率
sparse_categorical_accuracy:与 categorical_accuracy 相同,在对稀疏的目标值预测时有用
top_k_categorical_accracy: 计算top-k正确率,当预测值的前k个值中存在目标类别即认为预测正确
mean_squared_error:计算预测值与真值的均方差
mean_absolute_error:计算预测值与真值的平均绝对误差
mean_absolute_percentage_error:计算预测值与真值的平均绝对误差率
mean_squared_logarithmic_error:计算预测值与真值的平均指数误差
hinge:计算预测值与真值的hinge loss
squared_hinge:计算预测值与真值的平方hinge loss
categorical_crossentropy:计算预测值与真值的多类交叉熵(输入值为二值矩阵,而不是向量)
sparse_categorical_crossentropy:与多类交叉熵相同,适用于稀疏情况
binary_crossentropy:计算预测值与真值的交叉熵
poisson:计算预测值与真值的泊松函数值
cosine_proximity:计算预测值与真值的余弦相似性
matthews_correlation:计算预测值与真值的马氏距离
fbeta_score:计算F值,即召回率与准确率的加权调和平均,该函数在多标签分类(一个样本有多个标签)时有用,如果只使用准确率作为度量,模型只要把所有输入分类为"所有类别"就可以获得完美的准确率,为了避免这种情况,度量指标应该对错误的选择进行惩罚. F-beta分值(0到1之间)通过准确率和召回率的加权调和平均来更好的度量.当beta为1时,该指标等价于F-measure,beta<1时,模型选对正确的标签更加重要,而beta>1时,模型对选错标签有更大的惩罚.
5.2. 定制评估函数
定制的评估函数可以在模型编译时传入,该函数应该以 (y_true, y_pred) 为参数,并返回单个张量,或从 metric_name 映射到 metric_value 的字典,下面是一个示例:

import keras.backend as K
def mean_pred(y_true, y_pred):
    return K.mean(y_pred)
def false_rates(y_true, y_pred):
    false_neg = ...
    false_pos = ...
    return {
        'false_neg': false_neg,
        'false_pos': false_pos,
    }
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy', mean_pred, false_rates])

6. 初始化方法Initialization

初始化方法定义了对Keras层设置初始化权重的方法,不同的层可能使用不同的关键字来传递初始化方法,一般来说指定初始化方法的关键字是 init
6.1. 预定义初始化方法
uniform
lecun_uniform: 即有输入节点数之平方根放缩后的均匀分布初始化( LeCun 98) .
normal
identity:仅用于权值矩阵为方阵的2D层(shape[0]=shape[1] )
orthogonal:仅用于权值矩阵为方阵的2D层(shape[0]=shape[1] )
zero
glorot_normal:由扇入扇出放缩后的高斯初始化( Glorot 2010)
glorot_uniform
he_normal:由扇入放缩后的高斯初始化( He et al.,2014)
he_uniform
6.2. 自定义初始化方法
传入可调用的对象,则该对象必须包含两个参数: shape (待初始化的变量的shape)和 name (该变量的名字),该可调用对象必须返回一个(Keras)变量,例如 K.variable() 返回的就是这种变量

from keras import backend as K
import numpy as np
def my_init(shape, name=None):
    value = np.random.random(shape)
    return K.variable(value, name=name)
model.add(Dense(64, init=my_init))

7. 正则项Regularizer

正则项在优化过程中层的参数或层的激活值添加惩罚项,这些惩罚项将与损失函数一起作为网络的最终优化目标
惩罚项基于层进行惩罚,目前惩罚项的接口与层有关,但 Dense, TimeDistributedDense, MaxoutDense, Covolution1D, Covolution2D 具有共同的接口。
这些层有三个关键字参数以施加正则项:
W_regularizer :施加在权重上的正则项,为 WeightRegularizer 对象
b_regularizer :施加在偏置向量上的正则项,为 WeightRegularizer 对象
activity_regularizer :施加在输出上的正则项,为 ActivityRegularizer 对象
7.1. 预定义正则项
keras.regularizers.WeightRegularizer(l1=0., l2=0.)
keras.regularizers.ActivityRegularizer(l1=0., l2=0.)
7.2. 缩写
keras.regularizers 支持以下缩写:
l1(l=0.01): L1正则项,又称LASSO
l2(l=0.01): L2正则项,又称权重衰减或Ridge
l1l2(l1=0.01, l2=0.01): L1-L2混合正则项, 又称ElasticNet
activity_l1(l=0.01): L1激活值正则项
activity_l2(l=0.01): L2激活值正则项
activity_l1l2(l1=0.01, l2=0.01): L1+L2激活值正则项
正则项通常用于对模型的训练施加某种约束, L1正则项即L1范数约束,该约束会使被约束矩阵/向量更稀疏。 L2正则项即L2范数约束,该约束会使被约束的矩阵/向量更平滑,因为它对脉冲型的值有很大的惩罚。
**

8. 约束项Constraint

**
来自 constraints 模块的函数在优化过程中为网络的参数施加约束,惩罚项基于层进行惩罚,目前惩罚项的接口与层有关,但 Dense, TimeDistributedDense, MaxoutDense, Covolution1D, Covolution2D 具有共同的接口。
这些层通过一下关键字施加约束项:
W_constraint :对主权重矩阵进行约束
b_constraint :对偏置向量进行约束

8.1. 预定义约束项
maxnorm(m=2):最大模约束
nonneg():非负性约束
unitnorm():单位范数约束, 强制矩阵沿最后一个轴拥有单位范数

9. 预训练模型Application

Kera的应用模块Application提供了带有预训练权重的Keras模型,这些模型可以用来进行预测、特征提取和finetune,模型的预训练权重将下载到 ~/.keras/models/ 并在载入模型时自动载入
9.1. 可用的模型
应用于图像分类的模型,权重训练自ImageNet: Xception VGG16 VGG19 ResNet50 * InceptionV3
所有的这些模型(除了Xception)都兼容Theano和Tensorflow,并会自动基于 ~/.keras/keras.json 的Keras的图像维度进行自动设置。例如,如果你设置 image_dim_ordering=tf ,则加载的模型将按照TensorFlow的维度顺序来构造
应用于音乐自动标签(以Mel-spectrograms为输入):MusicTaggerCRNN
9.2. 图片分类模型的示例
利用ResNet50网络进行ImageNet分类

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np
model = ResNet50(weights='imagenet')
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x)

# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print('Predicted:', decode_predictions(preds, top=3)[0])
# Predicted: [(u'n02504013', u'Indian_elephant', 0.82658225), (u'n01871265', u'tusker', 0.1122357), 
#(u'n02504458', u'African_elephant', 0.061040461)]

利用VGG16提取特征

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np
model = VGG16(weights='imagenet', include_top=False)
img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
features = model.predict(x)

10. 常用数据集Dataset

10.1. CIFAR10 小图片分类数据集
该数据库具有50,000个32*32的彩色图片作为训练集, 10,000个图片作为测试集。图片一共有10个类别。
使用方法:

from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

返回值:两个Tuple
X_train 和 X_test 是形如( nb_samples, 3, 32, 32)的RGB三通道图像数据,数据类型是无符号8位整形( uint8)
Y_train 和 Y_test 是形如( nb_samples,)标签数据,标签的范围是0~9
10.2. CIFAR100 小图片分类数据库
该数据库具有50,000个32*32的彩色图片作为训练集, 10,000个图片作为测试集。图片一共有100个类别,每个类别有600张图片。这100个类别又分为20个大类。

from keras.datasets import cifar100
(X_train, y_train), (X_test, y_test) = cifar100.load_data(label_mode='fine')

label_mode:为‘fine’或‘coarse’之一,控制标签的精细度, ‘fine’获得的标签是100个小类的标签, ‘coarse’获得的
标签是大类的标签
10.3. IMDB影评倾向分类
本数据库含有来自IMDB的25,000条影评,被标记为正面/负面两种评价。影评已被预处理为词下标构成的序列。方便起见,单词的下标基于它在数据集中出现的频率标定,例如整数3所编码的词为数据集中第3常出现的词。这样的组织方法使得用户可以快速完成诸如“只考虑最常出现的10,000个词,但不考虑最常出现的20个词”这样的操作
按照惯例, 0不代表任何特定的词,而用来编码任何未知单词

from keras.datasets import imdb
(X_train, y_train), (X_test, y_test) = imdb.load_data(path="imdb_full.pkl",
	nb_words=None,
	skip_top=0,
	maxlen=None,
	test_split=0.1)
	seed=113,
	start_char=1,
	oov_char=2,
	index_from=3)

path:如果你在本机上已有此数据集(位于 ‘~/.keras/datasets/’+path ),则载入。否则数据将下载到该目录下
nb_words:整数或None,要考虑的最常见的单词数,任何出现频率更低的单词将会被编码到0的位置。
skip_top:整数,忽略最常出现的若干单词,这些单词将会被编码为0
maxlen:整数,最大序列长度,任何长度大于此值的序列将被截断
seed:整数,用于数据重排的随机数种子
start_char:字符,序列的起始将以该字符标记,默认为1因为0通常用作padding
oov_char:字符,因 nb_words 或 skip_top 限制而cut掉的单词将被该字符代替
index_from:整数,真实的单词(而不是类似于 start_char 的特殊占位符)将从这个下标开始
返回值:两个Tuple,其中
X_train和X_test:序列的列表,每个序列都是词下标的列表。如果指定了 nb_words ,则序列中可能的最大下标为 nb_words-1 。如果指定了 maxlen ,则序列的最大可能长度为 maxlen
y_train和y_test:为序列的标签,是一个二值list
10.4. 路透社新闻主题分类
本数据库包含来自路透社的11,228条新闻,分为了46个主题。与IMDB库一样,每条新闻被编码为一个词下标的序列。

from keras.datasets import reuters
(X_train, y_train), (X_test, y_test) = reuters.load_data(path="reuters.pkl",
	nb_words=None,
	skip_top=0,
	maxlen=None,
	test_split=0.2,
	seed=113,
	start_char=1,
	oov_char=2,
	index_from=3)

test_split:用于指定从原数据中分割出作为测试集的比例。
10.5. MNIST手写数字识别
本数据库有60,000个用于训练的28*28的灰度手写数字图片, 10,000个测试图片
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

11. 可视化Visualization

11.1. 模型可视化
keras.utils.visualize_util 模块提供了画出Keras模型的函数(利用graphviz),该函数将画出模型结构图,并保存成图片:
from keras.utils.visualize_util import plot
plot(model, to_file=‘model.png’)
plot 接收两个可选参数:
show_shapes :指定是否显示输出数据的形状,默认为 False
show_layer_names :指定是否显示层名称,默认为 True
依赖 pydot-ng 和 graphviz,命令行输入 pip

你可能感兴趣的:(tensorflow,学习,TensorFlow,Keras)