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为参数。
网友评论