@@ -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; | ||||