TensaflowJS:错误:model.execute(dict)中提供的dict ['images']的形状必须为[-1,224,224,3],但为[400,600,1]

时间:2018-10-15 22:46:02

标签: angular typescript tensorflow tensorflow.js

我正在使用Google的mobilenet神经元网络对图像进行分类。我正在使用angular 6 + tensorflowJS构建我的图像分类器应用。

我正在尝试遵循tfjs-converter library readme提供的步骤,并且想到了以下代码:

import * as tf from '@tensorflow/tfjs';
import { FrozenModel } from '@tensorflow/tfjs';

export class NeuronalNetwork {
    private MODEL_PATH: string = 'http://localhost:4200/assets/model/tensorflowjs_model.pb';
    private WEIGHTS_PATH: string = 'http://localhost:4200/assets/model/weights_manifest.json';
    constructor(){}
    async loadModel() {
        const localModel: FrozenModel = (await tf.loadFrozenModel(this.MODEL_PATH, this.WEIGHTS_PATH));
        let image: any = document.getElementById('cat');

        let pixels =  tf.fromPixels(image, 1);
        let result = localModel.predict(pixels);

    }
    async predict(){
        let image: any = document.getElementById('cat');
        debugger;
        this.model.execute({input: tf.fromPixels(image)});
    }

}

图片HTML元素:

<img id="cat" src="http://localhost:4200/assets/images/cat.jpg"/>

当我尝试执行localModel.predict(pixels)函数时,出现以下错误:

  

未捕获(承诺):错误:model.execute(dict)中提供的dict ['images']的形状必须为[-1,224,224,3],但为[400,600,1]

我是Tensorflow和TensorflowJS技术的新手。有人知道我在做什么错吗?

4 个答案:

答案 0 :(得分:0)

该错误表明模型中定义的形状与传递给模型的输入的形状不匹配。要解决此问题,您必须重塑输入内容。

但是,由于没有整数k,例如k*224*224*3等于400*600*1,因此无法使用输入的tf.reshape。可以考虑使用tf.slice对输入图像进行切片,以便仅保留图像的必要形状。

const a = tf.randomNormal([400, 600, 3])
// a has shape [400, 600, 3]
// a cannot be reshaped into [224, 224, 3]
// a can be sliced into [224, 224, 3]
const b = a.slice([0, 0, 0], [224, 224, 3])

答案 1 :(得分:0)

遇到相同的问题,然后在Github中找到解决方案:Input appears to be wrong shape

const img = document.getElementById('myimg');
const tfImg = tf.fromPixels(img);
const smalImg = tf.image.resizeBilinear(tfImg, [368, 432]);
const resized = tf.cast(smalImg, 'float32');
const t4d = tf.tensor4d(Array.from(resized.dataSync()),[1,368,432,3])

答案 2 :(得分:0)

这个错误可能是因为模型需要一批图像而不是只有一个图像。要修复它,可以使用 expandDims 插入额外的维度。

let result = localModel.predict(tf.fromPixels(image).expandDims(0));

答案 3 :(得分:0)

在使用 MobileNet 预测图像之前,您需要以特定方式对图像进行预处理。 以下是使用 TensorFlow.js 的方法:

startup.m

现在你可以预测预处理后的图像(张量):

let image: any = document.getElementById('cat');

// resize the input image to (224, 224)
let tensor = tf.browser.fromPixels(image).resizeNearestNeighbor([224, 224]).toFloat();
// feature scale tensor image to range [-1, 1]
let offset = tf.scalar(127.5);
tensor = tensor.sub(offset).div(offset).expandDims();

您可以看到更多相关代码here