【问题标题】:Load Tensorflow js model from local file system in javascript在javascript中从本地文件系统加载Tensorflow js模型
【发布时间】:2019-05-07 11:19:55
【问题描述】:

我已将 keras 模型转换为 tensorflow json 格式并将其保存在本地计算机中。我正在尝试使用以下命令在 javascript 代码中加载该 json 模型

model = await tf.loadModel('web_model')

但是模型没有被加载。 有没有办法从本地文件系统加载 tensorflow json 模型?

【问题讨论】:

  • 我猜你不是从开发服务器上服务的?使用浏览器打开 html 文件会导致用于获取文件的 xhr 请求出现问题。也许试试npmjs.com/package/http-server
  • 我刚刚开始探索 tensorflow js 并使用我的浏览器进行测试

标签: javascript tensorflow tensorflow.js


【解决方案1】:

我知道您正在尝试在浏览器中加载您的模型,但如果有人来到这里尝试在 Node 中执行此操作,方法如下:

const tf = require("@tensorflow/tfjs");
const tfn = require("@tensorflow/tfjs-node");
const handler = tfn.io.fileSystem("./path/to/your/model.json");
const model = await tf.loadLayersModel(handler);

【讨论】:

    【解决方案2】:

    LoadModel 在后台使用fetch。并且 fetch 不能直接访问本地文件。它旨在用于获取服务器提供的文件。更多关于这个here。 使用浏览器加载本地文件,有两种方法,要求用户使用

    上传文件
    <input type="file"/>
    

    或由服务器提供文件。

    在这两种情况下,tf.js 提供了加载模型的方法。

    1. 通过要求用户上传文件来加载模型

    html

    <input type="file" id="upload-json"/>
    <input type="file" id="upload-weights"/>
    

    js

    const uploadJSONInput = document.getElementById('upload-json');
    const uploadWeightsInput = document.getElementById('upload-weights');
    const model = await tfl.loadModel(tf.io.browserFiles(
     [uploadJSONInput.files[0], uploadWeightsInput.files[0]]));
    
    1. 使用服务器提供本地文件

    为此,可以使用以下 npm 模块 http-server 来提供包含权重和模型的目录。可以使用以下命令安装:

     npm install http-server -g
    

    在目录中,可以运行以下命令来启动服务器:

    http-server -c1 --cors .
    

    现在可以加载模型了:

     // load model in js script
     (async () => {
       ...
       const model = await tf.loadFrozenModel('http://localhost:8080/model.pb', 'http://localhost:8080/weights.json')
     })()
    

    【讨论】:

    • 非常感谢您的帮助。但是我在尝试加载模型中的文件时遇到以下错误 Uncaught (in promise) TypeError: Failed to execute 'readAsText' on 'FileReader': parameter 1 is not of type 'Blob'.
    • 也许,您必须在使用事件监听器加载文件后读取文件
    • 使用 http 服务器为我工作
    【解决方案3】:
    const tf = require('@tensorflow/tfjs');
    const tfnode = require('@tensorflow/tfjs-node');
    
    async function loadModel(){
        const handler = tfnode.io.fileSystem('tfjs_model/model.json');
        const model = await tf.loadLayersModel(handler);
        console.log("Model loaded")
    }
    
    
    loadModel();
    

    这在节点中对我有用。感谢jafaircl

    【讨论】:

      【解决方案4】:

      你可以试试:

      const model = await tf.models.modelFromJSON(myModelJSON)
      

      Here it is in the tensorflow.org docs

      【讨论】:

      • 您无法使用modelFromJSON 加载分片权重(.bin 文件)
      【解决方案5】:

      如果您将 React 与 create-react-app 一起使用,您可以将保存的模型文件保存在您的 public folder 中。

      例如,假设您想使用blazeface model。你会

      1. Download the .tar.gz model 来自该网页。

      2. 将模型解压到应用的公共目录中。所以现在您在公共子目录中拥有来自 .tar.gz 文件的文件:

        %YOUR_APP%/public/blazeface_1_default_1/model.json
        %YOUR_APP%/public/blazeface_1_default_1/group1-shard1of1.bin
        
      3. 在你的 React 应用中加载模型

        tf.loadGraphModel(process.env.PUBLIC_URL + 'blazeface_1_default_1/model.json'
        

      【讨论】:

        【解决方案6】:

        查看我们关于加载模型的文档:https://js.tensorflow.org/api/latest/#Models-Loading

        您可以使用 tf.loadModel 获取一个字符串,该字符串是您的模型定义的 URL,需要通过 HTTP 提供服务。这意味着您需要启动一个 http-server 来提供这些文件(由于 CORS,它不允许您向文件系统发出请求)。

        这个包可以为你做到这一点:npmjs.com/package/http-server

        【讨论】:

          【解决方案7】:

          您可以使用不安全的 chrome 实例:

          C:\Program Files (x86)\Google\Chrome\Application>chrome.exe --disable-web-security --disable-gpu --user-data-dir=C:/Temp
          

          你可以添加这个脚本来重新定义 fetch 函数

          async function fetch(url) {
            return new Promise(function(resolve, reject) {
              var xhr = new XMLHttpRequest
              xhr.onload = function() {
                resolve(new Response(xhr.responseText, {status: 200}))
              }
              xhr.onerror = function() {
                reject(new TypeError('Local request failed'))
              }
              xhr.open('GET', url)
              xhr.send(null)
            })
          }
          

          之后请务必使用正确的模型加载器 my comment about loader issue

          但是您的权重会不正确 - 据我了解存在一些编码问题。

          【讨论】:

            【解决方案8】:

            如果您尝试在服务器端加载它,请使用@tensorflow/tfjs-node 而不是@tensorflow/tfjs 并更新到0.2.1 或更高版本以解决此问题。

            【讨论】:

              【解决方案9】:

              我正在使用 React js 加载模型(用于图像分类和更多机器学习的东西)

              Tensorflow.js 不支持 Api 读取先前训练的模型

                  const file= new Blob()
                  file.src=modelJSON
                  const files= new Blob()
                  files.src=modelWeights
                  console.log(files)
                  const model= await tf.loadLayersModel(tf.io.browserFiles([file, files]));
              

              [![在此处输入图片描述][1]][1]

              如果您使用 Web 应用程序(对于 tensorflow.lite,您可以使用 opencv.readTensorflowmodel(model.pb , 重量.pbtxt)

              参考:How to load tensorflow-js weights from express using tf.loadLayersModel()?

                   const classifierModel = await tf.loadLayersModel(            
                          "https://rp5u7.sse.codesandbox.io/api/pokeml/classify"
                      ); 
                      const im = new Image()
                          im.src =imagenSample//'../../../../../Models/ShapesClassification/Samples/images (2).png';
                      const abc= this.preprocessImage(im);
              const preds = await classifierModel.predict(abc)//.argMax(-1);
                          console.log('<Response>',preds,'Principal',preds.shape[0],'DATA',preds.dataSync())
                          const responde=[...preds.dataSync()]
                          console.log('Maxmimo Valor',Math.max.apply(Math, responde.map(function(o) { return o; })))
                          let indiceMax = this.indexOfMax(responde)
                          console.log(indiceMax)
                          console.log('<<<LABEL>>>',this.labelsReturn(indiceMax))
              

              【讨论】:

                【解决方案10】:

                如果你使用的是 Django,你应该:

                1. 在您的应用中创建一个目录static并将您的模型放在那里。

                2. 将该 static 目录加载到您要使用模型的模板中:

                  var modelPath = "{% static 'sampleModel.json' %}">
                  

                别忘了加载 tensorflow.js 库:

                <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
                
                1. 现在您可以加载模型了:

                  <script>model = await tf.loadGraphModel(modelPath)</script>
                  

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-03-08
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-03-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多