【问题标题】:Alternative for Lambda layer in yolo3 Kerasyolo3 Keras 中 Lambda 层的替代方案
【发布时间】:2019-12-08 07:33:16
【问题描述】:

我的目标

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

我做了什么

我已经编写(从在线示例中获取帮助)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().

这里"Unknown layer: Lambda" in tensorflowjs on browser也问了类似的问题,讲的是写一个自定义层,例子还不够,最终导致死胡同。

我想要什么

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

p.s:我花了很多时间寻找解决方案,任何帮助将不胜感激,在此先感谢


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

查看型号汇总here

现在,在模型热身过程中,出现了这个错误 热身代码

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 (XXX\node_modules\@tensorflow\tfjs-layers\dist\errors.js:68:28)
    at checkInputData (XXX\node_modules\@tensorflow\tfjs-layers\dist\engine\training.js:316:19)
    at LayersModel.predict (XXX\node_modules\@tensorflow\tfjs-layers\dist\engine\training.js:981:9)
    at ObjectDetection.warmUp (XXX\tensorflow_predownloaded_model.js:47:45)
    at XXX\tensorflow_predownloaded_model.js:38:18"

【问题讨论】:

标签: python tensorflow keras tensorflow.js yolo


【解决方案1】:

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

class Lambda extends tf.layers.Layer {
  constructor() {
    super({})
  }

  static get className() {
    return 'Lambda';
  }

}

tf.serialization.SerializationMap.register(Lambda);

;

【讨论】:

  • 谢谢!我已经添加了图层,unknown layer lambda error 现在已经消失了,但它无法弄清楚它在预测功能中的期望,我已经更新了我的问题,请你检查一次。再次感谢您
  • 我最初认为 lambda 层仅用于损失函数。但事实并非如此。损失函数是使用层yolo_loss 计算的,在该层上应用了 Lambda 层。查看错误似乎该层应该返回一个包含 4 个张量的数组。如果你可以用你的 python 和 js 代码做一个谷歌 colab,我可以很容易地查看它。为了帮助您开始,这是我为 lambda 层编写的一个 colab:colab.research.google.com/drive/…
猜你喜欢
  • 2023-04-05
  • 2015-01-21
  • 2019-09-25
  • 1970-01-01
  • 2021-10-16
  • 2012-03-17
  • 2019-10-20
  • 2023-02-26
  • 1970-01-01
相关资源
最近更新 更多