loss加权_keras⾃定义loss损失函数,sample在loss上的加权和
metric详解
⾸先辨析⼀下概念:
1. loss是整体⽹络进⾏优化的⽬标, 是需要参与到优化运算,更新权值W的过程的
2. metric只是作为评价⽹络表现的⼀种“指标”, ⽐如accuracy,是为了直观地了解算法的效果,充当view的作⽤,并不参与到优化过程在keras中实现⾃定义loss, 可以有两种⽅式,⼀种⾃定义 loss function,
例如:
# ⽅式⼀
def vae_loss(x, x_decoded_mean):
xent_loss = objectives.binary_crosntropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
return xent_loss + kl_loss
或者通过⾃定义⼀个keras的层(layer)来达到⽬的, 作为model的最后⼀层,最后令pile中的loss=None:
# ⽅式⼆
# Custom loss layer
class CustomVariationalLayer(Layer):
def __init__(lf, **kwargs):society是什么意思
lf.is_placeholder = True
super(CustomVariationalLayer, lf).__init__(**kwargs)
def vae_loss(lf, x, x_decoded_mean_squash):
x = K.flatten(x)
x_decoded_mean_squash = K.flatten(x_decoded_mean_squash)
xent_loss = img_rows * img_cols * metrics.binary_crosntropy(x, x_decoded_mean_squash)
kl_loss = - 0.5 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
继续微笑an(xent_loss + kl_loss)
def call(lf, inputs):
x = inputs[0]
x_decoded_mean_squash = inputs[1]
loss = lf.vae_loss(x, x_decoded_mean_squash)
lf.add_loss(loss, inputs=inputs)
# We don"t u this output.
return x
honestlyy = CustomVariationalLayer()([x, x_decoded_mean_squash])
vae = Model(x, y)
在keras中⾃定义metric⾮常简单,需要⽤y_pred和y_true作为⾃定义metric函数的输⼊参数 点击查看metric的设置
注意事项:
1. keras中定义loss,返回的是batch_size长度的tensor, ⽽不是像tensorflow中那样是⼀个scalar
2. 为了能够将⾃定义的loss保存到model, 以及可以之后能够顺利load model, 需要把⾃定义的loss拷贝到keras.loss.py 源代码⽂件下,否则运⾏时找不到相关信息,keras会报错
有时需要不同的sample的loss施加不同的权重,这时需要⽤到sample_weight,例如
# Class weights:
# To balance the difference in occurences of digit class labels.
# 50% of labels that the discriminator trains on are "fake".
# Weight = 1 / frequency
cw1 = {0: 1, 1: 1}qq代网站刷业务平台
cw2 = {i: lf.num_class / half_batch for i in range(lf.num_class)}
cw2[lf.num_class] = 1 / half_batch
class_weights = [cw1, cw2] # 使得两种loss能够⼀样重要
补充知识:keras模型训练与保存的call_back的设置
1、模型训练
fit(x=None,
y=None,
daisyinsummer
batch_size=None,
epochs=1,
verbo=1,
callbacks=None,
validation_split=0.0,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None)
参数:
x: 训练数据的 Numpy 数组(如果模型只有⼀个输⼊), 或者是 Numpy 数组的列表(如果模型有多个输⼊)。 如果模型中的输⼊层被命名,你也可以传递⼀个字典,将输⼊层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,x 可以是
None(默认)。
y: ⽬标(标签)数据的 Numpy 数组(如果模型只有⼀个输出), 或者是 Numpy 数组的列表(如果模型有多个输出)。 如果模型中的输出层被命名,你也可以传递⼀个字典,将输出层名称映射到 Numpy 数组。 如果从本地框架张量馈送(例如 TensorFlow 数据张量)数据,y 可以是None(默认)。
batch_size: 整数或 None。每次梯度更新的样本数。如果未指定,默认为 32。
epochs: 整数。训练模型迭代轮次。⼀个轮次是在整个 x 和 y 上的⼀轮迭代。 请注意,与 initial_epoch ⼀起,epochs 被理解为 「最终轮次」。模型并不是训练了 epochs 轮,⽽是到第 epochs 轮停⽌训练。
verbo: 0, 1 或 2。⽇志显⽰模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮⼀⾏。
callbacks: ⼀系列的 keras.callbacks.Callback 实例。⼀系列可以在训练时使⽤的回调函数。
阿德雷德大学validation_split: 0 和 1 之间的浮点数。⽤作验证集的训练数据的⽐例。 模型将分出⼀部分不会被训练的验证数据,并将在每⼀轮结束时评估这些验证数据的误差和任何其他模型指标。 验证数据是混洗之前 x 和y 数据的最后⼀部分样本中。
validation_data: 元组 (x_val,y_val) 或元组 (x_val,y_val,val_sample_weights), ⽤来评估损失,以及在每轮结束时的任何模型度量指标。 模型将不会在这个数据上进⾏训练。这个参数会覆盖 validation_split。
shuffle: 布尔值(是否在每轮迭代之前混洗数据)或者 字符串 (batch)。 batch 是处理 HDF5 数据限制的特殊选项,它对⼀个 batch 内部的数据进⾏混洗。 当 steps_per_epoch ⾮ None 时,这个参数⽆效。
class_weight: 可选的字典,⽤来映射类索引(整数)到权重(浮点)值,⽤于加权损失函数(仅在训练期间)。 这可能有助于告诉模型 「更多关注」来⾃代表性不⾜的类的样本。
sample_weight: 训练样本的可选 Numpy 权重数组,⽤于对损失函数进⾏加权(仅在训练期间)。 您可以传递与输⼊样本长度相同的平坦(1D)Numpy 数组(权重和样本之间的 1:1 映射), 或者在时序数据的情况下,可以传递尺⼨为 (samples, quence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。 在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode="temporal"。
initial_epoch: 整数。开始训练的轮次(有助于恢复之前的训练)。
steps_per_epoch: 整数或 None。 在声明⼀个轮次完成并开始下⼀个轮次之前的总步数(样品批次)。 使⽤ TensorFlow 数据张量等输⼊张量进⾏训练时,默认值 None 等于数据集中样本的数量除以 batch 的⼤⼩,如果⽆法确定,则为 1。
validation_steps: 只有在指定了 steps_per_epoch 时才有⽤。停⽌前要验证的总步数(批次样本)
fit_generator(generator,
steps_per_epoch=None,
epochs=1,
verbo=1,
callbacks=None,
validation_data=None,
validation_steps=None,
class_weight=None,
max_queue_size=10,
workers=1,
u_multiprocessing=Fal,
shuffle=True,
initial_epoch=0)
使⽤ Python ⽣成器(或 Sequence 实例)逐批⽣成的数据,按批次训练模型
参数
generator: ⼀个⽣成器,或者⼀个 Sequence (keras.utils.Sequence) 对象的实例, 以在使⽤多进程时避免数据的重复。 ⽣成器的输出应该为以下之⼀:
⼀个 (inputs, targets) 元组
⼀个 (inputs, targets, sample_weights) 元组。
这个元组(⽣成器的单个输出)组成了单个的 batch。 因此,这个元组中的所有数组长度必须相同(与这⼀个 batch 的⼤⼩相等)。 不同的batch 可能⼤⼩不同。 例如,⼀个 epoch 的最后⼀个 batch 往往⽐其他 batch 要⼩, 如果数据集的尺⼨不能被 batch size 整除。 ⽣成器将⽆限地在数据集上循环。当运⾏到第 steps_per_epoch 时,记⼀个 epoch 结束。
steps_per_epoch: 在声明⼀个 epoch 完成并开始下⼀个 epoch 之前从 generator 产⽣的总步数(批次样本)。 它通常应该等于你的数据集的样本数量除以批量⼤⼩。 对于 Sequence,它是可选的:如果未指定,将使⽤len(generator) 作为步数。
epochs: 整数。训练模型的迭代总轮数。⼀个 epoch 是对所提供的整个数据的⼀轮迭代,如 steps_per_epoch 所定义。注意,与
initial_epoch ⼀起使⽤,epoch 应被理解为「最后⼀轮」。模型没有经历由 epochs 给出的多次迭代的训练,⽽仅仅是直到达到索引epoch 的轮次。
verbo: 0, 1 或 2。⽇志显⽰模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮⼀⾏。
callbacks: keras.callbacks.Callback 实例的列表。在训练时调⽤的⼀系列回调函数。
validation_data: 它可以是以下之⼀:
验证数据的⽣成器或 Sequence 实例
⼀个 (inputs, targets) 元组
⼀个 (inputs, targets, sample_weights) 元组。
在每个 epoch 结束时评估损失和任何模型指标。该模型不会对此数据进⾏训练。
validation_steps: 仅当 validation_data 是⼀个⽣成器时才可⽤。 在停⽌前 generator ⽣成的总步数(样本批数)。 对于 Sequence,它是可选的:如果未指定,将使⽤ len(generator) 作为步数。
class_weight: 可选的将类索引(整数)映射到权重(浮点)值的字典,⽤于加权损失函数(仅在训练期间)。 这可以⽤来告诉模型「更多地关注」来⾃代表性不⾜的类的样本。
max_queue_size: 整数。⽣成器队列的最⼤尺⼨。 如未指定,max_queue_size 将默认为 10。
workers: 整数。使⽤的最⼤进程数量,如果使⽤基于进程的多线程。 如未指定,workers 将默认为 1。如果为 0,将在主线程上执⾏⽣成器。
u_multiprocessing: 布尔值。如果 True,则使⽤基于进程的多线程。 如未指定, u_multiprocessi
ng 将默认为 Fal。 请注意,由于此实现依赖于多进程,所以不应将不可传递的参数传递给⽣成器,因为它们不能被轻易地传递给⼦进程。
shuffle: 是否在每轮迭代之前打乱 batch 的顺序。 只能与 Sequence (keras.utils.Sequence) 实例同⽤。
initial_epoch: 开始训练的轮次(有助于恢复之前的训练)
fit与fit_generator函数都返回⼀个History的对象,其History.history属性记录了损失函数和其他指标的数值随epoch变化的情况,如果有验证集的话,也包含了验证集的这些指标变化情况,可以写⼊⽂本后续查看
2、保存模型结构、训练出来的权重、及优化器状态
keras.callbacks.ModelCheckpoint(filepath,
monitor="val_loss",
verbo=0,kiddo
save_best_only=Fal,
buttercupsave_weights_only=Fal,
mode="auto",
period=1)
在每个训练期之后保存模型
参数:
filepath: 字符串,保存模型的路径。如 epoch1.h5 或者 epoch1.weight(save_weights_only=True)
monitor: 被监测的数据。
verbo: 详细信息模式,0 或者 1 。
save_best_only: 如果 save_best_only=True, 被监测数据的最佳模型就不会被覆盖。
mode: {auto, min, max} 的其中之⼀。 如果 save_best_only=True,那么是否覆盖保存⽂件的决定就取决于被监测数据的最⼤或者最⼩值。 对于 val_acc,模式就会是 max,⽽对于 val_loss,模式就需要是 min,等等。 在 auto 模式中,⽅向会⾃动从被监测的数据的名字中判断出来。
save_weights_only: 如果 True,那么只有模型的权重会被保存 (model.save_weights(filepath)), 否则的话,整个模型会被保存(model.save(filepath))。
为黛茜小姐开车period: 每个检查点之间的间隔(训练轮数)
例⼦:
checkpoint = ModelCheckpoint(filepath=model_weight_filepath, monitor="val_acc",
verbo=0, save_best_only=True, save_weights_only=True, mode="max", period=1)
model.fit(X_train, Y_train, callbacks=[checkpoint])
3、当验证损失不再继续降低时,如何中断训练?当监测值不再改善时中⽌训练
EarlyStopping回调函数:
keras.callbacks.EarlyStopping(
monitor="val_loss",
在线英语发音词典min_delta=0,
patience=0,
verbo=0,
mode="auto",
baline=None,
restore_best_weights=Fal)
当被监测的数量不再提升,则停⽌训练
参数:
monitor: 被监测的数据。
min_delta: 在被监测的数据中被认为是提升的最⼩变化, 例如,⼩于 min_delta 的绝对变化会被认为没有提升。