Keras实现YOLOv3人脸检测
这里仅记录我遇到的问题,原文请参见 link.
Keras官方文档请参见 link.
keras.layers.Lambda
tf.keras.layers.Lambda(
function, output_shape=None, mask=None, arguments=None, **kwargs
)
作用是将任意函数封装为object.Layer
function
:需要封装的函数
output_shape
:输出的形状
mask
:一个与层方法具有相同签名的可调用函数,或者一个张量,不管输入是什么,都将作为输出掩码返回
arguments
:用于给function传递参数
Keras.Model
Model 模型是带有函数API的,不是线性的,它是一个可以多输入、多输出的模型,如
model = Model(inputs=a, outputs=b)
model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])
使用方法有compile
、 fit
等。
model.compile 编译
compile(optimizer, loss=None, metrics=None, loss_weights=None, sample_weight_mode=None, weighted_metrics=None, target_tensors=None)
optimizer
:优化器loss
:损失函数。与Sequential的compile的loss有所不同的是,Model的多个输出可以有多个loss,可以用过一个dict来声明:{'output_a':loss_func_1, 'output_b':loss_func_2}
metrics
:指标列表。在培训和测试期间由模型评估的度量列表。 通常metrics = [‘accuracy’]
。 要为多输出模型的不同输出指定不同的度量标准,还可以传递dict,例如metrics = {‘output_a’:‘accuracy’}
。
model.fit 训练
fit(x=None, y=None, batch_size=None, epochs=1, verbose=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, validation_freq=1)
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 轮停止训练。
verbose
: 0, 1 或 2。日志显示模式。 0 = 安静模式, 1 = 进度条, 2 = 每轮一行。
callbacks
: 一系列的 keras.callbacks.Callback 实例。一系列可以在训练时使用的回调函数。 详见 callbacks。
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, sequence_length) 的 2D 数组,以对每个样本的每个时间步施加不同的权重。 在这种情况下,你应该确保在 compile() 中指定 sample_weight_mode=“temporal”。
initial_epoch
: 整数。开始训练的轮次(有助于恢复之前的训练)。
steps_per_epoch
: 整数或 None。 在声明一个轮次完成并开始下一个轮次之前的总步数(样品批次)。 使用 TensorFlow 数据张量等输入张量进行训练时,默认值 None 等于数据集中样本的数量除以 batch 的大小,如果无法确定,则为 1。
validation_steps
: 只有在指定了 steps_per_epoch 时才有用。停止前要验证的总步数(批次样本)。
返回 一个History实例
, 其History.history
属性是连续时期的训练损失值和度量值的记录,以及验证损失值和验证度量值(如果适用)。
model.fit_generator训练
fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)
与model.fit
的不同之处在于,使用model.fit_generator训练时数据时一个批次一个批次读出来的,节省空间
generator
:一个生成器,或者一个 Sequence (keras.utils.Sequence) 对象的实例。
steps_per_epoch
:这个是我们在每个epoch中需要执行多少次生成器来生产数据,fit_generator函数没有batch_size这个参数,是通过steps_per_epoch来实现的,每次生产的数据就是一个batch,因此steps_per_epoch的值我们通过会设为(样本数/batch_size)。如果我们的generator是sequence类型,那么这个参数是可选的,默认使用len(generator) 。
evaluate 函数进行评估
evaluate(x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None, callbacks=None)
yolo loss的计算方式
xy_loss
:中心点的损失值。object_mask是y_true的第4位,即是否含有物体,含有是1,不含是0。box_loss_scale的值,与物体框的大小有关,2减去相对面积,值得范围是(1~2)。binary_crossentropy是二值交叉熵。
wh_loss
:宽高的损失值。除此之外,额外乘以系数0.5,平方K.square()。
confidence_loss
:框的损失值。两部分组成,第1部分是存在物体的损失值,第2部分是不存在物体的损失值,其中乘以忽略掩码ignore_mask,忽略预测框中IoU大于阈值的框。
class_loss
:类别损失值。
将各部分损失值的和,除以均值,累加,作为最终的图片损失值。