| @@ -88,7 +88,7 @@ namespace Tensorflow.Keras.Engine | |||||
| void ComputeTensorUsageCount() | void ComputeTensorUsageCount() | ||||
| { | { | ||||
| var available_tensors = inputs.Select(x => x.GetHashCode()).ToList(); | var available_tensors = inputs.Select(x => x.GetHashCode()).ToList(); | ||||
| var depth_keys = NodesByDepth.Keys.Reverse().Skip(1).ToArray(); | |||||
| var depth_keys = NodesByDepth.Keys.OrderBy(x => x).Reverse().Skip(1).ToArray(); | |||||
| foreach(var depth in depth_keys) | foreach(var depth in depth_keys) | ||||
| { | { | ||||
| foreach(var node in NodesByDepth[depth]) | foreach(var node in NodesByDepth[depth]) | ||||
| @@ -190,7 +190,7 @@ namespace Tensorflow.Keras.Engine | |||||
| } | } | ||||
| // Get sorted list of layer depths. | // Get sorted list of layer depths. | ||||
| var depth_keys = layers_by_depth.Keys.Reverse(); | |||||
| var depth_keys = layers_by_depth.Keys.OrderBy(x => x).Reverse(); | |||||
| // Set self.layers ordered by depth. | // Set self.layers ordered by depth. | ||||
| var layers = new List<Layer>(); | var layers = new List<Layer>(); | ||||
| @@ -200,12 +200,12 @@ namespace Tensorflow.Keras.Engine | |||||
| // Network.layers needs to have a deterministic order: | // Network.layers needs to have a deterministic order: | ||||
| // here we order them by traversal order. | // here we order them by traversal order. | ||||
| layers_for_depth.Reverse(); | |||||
| layers_for_depth = layers_for_depth.OrderBy(x => layer_indices[x]).ToList(); | |||||
| layers.AddRange(layers_for_depth); | layers.AddRange(layers_for_depth); | ||||
| } | } | ||||
| // Get sorted list of node depths. | // Get sorted list of node depths. | ||||
| depth_keys = nodes_by_depth.Keys.Reverse(); | |||||
| depth_keys = nodes_by_depth.Keys.OrderBy(x => x).Reverse(); | |||||
| return (network_nodes, nodes_by_depth, layers, layers_by_depth); | return (network_nodes, nodes_by_depth, layers, layers_by_depth); | ||||
| } | } | ||||
| @@ -290,7 +290,7 @@ namespace Tensorflow.Keras.Engine | |||||
| tensor_dict[x_id] = Enumerable.Range(0, tensor_usage_count[x_id]).Select(x => y1).ToArray(); | tensor_dict[x_id] = Enumerable.Range(0, tensor_usage_count[x_id]).Select(x => y1).ToArray(); | ||||
| } | } | ||||
| var depth_keys = NodesByDepth.Keys.Reverse().ToArray(); | |||||
| var depth_keys = NodesByDepth.Keys.OrderBy(x => x).Reverse().ToArray(); | |||||
| foreach(var depth in depth_keys) | foreach(var depth in depth_keys) | ||||
| { | { | ||||
| @@ -2,6 +2,7 @@ | |||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Text; | using System.Text; | ||||
| using Tensorflow.Keras.ArgsDefinition; | using Tensorflow.Keras.ArgsDefinition; | ||||
| using static Tensorflow.Binding; | |||||
| namespace Tensorflow.Keras.Engine | namespace Tensorflow.Keras.Engine | ||||
| { | { | ||||
| @@ -25,7 +26,13 @@ namespace Tensorflow.Keras.Engine | |||||
| protected override Tensors Call(Tensors inputs, Tensor state = null, bool is_training = false) | protected override Tensors Call(Tensors inputs, Tensor state = null, bool is_training = false) | ||||
| { | { | ||||
| return base.Call(inputs, state, is_training); | |||||
| return MakOp(inputs); | |||||
| } | } | ||||
| // [AutoGraph] | |||||
| Tensors MakOp(Tensors inputs) | |||||
| { | |||||
| return inputs; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -835,22 +835,24 @@ namespace Tensorflow | |||||
| } | } | ||||
| // Restore shape information where possible. | // Restore shape information where possible. | ||||
| var paddings_constant = tensor_util.constant_value( | |||||
| result.op.inputs[1], partial: true); | |||||
| var input_shape = result.op.inputs[0].TensorShape; | |||||
| if (input_shape.ndim > -1 && | |||||
| !result.TensorShape.is_fully_defined() && | |||||
| !(paddings_constant is null)) | |||||
| if (!tf.Context.executing_eagerly()) | |||||
| { | { | ||||
| var new_shape = new List<int>(); | |||||
| foreach((NDArray padding, int dim) in zip(paddings_constant.GetNDArrays(), np.array(input_shape.dims).GetNDArrays())) | |||||
| var paddings_constant = tensor_util.constant_value(result.op.inputs[1], partial: true); | |||||
| var input_shape = result.op.inputs[0].TensorShape; | |||||
| if (input_shape.ndim > -1 && | |||||
| !result.TensorShape.is_fully_defined() && | |||||
| !(paddings_constant is null)) | |||||
| { | { | ||||
| if (padding is null || dim == -1 || padding.GetData<int>().Contains(-1)) | |||||
| new_shape.Add(-1); | |||||
| else | |||||
| new_shape.Add(np.sum(padding) + dim); | |||||
| var new_shape = new List<int>(); | |||||
| foreach ((NDArray padding, int dim) in zip(paddings_constant.GetNDArrays(), np.array(input_shape.dims).GetNDArrays())) | |||||
| { | |||||
| if (padding is null || dim == -1 || padding.GetData<int>().Contains(-1)) | |||||
| new_shape.Add(-1); | |||||
| else | |||||
| new_shape.Add(np.sum(padding) + dim); | |||||
| } | |||||
| result.set_shape(new_shape.ToArray()); | |||||
| } | } | ||||
| result.set_shape(new_shape.ToArray()); | |||||
| } | } | ||||
| return result; | return result; | ||||
| @@ -175,6 +175,15 @@ namespace Tensorflow | |||||
| public static Tensor pad(Tensor input, Tensor paddings, string name = null) | public static Tensor pad(Tensor input, Tensor paddings, string name = null) | ||||
| { | { | ||||
| if (tf.Context.executing_eagerly()) | |||||
| { | |||||
| var results = tf.Runner.TFE_FastPathExecute(tf.Context, tf.Context.DeviceName, | |||||
| "Pad", name, | |||||
| null, | |||||
| input, paddings); | |||||
| return results[0]; | |||||
| } | |||||
| var _op = tf.OpDefLib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | var _op = tf.OpDefLib._apply_op_helper("Pad", name: name, args: new { input, paddings }); | ||||
| return _op.output; | return _op.output; | ||||