/// <summary> /// Build neural network based on the lsit of layer defs. /// </summary> /// <param name="layerDefs">layer definitions</param> /// <param name="input">input tensor</param> /// <param name="scope">name scope</param> /// <returns>value tuple of (output tensor, list of weights)</returns> public static ValueTuple <Tensor, List <Tensor> > BuildSequentialLayers(List <SimpleDenseLayerDef> layerDefs, Tensor input, string scope = null) { NameScope nameScppe = null; if (!string.IsNullOrEmpty(scope)) { nameScppe = Current.K.name_scope(scope); } List <Tensor> weights = new List <Tensor>(); Tensor temp = input; foreach (var l in layerDefs) { var result = l.Call(temp); temp = result.Item1; weights.AddRange(result.Item2); } if (nameScppe != null) { nameScppe.Dispose(); } return(ValueTuple.Create(temp, weights)); }
/// <summary> /// Trainers will call this method to initialize the model. This method will call the InitializeInner() /// </summary> /// <param name="brainParameters">brain parameter of the MLagent brain</param> /// <param name="enableTraining">whether enable training</param> /// <param name="trainerParams">trainer parameters passed by the trainer. Training will not be enabled </param> public virtual void Initialize(BrainParameters brainParameters, bool enableTraining, TrainerParams trainerParams = null) { Debug.Assert(Initialized == false, "Model already Initalized"); NameScope ns = null; if (!string.IsNullOrEmpty(modelName)) { ns = Current.K.name_scope(modelName); } ActionSizes = brainParameters.vectorActionSize; StateSize = brainParameters.vectorObservationSize * brainParameters.numStackedVectorObservations; ActionSpace = brainParameters.vectorActionSpaceType; Debug.Assert(ActionSizes[0] > 0, "Action size can not be zero"); //create basic inputs var inputStateTensor = StateSize > 0 ? UnityTFUtils.Input(new int?[] { StateSize }, name: "InputStates")[0] : null; HasVectorObservation = inputStateTensor != null; var inputVisualTensors = CreateVisualInputs(brainParameters); HasVisualObservation = inputVisualTensors != null; //create inner intialization InitializeInner(brainParameters, inputStateTensor, inputVisualTensors, enableTraining ? trainerParams : null); //test //Debug.LogWarning("Tensorflow Graph is saved for test purpose at: SavedGraph/" + name + ".pb"); //((UnityTFBackend)Current.K).ExportGraphDef("SavedGraph/" + name + ".pb"); Current.K.try_initialize_variables(true); if (ns != null) { ns.Dispose(); } if (checkpointToLoad != null) { RestoreCheckpoint(checkpointToLoad.bytes, true); } Initialized = true; TrainingEnabled = enableTraining; }