Ability to convert Tensor to String representation
評估
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 新手友好度
- 35/100
- Issue 類型
- 功能
- 描述清晰度
- 基本清楚
- 活躍度
- 停滯
- 技術堆疊
- java
研究方向
這個 issue 包含一個使用 Session、張量型別類別以及 Shape 和 DataBuffer API 的 Tensors 實作提案,但沒有指定任何 repository 檔案或測試。先找出現有的張量與字串轉換入口,然後檢視提案以及其中缺少的長陣列折疊行為。當支援的張量型別擁有一致且經過測試的字串表示時,即表示完成。
由索引模型根據 Issue 內容生成。
描述
Per our discussion on Gitter, here is a possible implementation for converting Tensors to a String representation. It is still missing some important features, like collapsing long arrays using ellipses, but this can serve as a stepping stone. The functionality is meant to ease troubleshooting/debugging so performance should not be an issue.
import org.tensorflow.Session;
import org.tensorflow.ndarray.Shape;
import org.tensorflow.ndarray.buffer.DataBuffer;
import org.tensorflow.ndarray.buffer.DoubleDataBuffer;
import org.tensorflow.ndarray.buffer.FloatDataBuffer;
import org.tensorflow.ndarray.buffer.IntDataBuffer;
import org.tensorflow.ndarray.buffer.LongDataBuffer;
import org.tensorflow.ndarray.buffer.ShortDataBuffer;
import org.tensorflow.types.TFloat16;
import org.tensorflow.types.TFloat32;
import org.tensorflow.types.TFloat64;
import org.tensorflow.types.TInt32;
import org.tensorflow.types.TInt64;
import org.tensorflow.types.TUint8;
import java.util.StringJoiner;
public final class Tensors
{
private final Session session;
/**
* @param session the session used by all operations
*/
public Tensors(Session session)
{
this.session = session;
}
/**
* @param tensor a tensor
* @return the String representation of the tensor
*/
public String toString(TFloat64 tensor)
{
Shape shape = tensor.shape();
DoubleDataBuffer doubles = tensor.asRawTensor().data().asDoubles();
return toString(doubles, shape, 0, 0, tensor.rank()).text;
}
/**
* @param tensor a tensor
* @return the String representation of the tensor
*/
public String toString(TFloat32 tensor)
{
Shape shape = tensor.shape();
FloatDataBuffer doubles = tensor.asRawTensor().data().asFloats();
return toString(doubles, shape, 0, 0, tensor.rank()).text;
}
/**
* @param tensor a tensor
* @return the String representation of the tensor
*/
public String toString(TFloat16 tensor)
{
Shape shape = tensor.shape();
FloatDataBuffer doubles = tensor.asRawTensor().data().asFloats();
return toString(doubles, shape, 0, 0, tensor.rank()).text;
}
/**
* @param tensor a tensor
* @return the String representation of the tensor
*/
public String toString(TInt64 tensor)
{
Shape shape = tensor.shape();
LongDataBuffer doubles = tensor.asRawTensor().data().asLongs();
return toString(doubles, shape, 0, 0, tensor.rank()).text;
}
/**
* @param tensor a tensor
* @return the String representation of the tensor
*/
public String toString(TInt32 tensor)
{
Shape shape = tensor.shape();
IntDataBuffer doubles = tensor.asRawTensor().data().asInts();
return toString(doubles, shape, 0, 0, tensor.rank()).text;
}
/**
* @param tensor a tensor
* @return the String representation of the tensor
*/
public String toString(TUint8 tensor)
{
Shape shape = tensor.shape();
ShortDataBuffer doubles = tensor.asRawTensor().data().asShorts();
return toString(doubles, shape, 0, 0, tensor.rank()).text;
}
/**
* @param data the data
* @param shape the shape of the tensor
* @param index the index of the tensor element to start at
* @param dimension the current dimension
* @param rank the maximum dimension
* @return the String representation of the {@code dimension}
*/
private ToStringResponse toString(DataBuffer<?> data, Shape shape, int index, int dimension, int rank)
{
int numElements = 0;
StringJoiner joiner;
if (dimension < rank)
{
joiner = new StringJoiner(",\n", "\t".repeat(dimension) + "[\n", "\n" + "\t".repeat(dimension) + "]");
for (long i = 0, size = shape.size(rank - 1); i < size; ++i)
{
ToStringResponse response = toString(data, shape, index, dimension + 1, rank);
joiner.add(response.text);
numElements += response.numElements;
index += response.numElements;
}
}
else
{
joiner = new StringJoiner(",", "\t".repeat(dimension) + "[", "]");
for (long i = 0, size = shape.size(rank - 1); i < size; ++i)
{
joiner.add(String.valueOf(data.getObject(index)));
++numElements;
++index;
}
}
return new ToStringResponse(joiner.toString(), numElements);
}
/**
* @param text the string representation of a tensor dimension
* @param numElements the number of elements contained in {@code text}
*/
private record ToStringResponse(String text, int numElements)
{
}
}
- 主要語言
- Java
- 星號
- 927
- 分支
- 227
- PR 合併指標
- 30 天內沒有已合併 PR
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 沒有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
tensorflow/java 的其他 Issue
-
難度 2/5 1-3 小時 新手友好度 65/100
tensorflow/java#653 · 1 則留言 · 4 個 reaction ·
-
難度 5/5 一週以上 新手友好度 25/100
tensorflow/java#621 · 4 則留言 ·
-
難度 5/5 一週以上 新手友好度 25/100
tensorflow/java#617 · 3 則留言 ·
-
難度 2/5 1-3 小時 新手友好度 55/100
tensorflow/java#615 · 1 則留言 ·
-
難度 5/5 一週以上 新手友好度 25/100
tensorflow/java#614 · 1 則留言 ·
相似的 Issue
-
Mend: dependency security vulnerability
難度 2/5 1-3 小時 新手友好度 62/100
opfab/operatorfabric-core#10653 ·
維護者通常 1 天內回覆
-
GeminiUtil placeholder user turn ("Continue output. DO NOT look at this line ...") is flagged by prompt injection filters可能已有人在做 @innoprej 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 76/100
維護者通常 1 天內回覆
-
難度 1/5 1 小時以內 新手友好度 78/100
salesforce/multicloudj#667 ·
維護者通常 1 天內回覆
-
bug documentation
難度 2/5 1-3 小時 新手友好度 88/100
MetricsHub/winrm-java#202 ·
維護者通常 1 天內回覆
-
ASCN/cBioPortal Pipelines/cBioPortal
難度 2/5 1-3 小時 新手友好度 64/100
mskcc/smile-server#1990 ·