web-dev-qa-db-ja.com

javascriptでローカルファイルシステムからTensorflowjsモデルをロードします

Kerasモデルをtensorflowjson形式に変換し、コンピューターにローカルに保存しました。以下のコマンドを使用して、そのjsonモデルをjavascriptコードにロードしようとしています

model = await tf.loadModel('web_model')

しかし、モデルはロードされていません。ローカルファイルシステムからtensorflowjsonモデルをロードする方法はありますか?

3
user2693313

モデルをブラウザにロードしようとしていることはわかっていますが、ノードでロードしようとしている人がここに到着した場合は、次のようにします。

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.loadModel(handler);
5
jafaircl

LoadModelは内部でfetchを使用します。また、fetchはローカルファイルに直接アクセスできません。これは、サーバーによって提供されるファイルを取得するために使用されることを目的としています。これについての詳細 ここ 。ブラウザでローカルファイルをロードするには、2つの方法があります。

<input type="file"/>

または、サーバーによってファイルを提供します。

これらの2つのシナリオでは、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')
 })()
2
edkeveked
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に感謝します。

1
Manash Mandal

安全でないchromeインスタンスを使用できます:

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

このスクリプトを追加してフェッチ関数を再定義するよりも

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)
  })
}

その後、正しいモデルローダーを使用していることを確認してください ローダーの問題に関する私のコメント

しかし、あなたの重みは正しくありません-私はいくつかのエンコーディングの問題があることを理解しています。

0
Mahalov Ivan

モデルの読み込みに関するドキュメントを確認してください: https://js.tensorflow.org/api/latest/#Models-Loading

tf.loadModelを使用すると、HTTP経由で提供される必要があるモデル定義へのURLである文字列を取得できます。これは、これらのファイルを提供するためにhttpサーバーを起動する必要があることを意味します(CORSのため、ファイルシステムにリクエストを送信することはできません)。

このパッケージはあなたのためにそれをすることができます: npmjs.com/package/http-server

0
Nikhil

あなたは試すことができます:

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

ここではtensorflow.orgのドキュメントにあります

0
user10302261