keras中model.compile()基本用法
Posted Paul-Huang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keras中model.compile()基本用法相关的知识,希望对你有一定的参考价值。
1. compile参数介绍
model.compile(
optimizer,
loss = None,
metrics = None,
loss_weights = None,
sample_weight_mode = None,
weighted_metrics = None,
target_tensors = None
)
optimizer
:优化器,用于控制梯度裁剪。必选项loss
:损失函数(或称目标函数、优化评分函数)。必选项metrics
:评价函数用于评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为 metrics 的参数来输入。评价函数和损失函数相似,只不过评价函数的结果不会用于训练过程中。
在使用过程中常用的就是这三个参数。
1. optimizer
- 可以先实例化一个优化器对象,然后将它传入 model.compile();
from keras import optimizers model = Sequential() model.add(Dense(64, kernel_initializer='uniform', input_shape=(10,))) model.add(Activation('softmax')) sgd = optimizers.SGD(lr=0.01, clipvalue=0.5) model.compile(optimizer=sgd,loss='mse')
- 可以通过名称来调用优化器。但是使用优化器的默认参数。
# 传入优化器名称: 默认参数将被采用 model.compile(loss='mean_squared_error', optimizer='sgd')
1.1 optimizer可用参数-SGD
SGD: 随 机 梯 度 下 降 优 化 器 \\color{blue}随机梯度下降优化器 随机梯度下降优化器。包含扩展功能的支持:
- 学习率learning rate (lr)
- 动量(momentum)优化,
- 学习率衰减(每次参数更新后)
- Nestrov 动量 (NAG) 优化。
lr
: float >= 0. 学习率。momentum
: float>= 0. 参数,用于加速 SGD 在相关方向上前进,并抑制震荡。decay
: float >= 0. 每次参数更新后学习率衰减值。nesterov
: boolean. 是否使用 Nesterov 动量。例如:
python keras.optimizers.SGD(lr=0.01, momentum=0.0, decay=0.0, nesterov=False)
1.2 optimizer可用参数-RMSprop
- RMSprop:RMSProp 优化器是AdaGrad算法的一种改进。
将
梯
度
除
以
最
近
幅
度
的
移
动
平
均
值
\\color{blue}将梯度除以最近幅度的移动平均值
将梯度除以最近幅度的移动平均值。
lr
: float >= 0. 学习率。rho
: float >= 0. RMSProp梯度平方的移动均值的衰减率.epsilon
: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。decay
: float >= 0. 每次参数更新后学习率衰减值。
例如:
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
- 这个优化器通常是训练循环神经网络 R N N 的 不 错 选 择 \\color{blue}RNN的不错选择 RNN的不错选择。参考文献
1.3 optimizer可用参数 - Adagrad
-
Adagrad 是一种具有特定参数学习率的优化器, 根 据 参 数 在 训 练 期 间 的 更 新 频 率 进 行 自 适 应 调 整 \\color{blue}根据参数在训练期间的更新频率进行自适应调整 根据参数在训练期间的更新频率进行自适应调整。参数接收的更新越多,更新越小。
lr
: float >= 0. 学习率。epsilon
: float >= 0. 模糊因子.若为 None, 默认为 K.epsilon()。decay
: float >= 0. 每次参数更新后学习率衰减值。
例如:
keras.optimizers.Adagrad(lr=0.01, epsilon=None, decay=0.0)
-
建议使用优化器的默认参数。参考文献
1.4 optimizer可用参数 - Adadelta
- Adadelta 是 Adagrad 的一个具有更强鲁棒性的的扩展版本,它是
根
据
渐
变
更
新
的
移
动
窗
口
调
整
学
习
速
率
\\color{blue}根据渐变更新的移动窗口调整学习速率
根据渐变更新的移动窗口调整学习速率。
lr
: float >= 0. 学习率,建议保留默认值。rho
: float >= 0. Adadelta梯度平方移动均值的衰减率。epsilon
: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。decay
: float >= 0. 每次参数更新后学习率衰减值。
- 详细阅读:参考文献
1.5 optimizer可用参数 - Adam/Adamax/Nadam
-
Adam参数
lr
: float >= 0. 学习率。beta_1
: float, 0 < beta < 1. 通常接近于 1。beta_2
: float, 0 < beta < 1. 通常接近于 1。epsilon
: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。decay
: float >= 0. 每次参数更新后学习率衰减值。amsgrad
: boolean. 是否应用此算法的 AMSGrad 变种,来自论文 “On the Convergence of Adam and Beyond”。
例如:其默认为:
python keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
参考:Adam - A Method for Stochastic Optimization -
Adamax参数
- Adamax 优化器,来自 Adam 论文的第七小节.它是Adam算法基于无穷范数(infinity norm)的变种。 默认参数遵循论文中提供的值。
- 参数
lr
: float >= 0. 学习率。beta_1/beta_2
: floats, 0 < beta < 1. 通常接近于 1。epsilon
: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。decay
: float >= 0. 每次参数更新后学习率衰减值。
例如:其默认为:
keras.optimizers.Adamax(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0)
-
Nadam
- Nesterov 版本 Adam 优化器。
- 正像 Adam 本质上是 RMSProp 与动量 momentum 的结合, Nadam 是采用 Nesterov momentum 版本的 Adam 优化器。
- 参数
lr
: float >= 0. 学习率。beta_1/beta_2
: floats, 0 < beta < 1. 通常接近于 1。epsilon
: float >= 0. 模糊因子. 若为 None, 默认为 K.epsilon()。
例如:其默认为:
keras.optimizers.Nadam(lr=0.002, beta_1=0.9, beta_2=0.999, epsilon=None, schedule_decay=0.004)
2. loss
损失函数的目的是
计
算
模
型
在
训
练
期
间
应
寻
求
最
小
化
的
数
量
\\color{red}计算模型在训练期间应寻求最小化的数量
计算模型在训练期间应寻求最小化的数量。loss可用参数
简写:
mse = MSE = mean_squared_error # 均方误差
mae = MAE = mean_absolute_error # 平均绝对误差
mape = MAPE = mean_absolute_percentage_error # 平均绝对百分比误差
msle = MSLE = mean_squared_logarithmic_error # 均方对数误差
kld = KLD = kullback_leibler_divergence #
cosine = cosine_proximity # 余弦值
2.1 mean_squared_error:均方误差
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
2.2 mean_absolute_error:平均绝对误差
def mean_absolute_error(y_true, y_pred):
return K.mean(K.abs(y_pred - y_true), axis=-1)
2.3 mean_absolute_percentage_error:平均绝对百分比误差
def mean_absolute_percentage_error(y_true, y_pred):
diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true),
K.epsilon(),
None))
return 100. * K.mean(diff, axis=-1)
2.4 mean_squared_logarithmic_error:均方对数误差
def mean_squared_logarithmic_error(y_true, y_pred):
first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)
return K.mean(K.square(first_log - second_log), axis=-1)
2.5 squared_hinge
def squared_hinge(y_true, y_pred):
return K.mean(K.square(K.maximum(1. - y_true * y_pred, 0.)), axis=-1)
2.6 hinge
def hinge(y_true, y_pred):
return K.mean(K.maximum(1. - y_true * y_pred, 0.), axis=-1)
2.7 categorical_hinge
def categorical_hinge(y_true, y_pred):
pos = K.sum(y_true * y_pred, axis=-1)
neg = K.max((1. - y_true) * y_pred, axis=-1)
return K.maximum(0., neg - pos + 1.)
2.8 logcosh
logcosh:预测误差的双曲余弦的对数。
def logcosh(y_true, y_pred):
'''Logarithm of the hyperbolic cosine of the prediction error.
`log(cosh(x))` is approximately equal to `(x ** 2) / 2` for small `x` and
to `abs(x) - log(2)` for large `x`. This means that 'logcosh' works mostly
like the mean squared error, but will not be so strongly affected by the
occasional wildly incorrect prediction.
# Arguments
y_true: tensor of true targets.
y_pred: tensor of predicted targets.
# Returns
Tensor with one scalar loss entry per sample.
'''
def _logcosh(x):
return x + K.softplus(-2. * x) - K.log(2.)
return K.mean(_logcosh(y_pred - y_true), axis=-1)
2.9 categorical_crossentropy
categorical_crossentropy:分类交叉熵。
def categorical_crossentropy(y_true, y_pred):
return K.categorical_crossentropy(y_true, y_pred)
2.10 sparse_categorical_crossentropy
sparse_categorical_crossentropy:稀疏的分类交叉熵。
def sparse_categorical_crossentropy(y_true, y_pred):
return K.sparse_categorical_crossentropy(y_true, y_pred)
2.11 binary_crossentropy
binary_crossentropy:二元交叉熵。
def binary_crossentropy(y_true, y_pred):
return K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
2.12 kullback_leibler_divergence
def kullback_leibler_divergence(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), 1)
y_pred = K.clip(y_pred, K.epsilon(), 1)
return K.sum(y_true * K.log(y_true / y_pred), axis=-1)
2.13 poisson
poisson:泊松。
def poisson(y_true, y_pred):
return K.mean(y_pred - y_true * K.log(y_pred + K.epsilon()), axis=-1)
2.14 cosine_proximity
cosine_proximity:余弦值。
def cosine_proximity(y_true, y_pred):
y_true = K.l2_normalize(y_true, axis=-1)
y_pred = K.l2_normalize(y_pred, axis=-1)
return -K.sum(y_true * y_pred, axis=-1)
3. Matrics
- 评价函数用于
评
估
当
前
训
练
模
型
的
性
能
\\color{blue}评估当前训练模型的性能
评估当前训练模型的性能。当模型编译后(compile),评价函数应该作为
metrics
的参数来输入。 - 评价函数和 损失函数 相似,只不过
评
价
函
数
的
结
果
不
会
用
于
训
练
过
程
中
\\color{blue}评价函数的结果不会用于训练过程中
评价函数的结果不会用于训练过程中。我们可以传递已有的评价函数名称,或者传递一个自定义的 Theano/TensorFlow 函数来使用。可用Matrics
3.1 keras内置的评价函数
- binary_accuracy
binary_accuracy(y_true, y_pred)
- categorical_accuracy
categorical_accuracy(y_true, y_pred)
- sparse_categorical_accuracy
sparse_categorical_accuracy(y_true, y_pred)
- top_k_categorical_accuracy
top_k_categorical_accuracy(y_true, y_pred, k=5)
- sparse_top_k_categorical_accuracy
sparse_top_k_categorical_accuracy(y_true, y_pred, k=5)
3.2 自定义评价函数
自定义评价函数应该在编译的时候(compile
)传递进去。该函数需要以 (y_true, y_pred)
作为输入参数,并返回一个张量作为输出结果。
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
参考:
以上是关于keras中model.compile()基本用法的主要内容,如果未能解决你的问题,请参考以下文章
model.compile() 是不是初始化 Keras(tensorflow 后端)中的所有权重和偏差?
keras model.compile(loss='目标函数 ', optimizer='adam', metrics=['accuracy'])(代码