void Start()
    {
        m_DataSet = LoadDataSet();

        var batch = m_DataSet.Item1[0].batch;

        m_SirenBuilder = new SirenModel(batch, false, 256, 3,
                                        8, 2, 6,
                                        "vector_observation", "continuous_actions", false);
        m_model      = m_SirenBuilder.model;
        m_parameters = m_SirenBuilder.parameters;

        if (loadModelFromOnnx)
        {
            m_model = ModelLoader.Load(model, false);
        }
        m_worker = WorkerFactory.CreateWorker(ms_workerType, m_model, false);

        m_input  = m_DataSet.Item1[9];
        m_target = m_DataSet.Item2[9];

        m_lr = new Tensor(1, 1, new[] { learningRate });

        InitPlot();

        var t = m_target.Reshape(new TensorShape(1, 100, 200, 1));

        t.ToRenderTexture(targetRT, batch: 0, fromChannel: 0);

        m_lastUpdateTime = Time.realtimeSinceStartup;

        StartCoroutine(TrainingLoop());
    }
    void Start()
    {
        if (optimizerText)
        {
            optimizerText.SetText(useAdam ? "ADAM" : "SGD");
        }

        var batch        = targetImage.height * targetImage.width;
        var sirenBuilder = new SirenModel(batch, biasOutputAndTarget, useAdam: useAdam, trainableBias: learnBias);

        m_model      = sirenBuilder.model;
        m_parameters = sirenBuilder.parameters;

        if (loadModelFromOnnx)
        {
            m_model = ModelLoader.Load(model, false);
        }
        m_worker = WorkerFactory.CreateWorker(ms_workerType, m_model, false);

        m_input = new Tensor(batch, 2);
        InitGrid(ref m_input, targetImage.height, targetImage.width);

        m_target  = new Tensor(targetImage, channels: 1);
        m_target  = m_target.Reshape(new TensorShape(batch, 1));
        m_lr      = new Tensor(1, 1, new[] { learningRate });
        m_beta1   = new Tensor(1, 1, new[] { beta1 });
        m_beta2   = new Tensor(1, 1, new[] { beta2 });
        m_epsilon = new Tensor(1, 1, new[] { epsilon });

        m_worker.SetInput("input", m_input);
        m_worker.SetInput("target", m_target);
        m_worker.SetInput("lr", m_lr);
        m_worker.SetInput("beta1", m_beta1);
        m_worker.SetInput("beta2", m_beta2);
        m_worker.SetInput("epsilon", m_epsilon);

        InitPlot();

        m_lastUpdateTime = Time.realtimeSinceStartup;
    }