@@ -503,7 +503,7 @@ namespace Tensorflow | |||||
case Tensors tensors: | case Tensors tensors: | ||||
return tensors.dtype; | return tensors.dtype; | ||||
case IEnumerable<Tensor> tensors: | case IEnumerable<Tensor> tensors: | ||||
return tensors.First().dtype; | |||||
return tensors.Where(x => x is not null).First().dtype; | |||||
case RefVariable variable: | case RefVariable variable: | ||||
return variable.dtype; | return variable.dtype; | ||||
case ResourceVariable variable: | case ResourceVariable variable: | ||||
@@ -65,7 +65,7 @@ namespace Tensorflow.Eager | |||||
{ | { | ||||
outgrad_vec = output_gradients.ToList(); | outgrad_vec = output_gradients.ToList(); | ||||
} | } | ||||
var result = tape.ComputeGradient(target_vec, sources_vec, source_tensors_that_are_targets, outgrad_vec, false); | |||||
var result = tape.ComputeGradient(target_vec, sources_vec, source_tensors_that_are_targets, outgrad_vec, true); | |||||
bool unconnected_gradients_zero = unconnected_gradients == "zero"; | bool unconnected_gradients_zero = unconnected_gradients == "zero"; | ||||
@@ -10,6 +10,11 @@ namespace Tensorflow.Eager | |||||
var str = NDArrayRender.ToString(nd); | var str = NDArrayRender.ToString(nd); | ||||
return $"tf.Tensor: shape={shape}, dtype={dtype.as_numpy_name()}, numpy={str}"; | return $"tf.Tensor: shape={shape}, dtype={dtype.as_numpy_name()}, numpy={str}"; | ||||
} | } | ||||
public string ToString(int maxLength) | |||||
{ | |||||
var nd = new NDArray(this); | |||||
var str = NDArrayRender.ToString(nd, maxLength); | |||||
return $"tf.Tensor: shape={shape}, dtype={dtype.as_numpy_name()}, numpy={str}"; | |||||
} | |||||
} | } | ||||
} | } |
@@ -29,7 +29,7 @@ namespace Tensorflow.Keras.ArgsDefinition.Rnn | |||||
[JsonProperty("unit_forget_bias")] | [JsonProperty("unit_forget_bias")] | ||||
public bool UnitForgetBias { get; set; } = true; | public bool UnitForgetBias { get; set; } = true; | ||||
[JsonProperty("implementation")] | [JsonProperty("implementation")] | ||||
public int Implementation { get; set; } = 1; | |||||
public int Implementation { get; set; } = 2; | |||||
} | } | ||||
} | } |
@@ -182,7 +182,7 @@ namespace Tensorflow.Keras.Layers | |||||
bool unit_forget_bias = true, | bool unit_forget_bias = true, | ||||
float dropout = 0f, | float dropout = 0f, | ||||
float recurrent_dropout = 0f, | float recurrent_dropout = 0f, | ||||
int implementation = 1, | |||||
int implementation = 2, | |||||
bool return_sequences = false, | bool return_sequences = false, | ||||
bool return_state = false, | bool return_state = false, | ||||
bool go_backwards = false, | bool go_backwards = false, | ||||
@@ -7,7 +7,7 @@ namespace Tensorflow.NumPy | |||||
{ | { | ||||
public class NDArrayRender | public class NDArrayRender | ||||
{ | { | ||||
public static string ToString(NDArray array) | |||||
public static string ToString(NDArray array, int maxLength = 10) | |||||
{ | { | ||||
Shape shape = array.shape; | Shape shape = array.shape; | ||||
if (shape.IsScalar) | if (shape.IsScalar) | ||||
@@ -15,12 +15,12 @@ namespace Tensorflow.NumPy | |||||
var s = new StringBuilder(); | var s = new StringBuilder(); | ||||
s.Append("array("); | s.Append("array("); | ||||
Build(s, array); | |||||
Build(s, array, maxLength); | |||||
s.Append(")"); | s.Append(")"); | ||||
return s.ToString(); | return s.ToString(); | ||||
} | } | ||||
static void Build(StringBuilder s, NDArray array) | |||||
static void Build(StringBuilder s, NDArray array, int maxLength) | |||||
{ | { | ||||
var shape = array.shape; | var shape = array.shape; | ||||
@@ -35,11 +35,11 @@ namespace Tensorflow.NumPy | |||||
var len = shape[0]; | var len = shape[0]; | ||||
s.Append("["); | s.Append("["); | ||||
if (len <= 10) | |||||
if (len <= maxLength) | |||||
{ | { | ||||
for (int i = 0; i < len; i++) | for (int i = 0; i < len; i++) | ||||
{ | { | ||||
Build(s, array[i]); | |||||
Build(s, array[i], maxLength); | |||||
if (i < len - 1) | if (i < len - 1) | ||||
{ | { | ||||
s.Append(", "); | s.Append(", "); | ||||
@@ -49,9 +49,9 @@ namespace Tensorflow.NumPy | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
for (int i = 0; i < 5; i++) | |||||
for (int i = 0; i < maxLength / 2; i++) | |||||
{ | { | ||||
Build(s, array[i]); | |||||
Build(s, array[i], maxLength); | |||||
if (i < len - 1) | if (i < len - 1) | ||||
{ | { | ||||
s.Append(", "); | s.Append(", "); | ||||
@@ -62,9 +62,9 @@ namespace Tensorflow.NumPy | |||||
s.Append(" ... "); | s.Append(" ... "); | ||||
s.AppendLine(); | s.AppendLine(); | ||||
for (int i = (int)len - 5; i < len; i++) | |||||
for (int i = (int)len - maxLength / 2; i < len; i++) | |||||
{ | { | ||||
Build(s, array[i]); | |||||
Build(s, array[i], maxLength); | |||||
if (i < len - 1) | if (i < len - 1) | ||||
{ | { | ||||
s.Append(", "); | s.Append(", "); | ||||
@@ -0,0 +1,22 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Text; | |||||
using Tensorflow.NumPy; | |||||
namespace Tensorflow.Operations.Initializers | |||||
{ | |||||
/// <summary> | |||||
/// An initializer specially used for debugging (to load weights from disk). | |||||
/// </summary> | |||||
class NpyLoadInitializer : IInitializer | |||||
{ | |||||
string _path; | |||||
public NpyLoadInitializer(string path) { _path = path; } | |||||
public string ClassName => ""; | |||||
public IDictionary<string, object> Config => new Dictionary<string, object>(); | |||||
public Tensor Apply(InitializerArgs args) | |||||
{ | |||||
return np.load(_path); | |||||
} | |||||
} | |||||
} |
@@ -111,7 +111,7 @@ https://tensorflownet.readthedocs.io</Description> | |||||
<PackageReference Include="MethodBoundaryAspect.Fody" Version="2.0.148" /> | <PackageReference Include="MethodBoundaryAspect.Fody" Version="2.0.148" /> | ||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | ||||
<PackageReference Include="OneOf" Version="3.0.223" /> | <PackageReference Include="OneOf" Version="3.0.223" /> | ||||
<PackageReference Include="Protobuf.Text" Version="0.7.0" /> | |||||
<PackageReference Include="Protobuf.Text" Version="0.7.1" /> | |||||
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> | <PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" /> | ||||
</ItemGroup> | </ItemGroup> | ||||
@@ -179,8 +179,7 @@ namespace Tensorflow.Train | |||||
// handles slot variables. | // handles slot variables. | ||||
if (!args.Overwrite || new_variable is RefVariable || new_variable is Trackable) | if (!args.Overwrite || new_variable is RefVariable || new_variable is Trackable) | ||||
{ | { | ||||
var temp = new_variable as Trackable; | |||||
var res = _track_trackable(temp, args.Name, args.Overwrite); | |||||
var res = _track_trackable(new_variable as Trackable, args.Name, args.Overwrite); | |||||
Debug.Assert(res is IVariableV1); | Debug.Assert(res is IVariableV1); | ||||
return res as IVariableV1; | return res as IVariableV1; | ||||
} | } | ||||
@@ -793,7 +793,7 @@ namespace Tensorflow.Keras.Layers | |||||
bool unit_forget_bias = true, | bool unit_forget_bias = true, | ||||
float dropout = 0f, | float dropout = 0f, | ||||
float recurrent_dropout = 0f, | float recurrent_dropout = 0f, | ||||
int implementation = 1) | |||||
int implementation = 2) | |||||
=> new LSTMCell(new LSTMCellArgs | => new LSTMCell(new LSTMCellArgs | ||||
{ | { | ||||
Units = uints, | Units = uints, | ||||
@@ -846,7 +846,7 @@ namespace Tensorflow.Keras.Layers | |||||
bool unit_forget_bias = true, | bool unit_forget_bias = true, | ||||
float dropout = 0f, | float dropout = 0f, | ||||
float recurrent_dropout = 0f, | float recurrent_dropout = 0f, | ||||
int implementation = 1, | |||||
int implementation = 2, | |||||
bool return_sequences = false, | bool return_sequences = false, | ||||
bool return_state = false, | bool return_state = false, | ||||
bool go_backwards = false, | bool go_backwards = false, | ||||
@@ -869,7 +869,8 @@ namespace Tensorflow.Keras.Layers | |||||
GoBackwards = go_backwards, | GoBackwards = go_backwards, | ||||
Stateful = stateful, | Stateful = stateful, | ||||
TimeMajor = time_major, | TimeMajor = time_major, | ||||
Unroll = unroll | |||||
Unroll = unroll, | |||||
UnitForgetBias = unit_forget_bias | |||||
}); | }); | ||||
/// <summary> | /// <summary> | ||||
@@ -1,4 +1,5 @@ | |||||
using Serilog.Core; | |||||
using Newtonsoft.Json; | |||||
using Serilog.Core; | |||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using Tensorflow.Common.Extensions; | using Tensorflow.Common.Extensions; | ||||
using Tensorflow.Common.Types; | using Tensorflow.Common.Types; | ||||
@@ -54,6 +55,7 @@ namespace Tensorflow.Keras.Layers.Rnn | |||||
public override void build(KerasShapesWrapper input_shape) | public override void build(KerasShapesWrapper input_shape) | ||||
{ | { | ||||
base.build(input_shape); | |||||
var single_shape = input_shape.ToSingleShape(); | var single_shape = input_shape.ToSingleShape(); | ||||
var input_dim = single_shape[-1]; | var input_dim = single_shape[-1]; | ||||
_kernel = add_weight("kernel", (input_dim, _args.Units * 4), | _kernel = add_weight("kernel", (input_dim, _args.Units * 4), | ||||
@@ -82,7 +84,8 @@ namespace Tensorflow.Keras.Layers.Rnn | |||||
_bias_initializer = _args.BiasInitializer; | _bias_initializer = _args.BiasInitializer; | ||||
} | } | ||||
_bias = add_weight("bias", (_args.Units * 4), | _bias = add_weight("bias", (_args.Units * 4), | ||||
initializer: _bias_initializer); | |||||
initializer: _bias_initializer | |||||
); | |||||
} | } | ||||
built = true; | built = true; | ||||
} | } | ||||
@@ -203,7 +206,7 @@ namespace Tensorflow.Keras.Layers.Rnn | |||||
x_c + math_ops.matmul(h_tm1_c, _recurrent_kernel_slice)); | x_c + math_ops.matmul(h_tm1_c, _recurrent_kernel_slice)); | ||||
_recurrent_kernel_slice = tf.slice(_recurrent_kernel_tensor, | _recurrent_kernel_slice = tf.slice(_recurrent_kernel_tensor, | ||||
new[] { 0, _args.Units * 3 }, new[] { startIndex, _args.Units }); | new[] { 0, _args.Units * 3 }, new[] { startIndex, _args.Units }); | ||||
var o = _args.RecurrentActivation.Apply( | |||||
var o = _args.Activation.Apply( | |||||
x_o + math_ops.matmul(h_tm1_o, _recurrent_kernel_slice)); | x_o + math_ops.matmul(h_tm1_o, _recurrent_kernel_slice)); | ||||
return new Tensors(c, o); | return new Tensors(c, o); | ||||
@@ -220,7 +223,7 @@ namespace Tensorflow.Keras.Layers.Rnn | |||||
Tensor z0 = z[0], z1 = z[1], z2 = z[2], z3 = z[3]; | Tensor z0 = z[0], z1 = z[1], z2 = z[2], z3 = z[3]; | ||||
var i = _args.RecurrentActivation.Apply(z0); | var i = _args.RecurrentActivation.Apply(z0); | ||||
var f = _args.RecurrentActivation.Apply(z1); | var f = _args.RecurrentActivation.Apply(z1); | ||||
var c = f * c_tm1 + i * _args.RecurrentActivation.Apply(z2); | |||||
var c = f * c_tm1 + i * _args.Activation.Apply(z2); | |||||
var o = _args.RecurrentActivation.Apply(z3); | var o = _args.RecurrentActivation.Apply(z3); | ||||
return new Tensors(c, o); | return new Tensors(c, o); | ||||
} | } | ||||
@@ -60,26 +60,23 @@ namespace Tensorflow.Keras.UnitTest.Layers | |||||
{ | { | ||||
var input = keras.Input((784)); | var input = keras.Input((784)); | ||||
var x = keras.layers.Reshape((28, 28)).Apply(input); | var x = keras.layers.Reshape((28, 28)).Apply(input); | ||||
//x = keras.layers.LSTM(50, return_sequences: true).Apply(x); | |||||
//x = keras.layers.LSTM(100, return_sequences: true).Apply(x); | |||||
//x = keras.layers.LSTM(150, return_sequences: true).Apply(x); | |||||
x = keras.layers.LSTM(4, implementation: 2).Apply(x); | |||||
//x = keras.layers.Dense(100).Apply(x); | |||||
x = keras.layers.LSTM(50, return_sequences: true).Apply(x); | |||||
x = keras.layers.LSTM(100).Apply(x); | |||||
var output = keras.layers.Dense(10, activation: "softmax").Apply(x); | var output = keras.layers.Dense(10, activation: "softmax").Apply(x); | ||||
var model = keras.Model(input, output); | var model = keras.Model(input, output); | ||||
model.summary(); | model.summary(); | ||||
model.compile(keras.optimizers.Adam(), keras.losses.SparseCategoricalCrossentropy(), new string[] { "accuracy" }); | |||||
model.compile(keras.optimizers.Adam(), keras.losses.CategoricalCrossentropy(), new string[] { "accuracy" }); | |||||
var data_loader = new MnistModelLoader(); | var data_loader = new MnistModelLoader(); | ||||
var dataset = data_loader.LoadAsync(new ModelLoadSetting | var dataset = data_loader.LoadAsync(new ModelLoadSetting | ||||
{ | { | ||||
TrainDir = "mnist", | TrainDir = "mnist", | ||||
OneHot = false, | |||||
ValidationSize = 58000, | |||||
OneHot = true, | |||||
ValidationSize = 55000, | |||||
}).Result; | }).Result; | ||||
model.fit(dataset.Train.Data, dataset.Train.Labels, batch_size: 16, epochs: 30); | |||||
model.fit(dataset.Train.Data, dataset.Train.Labels, batch_size: 16, epochs: 1); | |||||
} | } | ||||
[TestMethod] | [TestMethod] | ||||
@@ -102,7 +99,7 @@ namespace Tensorflow.Keras.UnitTest.Layers | |||||
ValidationSize = 58000, | ValidationSize = 58000, | ||||
}).Result; | }).Result; | ||||
model.fit(dataset.Train.Data, dataset.Train.Labels, batch_size: 16, epochs: 10); | |||||
model.fit(dataset.Train.Data, dataset.Train.Labels, batch_size: 16, epochs: 2); | |||||
} | } | ||||
[TestMethod] | [TestMethod] | ||||
@@ -83,8 +83,12 @@ namespace Tensorflow.CodeGen | |||||
sb.AppendLine("}"); // try | sb.AppendLine("}"); // try | ||||
sb.Append("catch(NotOkStatusException ex)\n{\n"); | |||||
sb.AppendLine("throw ex;"); | |||||
sb.Append("catch(NotOkStatusException ex1)\n{\n"); | |||||
sb.AppendLine("throw ex1;"); | |||||
sb.AppendLine("}"); // catch | |||||
sb.Append("catch(InvalidArgumentError ex2)\n{\n"); | |||||
sb.AppendLine("throw ex2;"); | |||||
sb.AppendLine("}"); // catch | sb.AppendLine("}"); // catch | ||||
sb.Append("catch(Exception)\n{\n"); | sb.Append("catch(Exception)\n{\n"); | ||||
@@ -9,7 +9,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.6.0-1.final" /> | <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.6.0-1.final" /> | ||||
<PackageReference Include="Protobuf.Text" Version="0.7.0" /> | |||||
<PackageReference Include="Protobuf.Text" Version="0.7.1" /> | |||||
</ItemGroup> | </ItemGroup> | ||||
<ItemGroup> | <ItemGroup> | ||||