コード例 #1
0
    public void MLP_Calc()
    {
        TensorCachingAllocator tca = new TensorCachingAllocator();
        var shape = new MultiLayerPerception.Shape {
            inputSize  = 2,
            outputSize = 3,
            hiddenSize = 2
        };
        MultiLayerPerception mlp = new MultiLayerPerception(shape);
        int layerCnt             = 0;

        foreach (Layer layer in mlp.model.layers)
        {
            layerCnt++;
            for (int iWB = 0; iWB < layer.weights.Length; iWB++)
            {
                layer.weights[iWB] = iWB * layerCnt;
            }

            if (layer.datasets.Length == 2)
            {
                Debug.Log($"" +
                          $"{layer.name} " +
                          $"({layer.weights.Length}: W{layer.datasets[0].length} + B{layer.datasets[1].length}): " +
                          $"<{string.Join(", ", layer.weights)}>");
            }
        }

        string  HiddenLayer = MultiLayerPerception.LayerNames.Hidden;
        IWorker worker      = WorkerFactory.CreateWorker(mlp.model, new string[] { HiddenLayer }, WorkerFactory.Device.GPU);
        Tensor  inTensor    = tca.Alloc(new TensorShape(1, 1, 1, shape.inputSize));

        for (int i = 0; i < shape.inputSize; i++)
        {
            inTensor[i] = i;
            Debug.Log($"input[{i}] = {inTensor[i]}");
        }
        IWorker ex = worker.Execute(inTensor);

        ex.FlushSchedule(true);


        Tensor hTensor = ex.PeekOutput(HiddenLayer);

        Debug.Assert(hTensor.length == shape.hiddenSize);
        for (int i = 0; i < hTensor.length; i++)
        {
            Debug.Log($"hidden1[{i}] = {hTensor[i]}");
        }
        Tensor output = ex.PeekOutput();

        Debug.Assert(output.length == shape.outputSize);
        for (int i = 0; i < output.length; i++)
        {
            Debug.Log($"output[{i}] = {output[i]}");
        }

        for (int iHNode = 0; iHNode < shape.hiddenSize; iHNode++)
        {
            string str = "";
            float  sum = 0;
            for (int iINode = 0; iINode < shape.inputSize; iINode++)
            {
                float w = mlp.GetWeight(HiddenLayer, iINode, iHNode);
                str += $"{w} * {inTensor[iINode]} + ";
                sum += w * inTensor[iINode];
            }

            float b = mlp.GetBias(HiddenLayer, iHNode);
            str += $"{b}";
            sum += b;
            str += $"= {hTensor[iHNode]} ({sum})";
            Debug.Assert(Mathf.Approximately(sum, hTensor[iHNode]));
            Debug.Log(str);
        }
        tca.Dispose();
        ex.Dispose();
        worker.Dispose();
        Debug.Assert(true);
    }
コード例 #2
0
        private void OnGenerateVisualContent(MeshGenerationContext cxt)
        {
            MeshParts            mp  = new MeshParts();
            MultiLayerPerception mlp = _TestMLP;

            AddRect(mp, 0, 1, Color.gray);
            if (mlp != null)
            {
                using (IWorker oneshotSyncWorker =
                           WorkerFactory.CreateWorker(_testMLP.model, _extraLayers, WorkerFactory.Device.GPU)) {
                    using (Tensor obsTensor = new Tensor(new TensorShape(1, mlp._shape.inputSize))) {
                        if (_observe.Length < mlp._shape.inputSize)
                        {
                            _observe = new float[mlp._shape.inputSize];
                        }
                        for (int iINode = 0; iINode < mlp._shape.inputSize; iINode++)
                        {
                            obsTensor[iINode] = _observe[iINode];
                        }

                        oneshotSyncWorker.Execute(obsTensor).FlushSchedule();
                    }

                    for (int iINode = 0; iINode < mlp._shape.inputSize; iINode++)
                    {
                        AddRect(mp, GetNodePos(0, iINode), NodeSize, ActNodeColor(_observe[iINode]));
                    }


                    using (Tensor hvr = oneshotSyncWorker.PeekOutput(MultiLayerPerception.LayerNames.Hidden)) {
                        using (Tensor hva = oneshotSyncWorker.PeekOutput(MultiLayerPerception.LayerNames.HiddenActive)) {
                            for (int iHNode = 0; iHNode < mlp._shape.hiddenSize; iHNode++)
                            {
                                AddRect(mp, GetNodePos(1, iHNode), NodeSize, RawNodeColor(hvr[iHNode]));
                                AddRect(mp, GetNodePos(1, iHNode) + new float2(0.5f, 0) * NodeSize, new float2(0.5f, 1) * NodeSize,
                                        ActNodeColor(hva[iHNode]));
                            }
                        }
                    }

                    using (Tensor ovr = oneshotSyncWorker.PeekOutput(MultiLayerPerception.LayerNames.Output)) {
                        using (Tensor ova = oneshotSyncWorker.PeekOutput()) {
                            for (int iONode = 0; iONode < mlp._shape.outputSize; iONode++)
                            {
                                AddRect(mp, GetNodePos(2, iONode), NodeSize, RawNodeColor(ovr[iONode]));
                                AddRect(mp, GetNodePos(2, iONode) + new float2(0.5f, 0) * NodeSize, new float2(0.5f, 1) * NodeSize,
                                        ActNodeColor(ova[iONode]));
                            }
                        }
                    }
                }

                string[] layerNames = new string[]
                { MultiLayerPerception.LayerNames.Hidden, MultiLayerPerception.LayerNames.Output };
                float2 xBuf = NodeSize / 2;
                xBuf.y = 0;
                int prvLayer = 0;
                int curLayer = 1;
                foreach (string layerName in layerNames)
                {
                    TensorShape tShape = _testMLP.GetLayerShape(layerName);
                    for (int iPNode = 0; iPNode < tShape.flatHeight; iPNode++)
                    {
                        for (int iCNode = 0; iCNode < tShape.flatWidth; iCNode++)
                        {
                            float2 posI = GetNodePos(prvLayer, iPNode) + NodeSize / 2;
                            float2 posW = GetNodePos(curLayer, iCNode) + NodeSize / 2;

                            float t = 0.5f + mlp.GetWeight(layerName, iPNode, iCNode);
                            DrawLine(mp, posI + xBuf, posW - xBuf, 0.025f, TurboColorMap.Map(t));
                        }
                    }

                    prvLayer = curLayer;
                    curLayer++;
                }
            }
            MeshWriteData meshData = cxt.Allocate(mp.vertices.Count, mp.IndicesCount);

            if (meshData.vertexCount > 0)
            {
                meshData.SetAllVertices(mp.vertices.ToArray());
                meshData.SetAllIndices(mp.GetIndices());
            }
        }