Ability to convert Tensor to String representation
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Java
- Estrellas
- 928
- Forks
- 227
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
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)
{
}
}
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
El issue contiene una implementación propuesta de Tensors que utiliza Session, clases de tipos de tensor y las APIs Shape y DataBuffer, pero no indica ningún archivo del repositorio ni ninguna prueba. Empieza por localizar los puntos de entrada existentes para tensores y la conversión a string; después, revisa la propuesta y el comportamiento de colapso de arrays largos que falta. El trabajo estará terminado cuando los tipos de tensor compatibles tengan una representación de string acordada y probada.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- java
- Área
- machine-learning
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100