Tensorflowjs 操作数无法与形状一起广播

Tensorflowjs Operands could not be broadcast together with shapes

我在 Tensorflow 中有一个工作模型,可以很好地与 Python 配合使用。它现在是一个保存的模型并试图转换为 TensorflowJS。

转换后的模型似乎无法正常工作。尽管输入为 [1,96,192,3].

,但 TensorMap 的平均值似乎为 0 且形状为 [0]

转换完成如下....

tensorflowjs_converter --input_format=tf_saved_model ~/Projects/models/model_0 ~/Projects/modelsjs/model_0

这工作正常,而且加载似乎也正常。但是,在进行预测时,会出现错误,如有任何建议,我们将不胜感激。

<script>
    async function handleButtonClick(){

       for(var i=0; i<1;i++)
       {
           var t0 = performance.now();
           console.log("Loading - model_"+i);
           var inputTensor = tf.tensor4d(input);
           var model = await tf.loadGraphModel('/modelsjs/model_'+i+'/model.json');
           var poutput = model.predict(inputTensor);
       }
</script>

报错如下

graph_model.ts:213 Uncaught (in promise) Error: The model contains control flow or dynamic shape ops, please use executeAsync method
    at t.execute_ (graph_model.ts:213)
    at t.predict (graph_model.ts:169)
    at (index):157
    at engine.ts:156
    at t.scopedRun (engine.ts:167)
    at t.tidy (engine.ts:153)
    at Object.t.tidy (environment.ts:186)
    at handleButtonClick ((index):156)

根据上述错误,尝试使用 executeAsync 进行预测,但产生了与此问题相关的错误。

<script>
    async function handleButtonClick(){

       for(var i=0; i<1;i++)
       {
           var t0 = performance.now();
           console.log("Loading - model_"+i);
           var inputTensor = tf.tensor4d(input);
           var model = await tf.loadGraphModel('/modelsjs/model_'+i+'/model.json');
           console.log("Load model_" + i + "took " + (t1 - t0) + " milliseconds.");
           const res = await model.executeAsync(inputTensor);
       }
</script>

出现如下错误。并且似乎与 Tensormap 中的 $mean 值有关。此值为 [0]

broadcast_util.ts:81 Uncaught (in promise) Error: Operands could not be broadcast together with shapes 1,12,24,64 and 0.
    at un (broadcast_util.ts:81)
    at new kn (batchnorm_packed_gpu.ts:32)
    at t.batchNormalization (backend_webgl.ts:869)
    at Bt.engine.runKernel.$x (batchnorm.ts:344)
    at engine.ts:206
    at t.scopedRun (engine.ts:167)
    at t.runKernel (engine.ts:202)
    at $a (batchnorm.ts:343)
    at batchNorm (operation.ts:46)
    at xy (normalization_executor.ts:31)

通过深入研究开发人员工具,错误似乎从这里开始......

将 'strict' 设置为 true,模型仍会加载并且不会抛出错误。

var model = await 
        tf.loadGraphModel('/modelsjs/model_0/model.json', {onProgress:onProgressCallback, strict:true});

遗憾的是,我无法分享该模型,因为它是专有的。

型号有误

最初是一个 Keras 模型,后来转换为 Tensorflow SavedModel。将此模型转换为 Tensorflowjs 无效。

但是,将原始模型从 Keras 转换为 Tensorflowjs 是可行的。

吸取教训,不要混合太多模型!