8000 NDArrayRender · SciSharp/TensorFlow.NET@45e1365 · GitHub
[go: up one dir, main page]

Skip to content

Commit 45e1365

Browse files
committed
NDArrayRender
1 parent f5cbf89 commit 45e1365

File tree

10 files changed

+173
-259
lines changed

10 files changed

+173
-259
lines changed

src/TensorFlowNET.Core/Data/MnistModelLoader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ private NDArray ExtractLabels(string file, bool one_hot = false, int num_classes
146146

147147
bytestream.Read(buf, 0, buf.Length);
148148

149-
var labels = np.frombuffer(buf, new Shape(num_items), np.uint8);
149+
var labels = np.frombuffer(buf, new Shape(num_items), np.@byte);
150150

151151
if (one_hot)
152152
return DenseToOneHot(labels, num_classes);
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
namespace Tensorflow.Eager
1+
using Tensorflow.NumPy;
2+
3+
namespace Tensorflow.Eager
24
{
35
public partial class EagerTensor
46
{
57
public override string ToString()
6-
=> $"tf.Tensor: shape={shape}, dtype={dtype.as_numpy_name()}, numpy={tensor_util.to_numpy_string(this)}";
8+
{
9+
var nd = new NDArray(this);
10+
var str = NDArrayRender.ToString(nd);
11+
return $"tf.Tensor: shape={shape}, dtype={dtype.as_numpy_name()}, numpy={str}";
12+
}
13+
714
}
815
}

src/TensorFlowNET.Core/NumPy/NDArray.Index.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ unsafe NDArray GetArrayData(Shape newshape, int[] indices)
134134

135135
return array;
136136
}
137-
138-
NDArray GetData(int[] indices, int axis = 0)
137+
138+
unsafe NDArray GetData(int[] indices, int axis = 0)
139139
{
140140
if (shape.IsScalar)
141141
return GetScalar();
@@ -148,19 +148,17 @@ NDArray GetData(int[] indices, int axis = 0)
148148
var array = np.ndarray(dims, dtype: dtype);
149149

150150
dims[0] = 1;
151-
var bytesize = new Shape(dims).size * dtype.get_datatype_size();
151+
var len = new Shape(dims).size * dtype.get_datatype_size();
152152

153153
int dst_index = 0;
154-
foreach (var index in indices)
154+
foreach (var pos in indices)
155155
{
156-
var src_offset = (ulong)ShapeHelper.GetOffset(shape, index);
156+
var src_offset = (ulong)ShapeHelper.GetOffset(shape, pos);
157157
var dst_offset = (ulong)ShapeHelper.GetOffset(array.shape, dst_index++);
158-
unsafe
159-
{
160-
var src = (byte*)data + src_offset * dtypesize;
161-
var dst = (byte*)array.data.ToPointer() + dst_offset * dtypesize;
162-
System.Buffer.MemoryCopy(src, dst, bytesize, bytesize);
163-
}
158+
159+
var src = (byte*)data + src_offset * dtypesize;
160+
var dst = (byte*)array.data + dst_offset * dtypesize;
161+
System.Buffer.MemoryCopy(src, dst, len, len);
164162
}
165163

166164
return array;
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using System.Linq;
5+
6+
namespace Tensorflow.NumPy
7+
{
8+
public class NDArrayRender
9+
{
10+
public static string ToString(NDArray array)
11+
{
12+
Shape shape = array.shape;
13+
if (shape.IsScalar)
14+
return Render(array);
15+
16+
var s = new StringBuilder();
17+
s.Append("array(");
18+
Build(s, array);
19+
s.Append(")");
20+
return s.ToString();
21+
}
22+
23+
static void Build(StringBuilder s, NDArray array)
24+
{
25+
var shape = array.shape;
26+
27+
if (shape.Length == 1)
28+
{
29+
s.Append("[");
30+
s.Append(Render(array));
31+
s.Append("]");
32+
return;
33+
}
34+
35+
var len = shape[0];
36+
s.Append("[");
37+
38+
if (len <= 10)
39+
{
40+
for (int i = 0; i < len; i++)
41+
{
42+
Build(s, array[i]);
43+
if (i < len - 1)
44+
{
45+
s.Append(", ");
46+
s.AppendLine();
47+
}
48+
}
49+
}
50+
else
51+
{
52+
for (int i = 0; i < 5; i++)
53+
{
54+
Build(s, array[i]);
55+
if (i < len - 1)
56+
{
57+
s.Append(", ");
58+
s.AppendLine();
59+
}
60+
}
61+
62+
s.Append(" ... ");
63+
s.AppendLine();
64+
65+
for (int i = (int)len - 5; i < len; i++)
66+
{
67+
Build(s, array[i]);
68+
if (i < len - 1)
69+
{
70+
s.Append(", ");
71+
s.AppendLine();
72+
}
73+
}
74+
}
75+
76+
s.Append("]");
77+
}
78+
79+
static string Render(NDArray array)
80+
{
81+
if (array.buffer == IntPtr.Zero)
82+
return "<null>";
83+
84+
var dtype = array.dtype;
85+
var shape = array.shape;
86+
87+
if (dtype == TF_DataType.TF_STRING)
88+
{
89+
if (array.rank == 0)
90+
return "'" + string.Join(string.Empty, array.StringBytes()[0]
91+
.Take(25)
92+
.Select(x => x < 32 || x > 127 ? "\\x" + x.ToString("x") : Convert.ToChar(x).ToString())) + "'";
93+
else
94+
return $"['{string.Join("', '", array.StringData().Take(25))}']";
95+
}
96+
else if (dtype == TF_DataType.TF_VARIANT)
97+
{
98+
return "<unprintable>";
99+
}
100+
else if (dtype == TF_DataType.TF_RESOURCE)
101+
{
102+
return "<unprintable>";
103+
}
104+
else
105+
{
106+
return dtype switch
107+
{
108+
TF_DataType.TF_BOOL => Render(array.ToArray<bool>(), array.shape),
109+
TF_DataType.TF_INT8 => Render(array.ToArray<sbyte>(), array.shape),
110+
TF_DataType.TF_INT32 => Render(array.ToArray<int>(), array.shape),
111+
TF_DataType.TF_INT64 => Render(array.ToArray<long>(), array.shape),
112+
TF_DataType.TF_FLOAT => Render(array.ToArray<float>(), array.shape),
113+
TF_DataType.TF_DOUBLE => Render(array.ToArray<double>(), array.shape),
114+
_ => Render(array.ToArray<byte>(), array.shape)
115+
};
116+
}
117+
}
118+
119+
static string Render<T>(T[] array, Shape shape)
120+
{
121+
if (array == null)
122+
return "<null>";
123+
124+
if (array.Length == 0)
125+
return "<empty>";
126+
127+
if (shape.IsScalar)
128+
return array[0].ToString();
129+
130+
var display = "";
131+
if (array.Length <= 10)
132+
display += string.Join(", ", array);
133+
else
134+
display += string.Join(", ", array.Take(5)) + ", ..., " + string.Join(", ", array.Skip(array.Length - 5));
135+
return display;
136+
}
137+
}
138+
}

src/TensorFlowNET.Core/Numpy/NDArray.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ public NDIterator<T> AsIterator<T>(bool autoreset = false) where T : unmanaged
4646
public byte[] ToByteArray() => BufferToArray();
4747
public static string[] AsStringArray(NDArray arr) => throw new NotImplementedException("");
4848

49-
public override string ToString() => tensor_util.to_numpy_string(this);
49+
public override string ToString() => NDArrayRender.ToString(this);
5050
}
5151
}

src/TensorFlowNET.Core/Operations/array_ops.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ public static Tensor zeros(Shape shape, TF_DataType dtype = TF_DataType.TF_FLOAT
9090
case TF_DataType.TF_FLOAT:
9191
zeros = constant(0f);
9292
break;
93+
case TF_DataType.TF_INT8:
94+
zeros = constant((byte)0);
95+
break;
9396
default:
9497
zeros = constant(0);
9598
break;

0 commit comments

Comments
 (0)
0