tensorflow java模型推理将获取的张量转换为字符串?

tensorflow java模型推理将获取的张量转换为字符串?,java,python,string,tensorflow,tensor,Java,Python,String,Tensorflow,Tensor,我现在使用tensorflow(python)来训练我的模型,并希望使用tensorflow(java)在线推断结果 计算图有一个返回形状[1,16]结果的操作,张量中的每个元素都是一个字符串。现在我想把结果转换成整个字符串 我创建了一个ByteBuffer,并调用Tensor.writeTo在缓冲区中写入数据。但是当我解码最终的缓冲区时,它的标题中有一些意想不到的字符,我猜最终的字节可能包含一些张量元信息 Tensor predictedTensor = result.get(0); Byte

我现在使用tensorflow(python)来训练我的模型,并希望使用tensorflow(java)在线推断结果

计算图有一个返回形状[1,16]结果的操作,张量中的每个元素都是一个字符串。现在我想把结果转换成整个字符串

我创建了一个ByteBuffer,并调用Tensor.writeTo在缓冲区中写入数据。但是当我解码最终的缓冲区时,它的标题中有一些意想不到的字符,我猜最终的字节可能包含一些张量元信息

Tensor predictedTensor = result.get(0);
ByteBuffer bb = ByteBuffer.allocate(predictedTensor.numBytes());
predictedTensor.writeTo(bb);
String predictedTokens = null;
byte[] bbArray = bb.array();
predictedTokens = new String(bbArray, "UTF-8");
结果是这样的:第一部分是一些错误的代码,最后一部分是正确的

& *  ? *  C J M X & *  ? *  C J M X hello,world!
我想可能形状为(1,16)的张量在字节中有元信息,但我不知道如何获取我需要的部分


有人知道如何在java tensorflow接口中将多维张量转换为java字符串吗

我找到了解决办法! 当训练模型时,我调用tf。对形状为(1,16)的张量进行reduce_join以得到一个标量。
在java语言中进行推理时,我只需获取标量节点,并调用tensor.byteValue()来获取tensor字节。它将返回没有标题代码的纯结果。

我找到了解决方法! 当训练模型时,我调用tf。对形状为(1,16)的张量进行reduce_join以得到一个标量。
在java语言中进行推理时,我只需获取标量节点,并调用tensor.byteValue()来获取tensor字节。它将返回没有标题代码的纯结果。

如果操作的结果具有shape
[1,16]
,则表示它正在生成16个不同的字符串,而不是一个字符串

Java中对多维字符串张量的支持是最近才添加的(),并且没有包含在TensorFlow 1.3版及之前版本的预构建二进制文件中。为此,您必须从源代码构建或等待TensorFlow 1.4版本

使用该功能,您应该能够使用如下内容解码
(1,16)
形张量:

Tensor predictedTensor = result.get(0);
byte[][][] predictedTokenBytes = predictedTensor.copyTo(new byte[1][16][]);
String[] predictedTokens = new String[16];
for (int i = 0; i < 16; ++i) {
  // This works under the assumption that the model is actually
  // producing UTF-8 strings    
  predictedTokens[i] = new String(predictedTokenBytes[0][i], "UTF-8");
}
Tensor predictedTensor=result.get(0);
字节[][]predictedTokenBytes=predictedTensor.copyTo(新字节[1][16][]);
String[]predictedTokens=新字符串[16];
对于(int i=0;i<16;++i){
//这是在假设模型实际上是
//生成UTF-8字符串
predictedTokens[i]=新字符串(predictedTokenBytes[0][i],“UTF-8”);
}

如果你真的需要一个字符串,那么是的,你可以使用
tf.reduce\u join
让模型将16个字符串组合成一个,然后提取标量。

如果操作的结果是shape
[1,16]
,那么这意味着它将生成16个不同的字符串,而不是一个字符串

Java中对多维字符串张量的支持是最近才添加的(),并且没有包含在TensorFlow 1.3版及之前版本的预构建二进制文件中。为此,您必须从源代码构建或等待TensorFlow 1.4版本

使用该功能,您应该能够使用如下内容解码
(1,16)
形张量:

Tensor predictedTensor = result.get(0);
byte[][][] predictedTokenBytes = predictedTensor.copyTo(new byte[1][16][]);
String[] predictedTokens = new String[16];
for (int i = 0; i < 16; ++i) {
  // This works under the assumption that the model is actually
  // producing UTF-8 strings    
  predictedTokens[i] = new String(predictedTokenBytes[0][i], "UTF-8");
}
Tensor predictedTensor=result.get(0);
字节[][]predictedTokenBytes=predictedTensor.copyTo(新字节[1][16][]);
String[]predictedTokens=新字符串[16];
对于(int i=0;i<16;++i){
//这是在假设模型实际上是
//生成UTF-8字符串
predictedTokens[i]=新字符串(predictedTokenBytes[0][i],“UTF-8”);
}

如果你真的需要一个字符串,那么是的,你可以使用
tf.reduce\u join
让模型将16个字符串组合成一个字符串,然后提取标量。

非常感谢!是的,我们使用的是tensorflow1.2,它不支持多维字符串张量。我们希望在它发布时升级到tensorflow1.4。更具可行性和可扩展性。:)非常感谢你!是的,我们使用的是tensorflow1.2,它不支持多维字符串张量。我们希望在它发布时升级到tensorflow1.4。更具可行性和可扩展性。:)