public LinearNetworkArchitecture AppendStart(LinearNetworkArchitecture other)
        {
            if (other == null)
            {
                throw new ArgumentNullException(nameof(other));
            }

            if (other.LayerCount == 0)
            {
                return(this);
            }

            if (LayerCount > 0)
            {
                LayerConstruct firstOwn  = _layerConstructs.First();
                LayerConstruct lastOther = other._layerConstructs.Last();

                lastOther.AddOutput(firstOwn);
                firstOwn.AddInput(lastOther);
            }

            for (int i = other._layerConstructs.Count - 1; i >= 0; i--)
            {
                _layerConstructs.Insert(0, other._layerConstructs[i]);
            }

            UpdateRegistry();

            return(this);
        }
        public LinearNetworkArchitecture AppendEnd(LinearNetworkArchitecture other)
        {
            if (other == null)
            {
                throw new ArgumentNullException(nameof(other));
            }

            if (other.LayerCount == 0)
            {
                return(this);
            }

            if (LayerCount > 0)
            {
                LayerConstruct lastOwn    = _layerConstructs.Last();
                LayerConstruct firstOther = other._layerConstructs.First();

                lastOwn.AddOutput(firstOther);
                firstOther.AddInput(lastOwn);
            }

            _layerConstructs.AddRange(other._layerConstructs);

            UpdateRegistry();

            return(this);
        }
Example #3
0
        protected static LayerConstruct InitialiseBaseConstruct(LayerConstruct construct, double costImportance, string externalTargetsAlias, string externalCostAlias)
        {
            construct.ExternalInputs  = new[] { externalTargetsAlias };
            construct.ExternalOutputs = new[] { externalCostAlias };

            construct.Parameters["external_targets_alias"] = externalTargetsAlias;
            construct.Parameters["external_cost_alias"]    = externalCostAlias;
            construct.Parameters["cost_importance"]        = costImportance;

            return(construct);
        }
Example #4
0
        public static LayerConstruct Construct(string name, string inputAlias, params long[] shape)
        {
            NDArrayUtils.CheckShape(shape);

            LayerConstruct construct = new LayerConstruct(name, typeof(InputLayer));

            construct.ExternalInputs = new[] { inputAlias };
            construct.Parameters["external_input_alias"] = inputAlias;
            construct.Parameters["shape"] = shape;
            construct.Parameters["size"]  = (int)ArrayUtils.Product(shape);

            return(construct);
        }
Example #5
0
        public static LayerConstruct Construct(int size, string activation = "sigmoid", string name = "#-fullyconnected")
        {
            LayerConstruct construct = new LayerConstruct(name, typeof(FullyConnectedLayer));

            construct.Parameters["size"]       = size;
            construct.Parameters["activation"] = activation;

            // input size is required for instantiation but not known at construction time, so update before instantiation
            construct.UpdateBeforeInstantiationEvent +=
                (sender, args) => args.Self.Parameters["default_input_size"] = args.Self.Inputs["default"].Parameters["size"];

            return(construct);
        }
Example #6
0
        public static LayerConstruct Construct(double dropoutProbability, string name = "#-dropout")
        {
            if (dropoutProbability < 0.0 || dropoutProbability >= 1.0)
            {
                throw new ArgumentException($"Dropout probability must be in range 0.0 <= x < 1.0 but was {dropoutProbability}.");
            }

            LayerConstruct construct = new LayerConstruct(name, typeof(DropoutLayer));

            construct.Parameters["dropout_probability"] = dropoutProbability;

            construct.UpdateBeforeInstantiationEvent          +=
                (sender, args) => args.Self.Parameters["size"] = args.Self.Inputs["default"].Parameters["size"];

            return(construct);
        }
        public virtual object DeepCopy()
        {
            Dictionary <LayerConstruct, LayerConstruct> mappedConstructCopies = new Dictionary <LayerConstruct, LayerConstruct>();
            List <LayerConstruct> copiedConstructs = _layerConstructs.ConvertAll(construct =>
            {
                LayerConstruct copy = construct.Copy();

                mappedConstructCopies.Add(construct, copy);

                return(copy);
            });

            foreach (LayerConstruct original in _layerConstructs)
            {
                LayerConstruct copy = mappedConstructCopies[original];

                foreach (string inputAlias in original.Inputs.Keys)
                {
                    LayerConstruct input = original.Inputs[inputAlias];

                    if (mappedConstructCopies.ContainsKey(input))
                    {
                        input = mappedConstructCopies[input];
                    }

                    copy.AddInput(input, inputAlias);
                }

                foreach (string outputAlias in original.Outputs.Keys)
                {
                    LayerConstruct output = original.Outputs[outputAlias];

                    if (mappedConstructCopies.ContainsKey(output))
                    {
                        output = mappedConstructCopies[output];
                    }

                    copy.AddOutput(output, outputAlias);
                }
            }

            return(new LinearNetworkArchitecture(copiedConstructs));
        }
Example #8
0
        public static LayerConstruct Construct(int size, string activation = "tanh", string name = "#-elementwise")
        {
            LayerConstruct construct = new LayerConstruct(name, typeof(ElementwiseLayer));

            construct.Parameters["size"]       = size;
            construct.Parameters["activation"] = activation;

            construct.ValidateEvent += (sender, args) =>
            {
                if (Convert.ToDecimal(args.Self.Inputs["default"].Parameters["size"]) != Convert.ToDecimal(args.Self.Parameters["size"]))
                {
                    throw new InvalidNetworkArchitectureException(
                              $"Element-wise layer must be connected to input layer of input size, but own (\"{args.Self.Name}\") size {args.Self.Parameters["size"]} " +
                              $"does not match size of default input (\"{args.Self.Inputs["default"].Name}\") {args.Self.Inputs["default"].Parameters["size"]}.");
                }
            };

            return(construct);
        }
        public static LayerConstruct Construct(string name = "#-squaredcost", double importance = 1.0, string externalTargetsAlias = "external_targets", string externalCostAlias = "external_cost")
        {
            LayerConstruct construct = new LayerConstruct(name, typeof(SquaredDifferenceCostLayer));

            return(InitialiseBaseConstruct(construct, importance, externalTargetsAlias, externalCostAlias));
        }
        public static LayerConstruct Construct(string name = "#-softmaxcecost", double importance = 1.0, string externalTargetsAlias = "external_targets", string externalCostAlias = "external_cost")
        {
            LayerConstruct construct = new LayerConstruct(name, typeof(SoftMaxCrossEntropyCostLayer));

            return(InitialiseBaseConstruct(construct, importance, externalTargetsAlias, externalCostAlias));
        }