Tensorflow.js操作数不能与形状一起广播

时间:2019-09-04 06:07:03

标签: tensorflow tensorflow.js tensorflowjs-converter

我在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)

在开发人员工具中进行了一些挖掘之后,错误似乎从这里开始.....

enter image description here

将“ strict”设置为true,该模型仍会加载且不会引发错误。

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

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

1 个答案:

答案 0 :(得分:0)

模型错误。

最初是Keras模型,已转换为Tensorflow SavedModel。将此模型转换为Tensorflowjs无效。

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

经验教训,不要过多地混合模型!