美文网首页
yolov3代码涉及到的Keras.layer.Lambda

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

作者: dc_3 | 来源:发表于2019-08-16 11:06 被阅读0次

Keras.layers.Lambda解释

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

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

Keras官网解释

Keras.layers.Lambda
使用方法:

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

  • function: 需要封装的函数。 将输入张量作为第一个参数。
  • output_shape: 预期的函数输出尺寸。可以是元组或者函数。 如果是元组,它只指定第一个维度;
  • arguments: 可选的。传递给函数function的关键字参数。

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层。具体参数解释如下:

  • function需要封装的函数:yolo_loss。将输入张量作为yolo_loss第一个参数:[*model_body.output, y_true]<=>args。类似于y=Dense(units=10)(x) 中的x。
    注意
    号的作用:

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

  • output_shape:output_shape=(1,)
  • arguments 传递给yolo_loss的关键字参数 {'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.7}
    新定义的层接受两个参数,输出一个参数即loss。
    model = Model([model_body.input, * y_true], model_loss)
    构建了以图片数据和图片标签(y_true)为输入,模型损失(model_loss)为输出(y_pred)的模型 model。

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为参数。

相关文章

网友评论

      本文标题:yolov3代码涉及到的Keras.layer.Lambda

      本文链接:https://www.haomeiwen.com/subject/flffsctx.html