python - yolo3 Keras 中 Lambda 层的替代方案

标签 python tensorflow keras tensorflow.js yolo

我的目标

我想在 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"

最佳答案

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

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

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

}

tf.serialization.SerializationMap.register(Lambda);

关于python - yolo3 Keras 中 Lambda 层的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59233377/

相关文章:

python - 使车牌图像变形为正面平行

java - 源命令不能通过 Java 工作

python - 使用 Python 线程模块跟踪/BPT 陷阱

tensorflow - 从 TensorFlow 中给定的非均匀分布中进行无放回采样

c - 如何在tensorflow C api中创建一个字符串类型的张量?

python - 使用 tensorflow 数据集的 GPU 使用率

python - 检查每列中特定值的唯一性

tensorflow - Keras 中的自注意力 GAN

python - KERAS 在 docker 容器中添加第一层时随机卡住

tensorflow - Keras:自定义损失函数,训练数据与模型不直接相关