为什么我得到“维度 0 的切片索引 0 越界"?Java 版 Tensorflow 中的错误? [英] Why do I get "slice index 0 of dimension 0 out of bounds" error in Tensorflow for Java?

查看:15
本文介绍了为什么我得到“维度 0 的切片索引 0 越界"?Java 版 Tensorflow 中的错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有以下签名的模型,我正在尝试使用 :

MetaGraphDef with tag-set: 'serve' 包含以下 SignatureDefs:签名定义['serving_default']:给定的 SavedModel SignatureDef 包含以下输入:输入 ['jpegbase64_bytes'] 张量信息:数据类型:DT_STRING形状:(-1)名称: 占位符:0给定的 SavedModel SignatureDef 包含以下输出:输出['预测'] 张量信息:数据类型:DT_FLOAT形状:(-1, 256)名称:模型/global_average_pooling2d/Mean:0方法名称为:tensorflow/serving/predict

我调用模型的代码如下所示:

float[] predict(byte[] imageBytes) {try (Tensor result = SavedModelBundle.load("model.pb", "serve").session().runner().feed(myinput", 0, TString.tensorOfBytes(NdArrays.scalarOfObject(imageBytes))).fetch(我的输出").跑().get(0)) {浮动[]缓冲区=新的浮动[256];FloatNdArray floatNdArray = FloatDenseNdArray.create(RawDataBufferFactory.create(buffer, false),Shape.of(1, description.getNumFeatures()));((TFloat32) 结果).copyTo(floatNdArray);返回缓冲区;}}

但是,这会引发以下错误:

 维度 0 的切片索引 0 越界.[[{{节点图/TensorArrayUnstack/strided_slice}}]]org.tensorflow.exceptions.TFInvalidArgumentException:维度 0 的切片索引 0 越界.[[{{节点图/TensorArrayUnstack/strided_slice}}]]在 org.tensorflow.internal.c_api.AbstractTF_Status.throwExceptionIfNotOK(AbstractTF_Status.java:87)在 org.tensorflow.Session.run(Session.java:691)在 org.tensorflow.Session.access$100(Session.java:72)在 org.tensorflow.Session$Runner.runHelper(Session.java:381)在 org.tensorflow.Session$Runner.run(Session.java:329)在 com.mridang.myapp.ImageModel.predict(ImageModel.java:69)............

据我所知,该模型需要一个密集类型的字符串张量,而我的不需要.我在 Stackoverflow 切片索引上找到了这个答案0 维 0 使用 Java API 越界 但这似乎与 .

我正在使用这些依赖项:

层组:'org.tensorflow',名称:'tensorflow-core-platform',版本:'0.3.1'层组:'org.tensorflow',名称:'tensorflow-framework',版本:'0.3.1'

解决方案

感谢 @jccampanero 的回答.经过一番挖掘,我在 Zoltar 库中找到了一个参考资料,展示了如何做到这一点.

https://github.com/spotify/zoltar/blob/b2c4c86f06c043aae505c533467e8a42d12da2d8/zoltar-tensorflow/src/main/java/com/spotify/zoltar/tf/TensorFlow#L6n>

我显然需要创建一个对象向量,下面的代码片段可以解决问题.

float[] predict(byte[] imageBytes) {try (Tensor result = SavedModelBundle.load("model.pb", "serve").session().runner().feed(myinput", 0, TString.tensorOfBytes(NdArrays.vectorOfObjects(imageBytes))).fetch(我的输出").跑().get(0)) {float[] buffer = new float[description.getNumFeatures()];FloatNdArray floatNdArray = FloatDenseNdArray.create(RawDataBufferFactory.create(buffer, false),Shape.of(1, description.getNumFeatures()));((TFloat32) 结果).copyTo(floatNdArray);返回缓冲区;}}

I have a model with the following signature that I'm trying to invoke using for Java:

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['jpegbase64_bytes'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['predictions'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 256)
        name: model/global_average_pooling2d/Mean:0
  Method name is: tensorflow/serving/predict

My code to invoke the model looks like this:

float[] predict(byte[] imageBytes) {
    try (Tensor result = SavedModelBundle.load("model.pb", "serve").session().runner()
            .feed("myinput", 0, TString.tensorOfBytes(NdArrays.scalarOfObject(imageBytes)))
            .fetch("myoutput")
            .run()
            .get(0)) {
        float[] buffer = new float[256];
        FloatNdArray floatNdArray = FloatDenseNdArray.create(RawDataBufferFactory.create(buffer, false),
                Shape.of(1, description.getNumFeatures()));
        ((TFloat32) result).copyTo(floatNdArray);
        return buffer;
    }
}

However, this throws the following errors:

slice index 0 of dimension 0 out of bounds.
     [[{{node map/TensorArrayUnstack/strided_slice}}]]
org.tensorflow.exceptions.TFInvalidArgumentException: slice index 0 of dimension 0 out of bounds.
     [[{{node map/TensorArrayUnstack/strided_slice}}]]
    at org.tensorflow.internal.c_api.AbstractTF_Status.throwExceptionIfNotOK(AbstractTF_Status.java:87)
    at org.tensorflow.Session.run(Session.java:691)
    at org.tensorflow.Session.access$100(Session.java:72)
    at org.tensorflow.Session$Runner.runHelper(Session.java:381)
    at org.tensorflow.Session$Runner.run(Session.java:329)
    at com.mridang.myapp.ImageModel.predict(ImageModel.java:69)
    ...
    ...
    ...
    ...

From what I've understood, the model requires a dense-type string tensor while mine isn't. I found this answer on Stackoverflow slice index 0 of dimension 0 out of bounds using Java API but that seems to relate to very old version of .

I'm using these dependencies:

layer group: 'org.tensorflow', name: 'tensorflow-core-platform', version: '0.3.1'
layer group: 'org.tensorflow', name: 'tensorflow-framework', version: '0.3.1'

解决方案

Thanks to @jccampanero answer. A bit of digging and I found a reference in the Zoltar library that showed how to do this.

https://github.com/spotify/zoltar/blob/b2c4c86f06c043aae505c533467e8a42d12da2d8/zoltar-tensorflow/src/main/java/com/spotify/zoltar/tf/TensorFlowPredictFn.java#L69

I need to create a vector of objects apparently and the following snippet did the trick.

float[] predict(byte[] imageBytes) {
    try (Tensor result = SavedModelBundle.load("model.pb", "serve").session().runner()
            .feed("myinput", 0, TString.tensorOfBytes(NdArrays.vectorOfObjects(imageBytes)))
            .fetch("myoutput")
            .run()
            .get(0)) {
        float[] buffer = new float[description.getNumFeatures()];
        FloatNdArray floatNdArray = FloatDenseNdArray.create(RawDataBufferFactory.create(buffer, false),
                Shape.of(1, description.getNumFeatures()));
        ((TFloat32) result).copyTo(floatNdArray);
        return buffer;
    }
}

这篇关于为什么我得到“维度 0 的切片索引 0 越界"?Java 版 Tensorflow 中的错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆