Kerasモデルをtensorflowjson形式に変換し、コンピューターにローカルに保存しました。以下のコマンドを使用して、そのjsonモデルをjavascriptコードにロードしようとしています
model = await tf.loadModel('web_model')
しかし、モデルはロードされていません。ローカルファイルシステムからtensorflowjsonモデルをロードする方法はありますか?
モデルをブラウザにロードしようとしていることはわかっていますが、ノードでロードしようとしている人がここに到着した場合は、次のようにします。
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);
LoadModel
は内部でfetch
を使用します。また、fetchはローカルファイルに直接アクセスできません。これは、サーバーによって提供されるファイルを取得するために使用されることを目的としています。これについての詳細 ここ 。ブラウザでローカルファイルをロードするには、2つの方法があります。
<input type="file"/>
または、サーバーによってファイルを提供します。
これらの2つのシナリオでは、tf.js
モデルをロードする方法を提供します。
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]]));
これを行うには、次の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')
})()
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
に感謝します。
安全でない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)
})
}
その後、正しいモデルローダーを使用していることを確認してください ローダーの問題に関する私のコメント
しかし、あなたの重みは正しくありません-私はいくつかのエンコーディングの問題があることを理解しています。
モデルの読み込みに関するドキュメントを確認してください: https://js.tensorflow.org/api/latest/#Models-Loading
tf.loadModel
を使用すると、HTTP経由で提供される必要があるモデル定義へのURLである文字列を取得できます。これは、これらのファイルを提供するためにhttpサーバーを起動する必要があることを意味します(CORSのため、ファイルシステムにリクエストを送信することはできません)。
このパッケージはあなたのためにそれをすることができます: npmjs.com/package/http-server
あなたは試すことができます:
const model = await tf.models.modelFromJSON(myModelJSON)