yolov3代码涉及到的Keras.layer.Lambda

2019-08-16  本文已影响0人  dc_3

Keras.layers.Lambda解释

将任意表达式封装为 Layer 对象。

如果只是想对流经该层的数据做个变换,而这个变换本身没有什么需要学习的参数,那么直接用Lambda Layer是最合适的了。

Keras官网解释

Keras.layers.Lambda
使用方法:

keras.layers.Lambda(function, output_shape=None, mask=None, arguments=None)

Keras ->yolov3代码->train.py

model_loss = Lambda(yolo_loss, output_shape=(1,), name='yolo_loss',
        arguments={'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.5})(
        [*model_body.output, *y_true])

其中yolo_loss函数原型在model.py中

yolo_loss(args, anchors, num_classes, ignore_thresh=.5, print_loss=False):
    num_layers = len(anchors)//3 # default setting
    yolo_outputs = args[:num_layers]
    y_true = args[num_layers:]
    anchor_mask = [[6,7,8], [3,4,5], [0,1,2]] if num_layers==3 else [[3,4,5], [1,2,3]]
......

yolo_loss函数的作用是利用yolo_model的output和y_true提供的真实label计算损失。不包含可训练参数,所以可包装成Lambda层。具体参数解释如下:

cc=[y_true,output]
dd=[* y_true,* output]
cc得到list,size=2,每一个元素形状不变。而dd得到list,size=6,相当于在第0个维度将数据concatenate了。
yolo_loss层接着model_body.output层计算损失。

model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred})
解释:模型compile时传递的是自定义的loss,而把loss写成一个层融合到model里面后,y_pred就是loss。自定义损失函数规定要以y_true, y_pred为参数。

上一篇 下一篇

猜你喜欢

热点阅读