gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:45:37 28 4
gpt4 key购买 nike

我的目标

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com