| @@ -9,11 +9,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Benchmark", "src | |||
| EndProject | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.UnitTest", "test\TensorFlowNET.UnitTest\Tensorflow.UnitTest.csproj", "{23C28035-2FCE-41F3-9A12-E73CE8A5AE32}" | |||
| EndProject | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Keras", "src\TensorFlowNET.Keras\Tensorflow.Keras.csproj", "{6268B461-486A-460B-9B3C-86493CBBAAF7}" | |||
| EndProject | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tensorflow.Keras.UnitTest", "test\Tensorflow.Keras.UnitTest\Tensorflow.Keras.UnitTest.csproj", "{EB92DD90-6346-41FB-B967-2B33A860AD98}" | |||
| EndProject | |||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TensorFlowNET.Console", "src\TensorFlowNET.Console\TensorFlowNET.Console.csproj", "{03F06299-3F4B-4449-A709-3A647657BC0C}" | |||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TensorFlowNET.Console", "src\TensorFlowNET.Console\TensorFlowNET.Console.csproj", "{03F06299-3F4B-4449-A709-3A647657BC0C}" | |||
| EndProject | |||
| Global | |||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
| @@ -103,54 +99,6 @@ Global | |||
| {23C28035-2FCE-41F3-9A12-E73CE8A5AE32}.Release|x64.Build.0 = Release|x64 | |||
| {23C28035-2FCE-41F3-9A12-E73CE8A5AE32}.Release|x86.ActiveCfg = Release|Any CPU | |||
| {23C28035-2FCE-41F3-9A12-E73CE8A5AE32}.Release|x86.Build.0 = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug|x64.ActiveCfg = Debug|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug|x64.Build.0 = Debug|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug|x86.Build.0 = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug-Minimal|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug-Minimal|Any CPU.Build.0 = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug-Minimal|x64.ActiveCfg = Debug|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug-Minimal|x64.Build.0 = Debug|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug-Minimal|x86.ActiveCfg = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Debug-Minimal|x86.Build.0 = Debug|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Publish|Any CPU.ActiveCfg = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Publish|Any CPU.Build.0 = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Publish|x64.ActiveCfg = Release|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Publish|x64.Build.0 = Release|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Publish|x86.ActiveCfg = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Publish|x86.Build.0 = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Release|Any CPU.Build.0 = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Release|x64.ActiveCfg = Release|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Release|x64.Build.0 = Release|x64 | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Release|x86.ActiveCfg = Release|Any CPU | |||
| {6268B461-486A-460B-9B3C-86493CBBAAF7}.Release|x86.Build.0 = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug|x64.ActiveCfg = Debug|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug|x64.Build.0 = Debug|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug|x86.ActiveCfg = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug|x86.Build.0 = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug-Minimal|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug-Minimal|Any CPU.Build.0 = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug-Minimal|x64.ActiveCfg = Debug|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug-Minimal|x64.Build.0 = Debug|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug-Minimal|x86.ActiveCfg = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Debug-Minimal|x86.Build.0 = Debug|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Publish|Any CPU.ActiveCfg = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Publish|Any CPU.Build.0 = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Publish|x64.ActiveCfg = Release|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Publish|x64.Build.0 = Release|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Publish|x86.ActiveCfg = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Publish|x86.Build.0 = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Release|Any CPU.Build.0 = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Release|x64.ActiveCfg = Release|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Release|x64.Build.0 = Release|x64 | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Release|x86.ActiveCfg = Release|Any CPU | |||
| {EB92DD90-6346-41FB-B967-2B33A860AD98}.Release|x86.Build.0 = Release|Any CPU | |||
| {03F06299-3F4B-4449-A709-3A647657BC0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| {03F06299-3F4B-4449-A709-3A647657BC0C}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| {03F06299-3F4B-4449-A709-3A647657BC0C}.Debug|x64.ActiveCfg = Debug|Any CPU | |||
| @@ -14,9 +14,11 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using NumSharp; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Layers; | |||
| using Tensorflow.Operations.Activation; | |||
| using static Tensorflow.Binding; | |||
| @@ -173,14 +175,19 @@ namespace Tensorflow | |||
| if (bias_initializer == null) | |||
| bias_initializer = tf.zeros_initializer; | |||
| var layer = new Dense(units, activation, | |||
| use_bias: use_bias, | |||
| bias_initializer: bias_initializer, | |||
| kernel_initializer: kernel_initializer, | |||
| trainable: trainable, | |||
| name: name); | |||
| return layer.apply(inputs).Item1; | |||
| var layer = new Dense(new DenseArgs | |||
| { | |||
| Units = units, | |||
| Activation = activation, | |||
| UseBias = use_bias, | |||
| BiasInitializer = bias_initializer, | |||
| KernelInitializer = kernel_initializer, | |||
| Trainable = trainable, | |||
| Name = name | |||
| }); | |||
| throw new NotImplementedException(""); | |||
| //return layer.apply(inputs).Item1; | |||
| } | |||
| /// <summary> | |||
| @@ -515,6 +515,9 @@ namespace Tensorflow | |||
| public Tensor sum(Tensor input, int axis, bool keep_dims = false, string name = null) | |||
| => gen_math_ops._sum(input, axis, keep_dims: keep_dims, name: name); | |||
| public Tensor reduce_mean(Tensor input_tensors, int axis, bool keepdims = false, string name = null) | |||
| => math_ops.reduce_mean(input_tensors, axis: new[] { axis }, keepdims: keepdims, name: name); | |||
| public Tensor reduce_mean(Tensor input_tensor, int[] axis = null, bool keepdims = false, string name = null, int? reduction_indices = null) | |||
| => math_ops.reduce_mean(input_tensor, axis: axis, keepdims: keepdims, name: name, reduction_indices: reduction_indices); | |||
| @@ -7,7 +7,7 @@ namespace Tensorflow | |||
| { | |||
| public class DatasetManager | |||
| { | |||
| public IDatasetV2 from_tensor_slices(NDArray features, NDArray labels) | |||
| public IDatasetV2 from_tensor_slices(Tensor features, Tensor labels) | |||
| => new TensorSliceDataset(features, labels); | |||
| } | |||
| } | |||
| @@ -11,9 +11,9 @@ namespace Tensorflow | |||
| { | |||
| public class TensorSliceDataset : DatasetSource | |||
| { | |||
| public TensorSliceDataset(NDArray features, NDArray labels) | |||
| public TensorSliceDataset(Tensor features, Tensor labels) | |||
| { | |||
| _tensors = new[] { tf.convert_to_tensor(features), tf.convert_to_tensor(labels) }; | |||
| _tensors = new[] { features, labels }; | |||
| var batched_spec = _tensors.Select(x => x.ToTensorSpec()).ToArray(); | |||
| structure = batched_spec.Select(x => x._unbatch()).ToArray(); | |||
| @@ -0,0 +1,17 @@ | |||
| using System; | |||
| namespace Tensorflow | |||
| { | |||
| public class InvalidArgumentError : TensorflowException | |||
| { | |||
| public InvalidArgumentError() : base() | |||
| { | |||
| } | |||
| public InvalidArgumentError(string message) : base(message) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| @@ -119,7 +119,7 @@ namespace Tensorflow.Gradients | |||
| return (results[0], results[1]); | |||
| } | |||
| public Tensor[] gradient(Tensor target, ResourceVariable[] sources) | |||
| public Tensor[] gradient(Tensor target, IEnumerable<IVariableV1> sources) | |||
| { | |||
| if (_recording) | |||
| { | |||
| @@ -0,0 +1,56 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| using Tensorflow.Operations.Activation; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Keras.ArgsDefinition | |||
| { | |||
| public class DenseArgs : LayerArgs | |||
| { | |||
| /// <summary> | |||
| /// Positive integer, dimensionality of the output space. | |||
| /// </summary> | |||
| public int Units { get; set; } | |||
| /// <summary> | |||
| /// Activation function to use. | |||
| /// </summary> | |||
| public IActivation Activation { get; set; } | |||
| /// <summary> | |||
| /// Whether the layer uses a bias vector. | |||
| /// </summary> | |||
| public bool UseBias { get; set; } = true; | |||
| /// <summary> | |||
| /// Initializer for the `kernel` weights matrix. | |||
| /// </summary> | |||
| public IInitializer KernelInitializer { get; set; } = tf.glorot_uniform_initializer; | |||
| /// <summary> | |||
| /// Initializer for the bias vector. | |||
| /// </summary> | |||
| public IInitializer BiasInitializer { get; set; } = tf.zeros_initializer; | |||
| /// <summary> | |||
| /// Regularizer function applied to the `kernel` weights matrix. | |||
| /// </summary> | |||
| public IInitializer KernelRegularizer { get; set; } | |||
| /// <summary> | |||
| /// Regularizer function applied to the bias vector. | |||
| /// </summary> | |||
| public IInitializer BiasRegularizer { get; set; } | |||
| /// <summary> | |||
| /// Constraint function applied to the `kernel` weights matrix. | |||
| /// </summary> | |||
| public Action KernelConstraint { get; set; } | |||
| /// <summary> | |||
| /// Constraint function applied to the bias vector. | |||
| /// </summary> | |||
| public Action BiasConstraint { get; set; } | |||
| } | |||
| } | |||
| @@ -0,0 +1,51 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Keras.ArgsDefinition | |||
| { | |||
| public class LayerArgs | |||
| { | |||
| /// <summary> | |||
| /// Indicates whether the layer's weights are updated during training | |||
| /// and whether the layer's updates are run during training. | |||
| /// </summary> | |||
| public bool Trainable { get; set; } = true; | |||
| public string Name { get; set; } | |||
| /// <summary> | |||
| /// Only applicable to input layers. | |||
| /// </summary> | |||
| public TF_DataType DType { get; set; } | |||
| /// <summary> | |||
| /// Whether the `call` method can be used to build a TF graph without issues. | |||
| /// This attribute has no effect if the model is created using the Functional | |||
| /// API. Instead, `model.dynamic` is determined based on the internal layers. | |||
| /// </summary> | |||
| public bool Dynamic { get; set; } = false; | |||
| /// <summary> | |||
| /// Only applicable to input layers. | |||
| /// </summary> | |||
| public TensorShape InputShape { get; set; } | |||
| /// <summary> | |||
| /// Only applicable to input layers. | |||
| /// </summary> | |||
| public TensorShape BatchInputShape { get; set; } | |||
| /// <summary> | |||
| /// Initial weight values. | |||
| /// </summary> | |||
| public float[] Weights { get; set; } | |||
| /// <summary> | |||
| /// Regularizer function applied to the output of the layer(its "activation"). | |||
| /// </summary> | |||
| public IInitializer ActivityRegularizer { get; set; } | |||
| public bool Autocast { get; set; } | |||
| } | |||
| } | |||
| @@ -0,0 +1,10 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Keras.ArgsDefinition | |||
| { | |||
| public class ModelArgs : LayerArgs | |||
| { | |||
| } | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Keras.Engine | |||
| { | |||
| public class CallContext | |||
| { | |||
| public CallContextManager enter() | |||
| { | |||
| return new CallContextManager(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,14 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Keras.Engine | |||
| { | |||
| public class CallContextManager : IDisposable | |||
| { | |||
| public void Dispose() | |||
| { | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Text; | |||
| namespace Tensorflow.Keras.Engine | |||
| { | |||
| /// <summary> | |||
| /// A layer is a callable object that takes as input one or more tensors and | |||
| /// that outputs one or more tensors. | |||
| /// </summary> | |||
| public interface ILayer | |||
| { | |||
| Tensor Apply(Tensor inputs, bool is_training = false); | |||
| } | |||
| } | |||
| @@ -17,12 +17,14 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using Tensorflow.Keras.Engine; | |||
| using System.Threading; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Layers; | |||
| using Tensorflow.Keras.Utils; | |||
| using Tensorflow.Train; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Keras.Layers | |||
| namespace Tensorflow.Keras.Engine | |||
| { | |||
| /// <summary> | |||
| /// Base layer class. | |||
| @@ -32,8 +34,10 @@ namespace Tensorflow.Keras.Layers | |||
| /// | |||
| /// tensorflow\python\keras\engine\base_layer.py | |||
| /// </summary> | |||
| public class Layer : AutoTrackable | |||
| public class Layer : AutoTrackable, ILayer | |||
| { | |||
| protected LayerArgs _args; | |||
| /// <summary> | |||
| /// Indicates whether `build` needs to be called upon layer call, to create | |||
| /// the layer's weights. | |||
| @@ -52,6 +56,7 @@ namespace Tensorflow.Keras.Layers | |||
| protected InputSpec input_spec; | |||
| protected bool supports_masking; | |||
| protected List<IVariableV1> _trainable_weights; | |||
| public List<IVariableV1> trainable_variables => _trainable_weights; | |||
| protected List<IVariableV1> _non_trainable_weights; | |||
| private string _name; | |||
| public string name => _name; | |||
| @@ -72,13 +77,12 @@ namespace Tensorflow.Keras.Layers | |||
| float _initial_weights; | |||
| #pragma warning restore CS0169 // The field 'Layer._initial_weights' is never used | |||
| public Layer(bool trainable = true, | |||
| string name = null, | |||
| TF_DataType dtype = TF_DataType.DtInvalid, | |||
| int[] input_shape = null) | |||
| ThreadLocal<CallContext> _call_context; | |||
| public CallContext CallContext => _call_context.Value; | |||
| public Layer(LayerArgs args) | |||
| { | |||
| this.trainable = trainable; | |||
| this._dtype = dtype; | |||
| _args = args; | |||
| // A stateful layer is a layer whose updates are run during inference too, | |||
| // for instance stateful RNNs. | |||
| stateful = false; | |||
| @@ -94,17 +98,47 @@ namespace Tensorflow.Keras.Layers | |||
| _updates = new List<Operation>(); | |||
| // Manage input shape information if passed. | |||
| if(input_shape != null) | |||
| _inbound_nodes = new List<Node>(); | |||
| } | |||
| /// <summary> | |||
| /// Wraps `call`, applying pre- and post-processing steps. | |||
| /// </summary> | |||
| /// <param name="input"></param> | |||
| /// <param name="is_training"></param> | |||
| /// <returns></returns> | |||
| public Tensor Apply(Tensor input, bool is_training = false) | |||
| { | |||
| var input_list = new Tensor[] { input }; | |||
| if (_call_context == null) | |||
| _call_context = new ThreadLocal<CallContext>() | |||
| { | |||
| Value = new CallContext() | |||
| }; | |||
| using var ctxManager = CallContext.enter(); | |||
| string name_scope = ""; | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var shapes = new List<int> { -1 }; | |||
| shapes.AddRange(input_shape); | |||
| _batch_input_shape = shapes.ToArray(); | |||
| name_scope = _name; | |||
| } | |||
| else | |||
| { | |||
| throw new NotImplementedException(""); | |||
| } | |||
| _dtype = dtype; | |||
| tf_with(ops.name_scope(name_scope), scope => | |||
| { | |||
| if (!built) | |||
| _maybe_build(input); | |||
| _inbound_nodes = new List<Node>(); | |||
| call(input, is_training: is_training); | |||
| }); | |||
| throw new NotImplementedException(""); | |||
| } | |||
| public Tensor[] __call__(Tensor[] inputs, | |||
| @@ -147,7 +181,7 @@ namespace Tensorflow.Keras.Layers | |||
| _maybe_build(inputs[0]); | |||
| outputs = call(inputs[0], | |||
| training: training, | |||
| // training: training, | |||
| state: state); | |||
| (input, outputs) = _set_connectivity_metadata_(input, outputs); | |||
| @@ -183,7 +217,7 @@ namespace Tensorflow.Keras.Layers | |||
| return null; | |||
| } | |||
| protected virtual Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected virtual Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| throw new NotImplementedException(""); | |||
| } | |||
| @@ -1,8 +1,12 @@ | |||
| using Tensorflow.Keras.Optimizers; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Optimizers; | |||
| namespace Tensorflow.Keras.Engine | |||
| { | |||
| public class Model : Network | |||
| /// <summary> | |||
| /// `Model` groups layers into an object with training and inference features. | |||
| /// </summary> | |||
| public class Model : Layer | |||
| { | |||
| #pragma warning disable CS0169 // The field 'Model._cloning' is never used | |||
| bool _cloning; | |||
| @@ -15,8 +19,8 @@ namespace Tensorflow.Keras.Engine | |||
| string loss; | |||
| IOptimizer optimizer; | |||
| public Model(string name = null) | |||
| : base(name: name) | |||
| public Model(ModelArgs args) | |||
| : base(args) | |||
| { | |||
| } | |||
| @@ -1,55 +0,0 @@ | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System.Collections.Generic; | |||
| using Tensorflow.Keras.Layers; | |||
| namespace Tensorflow.Keras.Engine | |||
| { | |||
| public class Network : Layer | |||
| { | |||
| protected bool _is_compiled; | |||
| protected bool _expects_training_arg; | |||
| protected bool _compute_output_and_mask_jointly; | |||
| /// <summary> | |||
| /// All layers in order of horizontal graph traversal. | |||
| /// Entries are unique. Includes input and output layers. | |||
| /// </summary> | |||
| protected List<Layer> _layers; | |||
| public Network(string name = null) | |||
| : base(name: name) | |||
| { | |||
| _init_subclassed_network(name); | |||
| } | |||
| protected virtual void _init_subclassed_network(string name = null) | |||
| { | |||
| _base_init(name: name); | |||
| } | |||
| protected virtual void _base_init(string name = null) | |||
| { | |||
| _init_set_name(name); | |||
| trainable = true; | |||
| _is_compiled = false; | |||
| _expects_training_arg = false; | |||
| _compute_output_and_mask_jointly = false; | |||
| supports_masking = false; | |||
| _layers = new List<Layer>(); | |||
| } | |||
| } | |||
| } | |||
| @@ -14,6 +14,7 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Layers; | |||
| namespace Tensorflow.Keras.Engine | |||
| @@ -28,10 +29,10 @@ namespace Tensorflow.Keras.Engine | |||
| #pragma warning restore CS0169 // The field 'Sequential.outputs' is never used | |||
| public Sequential(string name = null) | |||
| : base(name: name) | |||
| : base(new ModelArgs { Name = name}) | |||
| { | |||
| supports_masking = true; | |||
| _compute_output_and_mask_jointly = true; | |||
| // _compute_output_and_mask_jointly = true; | |||
| } | |||
| public void __enter__() | |||
| @@ -47,7 +48,7 @@ namespace Tensorflow.Keras.Engine | |||
| { | |||
| built = false; | |||
| var set_inputs = false; | |||
| if(_layers.Count == 0) | |||
| //if(_layers.Count == 0) | |||
| { | |||
| if(layer is InputLayer) | |||
| { | |||
| @@ -1,6 +1,11 @@ | |||
| using System.Data; | |||
| using System; | |||
| using System.Data; | |||
| using Tensorflow.Keras; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Datasets; | |||
| using Tensorflow.Keras.Engine; | |||
| using Tensorflow.Keras.Layers; | |||
| using Tensorflow.Operations.Activation; | |||
| namespace Tensorflow | |||
| { | |||
| @@ -8,5 +13,17 @@ namespace Tensorflow | |||
| { | |||
| public KerasDataset datasets { get; } = new KerasDataset(); | |||
| public Initializers initializers { get; } = new Initializers(); | |||
| public Layers layers { get; } = new Layers(); | |||
| public class Layers | |||
| { | |||
| public ILayer Dense(int units, | |||
| IActivation activation = null) | |||
| => new Dense(new DenseArgs | |||
| { | |||
| Units = units, | |||
| Activation = activation | |||
| }); | |||
| } | |||
| } | |||
| } | |||
| @@ -143,12 +143,13 @@ namespace Tensorflow.Keras.Layers | |||
| built = true; | |||
| } | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| Tensor outputs = null; | |||
| if (fused) | |||
| { | |||
| Tensor training = tf.convert_to_tensor(is_training); | |||
| outputs = _fused_batch_norm(inputs, training: training); | |||
| return new[] { outputs, outputs }; | |||
| } | |||
| @@ -108,7 +108,7 @@ namespace Tensorflow.Keras.Layers | |||
| built = true; | |||
| } | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool training = false, Tensor state = null) | |||
| { | |||
| var outputs = _convolution_op.__call__(inputs, kernel); | |||
| if (use_bias) | |||
| @@ -17,35 +17,29 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Engine; | |||
| using Tensorflow.Operations.Activation; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Keras.Layers | |||
| { | |||
| public class Dense : Tensorflow.Layers.Layer | |||
| /// <summary> | |||
| /// Just your regular densely-connected NN layer. | |||
| /// </summary> | |||
| public class Dense : Layer | |||
| { | |||
| protected int units; | |||
| protected IActivation activation; | |||
| protected bool use_bias; | |||
| protected IInitializer kernel_initializer; | |||
| protected IInitializer bias_initializer; | |||
| protected RefVariable kernel; | |||
| protected RefVariable bias; | |||
| protected IVariableV1 kernel; | |||
| protected IVariableV1 bias; | |||
| public Dense(int units, | |||
| IActivation activation, | |||
| string name = null, | |||
| bool use_bias = true, | |||
| bool trainable = false, | |||
| IInitializer kernel_initializer = null, | |||
| IInitializer bias_initializer = null) : base(trainable: trainable, name: name) | |||
| public Dense(DenseArgs args) : | |||
| base(args) | |||
| { | |||
| this.units = units; | |||
| this.activation = activation; | |||
| this.use_bias = use_bias; | |||
| this.kernel_initializer = kernel_initializer; | |||
| this.bias_initializer = bias_initializer; | |||
| this.supports_masking = true; | |||
| this.input_spec = new InputSpec(min_ndim: 2); | |||
| } | |||
| @@ -56,14 +50,14 @@ namespace Tensorflow.Keras.Layers | |||
| var axes = new Dictionary<int, int>(); | |||
| axes[-1] = last_dim; | |||
| input_spec = new InputSpec(min_ndim: 2, axes: axes); | |||
| kernel = (RefVariable)add_weight( | |||
| kernel = add_weight( | |||
| "kernel", | |||
| shape: new int[] { last_dim, units }, | |||
| initializer: kernel_initializer, | |||
| dtype: _dtype, | |||
| trainable: true); | |||
| if (use_bias) | |||
| bias = (RefVariable)add_weight( | |||
| bias = add_weight( | |||
| "bias", | |||
| shape: new int[] { units }, | |||
| initializer: bias_initializer, | |||
| @@ -73,7 +67,7 @@ namespace Tensorflow.Keras.Layers | |||
| built = true; | |||
| } | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool training = false, Tensor state = null) | |||
| { | |||
| Tensor outputs = null; | |||
| var rank = inputs.rank; | |||
| @@ -83,7 +77,7 @@ namespace Tensorflow.Keras.Layers | |||
| } | |||
| else | |||
| { | |||
| outputs = gen_math_ops.mat_mul(inputs, kernel); | |||
| outputs = gen_math_ops.mat_mul(inputs, kernel.Handle); | |||
| } | |||
| if (use_bias) | |||
| @@ -14,6 +14,8 @@ | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Engine; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Keras.Layers | |||
| @@ -32,7 +34,12 @@ namespace Tensorflow.Keras.Layers | |||
| bool mask_zero = false, | |||
| TF_DataType dtype = TF_DataType.TF_FLOAT, | |||
| int[] input_shape = null, | |||
| int input_length = -1) : base(dtype: dtype, input_shape: input_shape ?? new[] { input_length }) | |||
| int input_length = -1) : | |||
| base(new LayerArgs | |||
| { | |||
| DType = dtype, | |||
| InputShape = input_shape ?? new[] { input_length } | |||
| }) | |||
| { | |||
| this.input_dim = input_dim; | |||
| this.output_dim = output_dim; | |||
| @@ -50,7 +57,7 @@ namespace Tensorflow.Keras.Layers | |||
| built = true; | |||
| } | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| var dtype = inputs.dtype; | |||
| if (dtype != tf.int32 && dtype != tf.int64) | |||
| @@ -17,6 +17,8 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using Tensorflow.Keras.Engine; | |||
| namespace Tensorflow.Keras.Layers | |||
| { | |||
| @@ -35,7 +37,11 @@ namespace Tensorflow.Keras.Layers | |||
| TF_DataType dtype = TF_DataType.DtInvalid, | |||
| string name = null, | |||
| bool sparse = false, | |||
| Tensor input_tensor = null) : base(dtype: dtype, name: name) | |||
| Tensor input_tensor = null) : | |||
| base(new LayerArgs | |||
| { | |||
| DType = dtype, Name = name | |||
| }) | |||
| { | |||
| built = true; | |||
| this.sparse = sparse; | |||
| @@ -15,6 +15,7 @@ | |||
| ******************************************************************************/ | |||
| using System.Linq; | |||
| using Tensorflow.Keras.Engine; | |||
| namespace Tensorflow.Keras.Layers | |||
| { | |||
| @@ -45,7 +45,7 @@ namespace Tensorflow.Keras.Layers | |||
| this.input_spec = new InputSpec(ndim: 4); | |||
| } | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| int[] pool_shape; | |||
| if (data_format == "channels_last") | |||
| @@ -1,20 +0,0 @@ | |||
| using Tensorflow.Operations.Activation; | |||
| namespace Tensorflow.Layers | |||
| { | |||
| public class Dense : Keras.Layers.Dense | |||
| { | |||
| public Dense(int units, | |||
| IActivation activation, | |||
| bool use_bias = true, | |||
| bool trainable = false, | |||
| IInitializer kernel_initializer = null) : base(units, | |||
| activation, | |||
| use_bias: use_bias, | |||
| trainable: trainable, | |||
| kernel_initializer: kernel_initializer) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| @@ -16,11 +16,12 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using Tensorflow.Keras.ArgsDefinition; | |||
| using static Tensorflow.Binding; | |||
| namespace Tensorflow.Layers | |||
| { | |||
| public class Layer : Keras.Layers.Layer | |||
| public class Layer : Keras.Engine.Layer | |||
| { | |||
| protected Graph _graph; | |||
| @@ -34,7 +35,13 @@ namespace Tensorflow.Layers | |||
| public Layer(bool trainable = true, | |||
| string name = null, | |||
| TF_DataType dtype = TF_DataType.DtInvalid, | |||
| bool? _reuse = null) : base(trainable: trainable, name: name, dtype: dtype) | |||
| bool? _reuse = null) : | |||
| base(new LayerArgs | |||
| { | |||
| Trainable = trainable, | |||
| Name = name, | |||
| DType = dtype | |||
| }) | |||
| { | |||
| // For backwards compatibility, legacy layers do not use `ResourceVariable` | |||
| // by default. | |||
| @@ -74,7 +74,7 @@ namespace Tensorflow | |||
| /// <param name="training"></param> | |||
| /// <param name="state"></param> | |||
| /// <returns></returns> | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| var one = constant_op.constant(1, dtype: dtypes.int32); | |||
| // Parameters of gates are concatenated into one multiply for efficiency. | |||
| @@ -67,7 +67,7 @@ namespace Tensorflow | |||
| built = true; | |||
| } | |||
| protected override Tensor[] call(Tensor inputs, Tensor training = null, Tensor state = null) | |||
| protected override Tensor[] call(Tensor inputs, bool is_training = false, Tensor state = null) | |||
| { | |||
| // Most basic RNN: output = new_state = act(W * input + U * state + B). | |||
| var concat = array_ops.concat(new[] { inputs, state }, 1); | |||
| @@ -85,8 +85,9 @@ namespace Tensorflow | |||
| { | |||
| case TF_Code.TF_OUT_OF_RANGE: | |||
| throw new OutOfRangeError(message); | |||
| case TF_Code.TF_INVALID_ARGUMENT: | |||
| throw new InvalidArgumentError(message); | |||
| default: | |||
| Console.WriteLine(message); | |||
| throw new TensorflowException(message); | |||
| } | |||
| } | |||