yolo3 Keras 中 Lambda 层的替代方法



我的目标

我想在 Tensorflow(python( 中训练一个自定义对象检测模型,并在挖掘大量示例后使用 Tensorflow js 使用它,我发现这很受欢迎

我做了什么

我已经编写了(在线示例的帮助(Tensorflow JS部分,以从本地加载模型并获得预测。我与 COCO 预训练模型一起使用它工作正常(因此不在此处添加代码(。

我的问题是什么

我对python和Tensorflow很陌生。 训练qqwweee/keras-yolo3的例子是用python编写的,它是来自Keras的Lamda

。这个地方from keras.layers import Input, Lambda

model.compile(optimizer=Adam(lr=1e-3), loss={
# use custom yolo_loss Lambda layer.
'yolo_loss': lambda y_true, y_pred: y_pred})

model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # recompile to apply the change

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])
model = Model([model_body.input, *y_true], model_loss)

所以到目前为止我所理解的,Lambda 主要用于计算损失函数,这在 TFJS 中引起了主要问题,因为直到现在还没有实现 Lambda 层,我想使用一些替代方法而不是 lambda 层。 这是我在 TFJS 中使用训练模型时遇到的错误

Error loading layer ValueError: Unknown layer: Lambda. This may be due to one of the following reasons:
1. The layer is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code.
2. The custom layer is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().

类似的问题在这里也提出了浏览器上的 tensorflowjs 中的"未知层:Lambda",它谈到了编写自定义层,示例不足以做到这一点,最终导致死胡同。

我想要什么

  1. 有没有办法使用lambda的任何其他损失函数?如何?
  2. 是否有为lambda编写自定义层的示例
  3. 我的理解哪里错了?

p.s:我花了很多时间找到解决方案,任何帮助将不胜感激,提前感谢


添加@edkeveked给出的空lambda层后(谢谢!(,错误Error loading layer ValueError: Unknown layer: Lambda消失了,但遇到了其他问题。

在此处查看模型摘要

现在,在模型预热中,它消除了此错误 预热代码

let zero = tfNode.zeros([1, 416, 416, 3]);
const result = await this.model.predict(zero)
result.map(async (t) => await t.data());
result.map(async (t) => t.dispose());

图像预测代码

batched = tfNode.tidy(() => {
if (!(img instanceof tfNode.Tensor)) {
img = tfNode.browser.fromPixels(img);
}
return img.expandDims(0);
});
result = await this.model.predict(batched);

我收到错误

"Error: Error when checking model : the Array of Tensors that you are passing to your model is not the size the the model expected. Expected to see 4 Tensor(s), but instead got 1 Tensors(s).
at new ValueError (XXXnode_modules@tensorflowtfjs-layersdisterrors.js:68:28)
at checkInputData (XXXnode_modules@tensorflowtfjs-layersdistenginetraining.js:316:19)
at LayersModel.predict (XXXnode_modules@tensorflowtfjs-layersdistenginetraining.js:981:9)
at ObjectDetection.warmUp (XXXtensorflow_predownloaded_model.js:47:45)
at XXXtensorflow_predownloaded_model.js:38:18"

由于尚不支持 Lambda 层,因此需要提供它才能进行转换。 此外,加载的层不用于训练,因此 lambda 层可以为空。(代码未尝试(

class Lambda extends tf.layers.Layer {
constructor() {
super({})
}
static get className() {
return 'Lambda';
}
}
tf.serialization.SerializationMap.register(Lambda);

;

相关内容

  • 没有找到相关文章

最新更新