首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法在统一内部运行神经网络或GANs?

是否有一种方法在统一内部运行神经网络或GANs?
EN

Stack Overflow用户
提问于 2022-10-09 12:39:08
回答 1查看 51关注 0票数 -2

我只是想也许这是可能的,但我不知道该怎么做。像GPT或稳定扩散之类的神经网络可以通过C#脚本在团结内部运行吗?如果是这样的话,是怎么做的?

EN

回答 1

Stack Overflow用户

发布于 2022-10-09 12:57:46

是的,首先您需要将您的模型转换为ONNX。然后,您需要在项目中安装梭鱼。下面的代码(几年前我在互联网上发现)接收一个ONNX模型,并将一个精灵作为输入提供给它。(我也是用来做CNN模型的)

代码语言:javascript
复制
    [SerializeField] private NNModel modelSource; // ONNX model (asset)
    private Model model; // Runtime model wrapper (binary)
    private IWorker worker; // Barracuda worker for inference
  
    private void Start()
    {
        model = ModelLoader.Load(modelSource); // Load ONNX model as runtime binary model 
        worker = WorkerFactory.CreateWorker(WorkerFactory.Type.ComputePrecompiled, model); // Create Worker
        
    }

    public void Classify(Sprite userInput)
    {
        // the model receives one image, with a fixed width and height and 3 channels (RGB)
        var inputTensor = new Tensor(1, InputHeight, InputWidth, 3);

        var userInputTexture = Resize(userInput.texture, InputWidth, InputHeight);

        var input = userInputTexture.GetPixels32();
        // normalize input
        for (int z = 0, y = 0; y < InputHeight; y++)
        {
            for (var x = 0; x < InputWidth; x++, z++)
            {
                inputTensor[0, InputHeight - y - 1, x, 0] = input[z].b - mean[0];
                inputTensor[0, InputHeight - y - 1, x, 1] = input[z].g - mean[1];
                inputTensor[0, InputHeight - y - 1, x, 2] = input[z].r - mean[2];
            }
        }

        var outTensor = ExecuteInParts(inputTensor);
        var maxVal = Mathf.Max(outTensor.ToReadOnlyArray());
    }

    private Tensor ExecuteInParts(Tensor I, int syncEveryNthLayer = 5)
    {
        var executor = worker.StartManualSchedule(I);
        var it = 0;
        bool hasMoreWork;

        do
        {
            hasMoreWork = executor.MoveNext();
            if (++it % syncEveryNthLayer == 0)
                worker.FlushSchedule();
        } while (hasMoreWork);

        return worker.PeekOutput();
    }

    private static Texture2D Resize(Texture texture2D, int targetX, int targetY)
    {
        var rt = new RenderTexture(targetX, targetY, 24);
        RenderTexture.active = rt;
        Graphics.Blit(texture2D, rt);
        var result = new Texture2D(targetX, targetY);
        result.ReadPixels(new Rect(0, 0, targetX, targetY), 0, 0);
        result.Apply();
        return result;
    }

    private void OnApplicationQuit()
    {
        worker.Dispose();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74004833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档