2021年12月7日火曜日

Tensorflow.jsのimportなどで遭遇したエラーの対処

【what is this】多くの場合、Tensorflowは、Python環境で使われているようです。しかし、いくつかの理由から(その一例はここにありますが)、JavaScriptで動かすTensorflow.jsへも注目が高まっているようです。本記事は、Tensoflow.jsの基礎を解説したテキスト[1]の例題で発生した、幾つかのエラーに対処した時のメモです。推奨すべき対処法かどうかは分かりませんが、取りあえず正常に動かすための備忘録です。

■ テキスト「Learning Tensorflow.js」
 このテキスト[1]は、今年5月に刊行されたばかりです。Tensorflow.jsの利用に関する基礎知識を与えるものです。例題の解説も分かりやすいです。全部で12章ありますが、8章までは、通常のWebサーバの元で、第9章以降はNode.jsサーバで動かす例題があります。



 第8章の例題を、Visual Studio Codeの環境で実行していて、次のようなエラーメッセージがでました。他の人にもよく起こる?ようであり、対処方法に関する記事をたくさんでていました。それらを参考に対処してみました。

 

■ Tensorflos.jsの例題実行で発生したエラーへの対処
(1)importに関するエラー

例えば、あるJavaScriptファイルindex.jsの中の以下のimportです。
import * as tf from "@tensorflow/tfjs";

これを実行すると以下のエラーが発生しました:
Uncaught SyntaxError: Cannot use import statement outside a module

ネットで調べると、以下のようにすれば良い、という説明がありました:

Add "type": "module" to your package.json file.
{
 // ...
 "type": "module",
  // ...
}

でも、その通りにしても、相変わらずエラーのままです。そこで、以下のようにしてみました。
このimportを削除する。(コメント化して残す。)
htmlの<body>の中に以下を挿入する:
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>

以上にようにして、このhtmlファイルをVisual Studio CodeのOpen with Live Serverで起動させたところ、正常動作しました!

(2)moduleに関するエラー
 例えば、あるJavaScriptファイルindex.jsの中にある以下の3つのimportです。
import * as tf from "@tensorflow/tfjs";
import "core-js/stable";
import "regenerator-runtime/runtime";

これに対して、以下のエラーメッセージが出ました:
Uncaught TypeError: Failed to resolve module specifier "@tensorflow/tfjs". Relative references must start with either "/", "./", or "../".

以下のように対処しました:
3行とも削除する。(コメント化して残す。)
さらに、(1)の場合と同じく、htmlの<body>の中に以下を追加。
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>

このように改変した結果、正常動作となりました!

(3)Danfo.jsに関するエラー
 Danfo.jsは、PythonのPandas相当の機能を使えるようにするものです。これも、上記(1)、(2)の場合と同様に、JavaScriipt内でのimportに失敗する場合は、htmlのタグで指定すれば正常に使えました。
これをコメント化する-> import dfd from "danfojs-node"
さらに、htmlの<body>の中に以下を追加。
<script src="https://cdn.plot.ly/plotly-1.2.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/danfojs@0.3.4/lib/bundle.min.js"></script> 

なお、Dataframe object dfを使って、各カラム毎の統計値を計算できるのですが、その際、非数値(あるいはnull項目)のカラムを取り除いた後に、df.describe().print() を実行する必要があります。

■ 第9章以降の例題の実行
 以上で、第8章までの例題は問題なく動作するようになりました。Mac miniでもLet's NoteでもOKでした。第9章以降では、Node.jsサーバを利用する例題があります。Node.js環境がうまく設定できない場合には、通常のWebサーバで動くように改変しようと思います。

参考資料
[1] Grant Laborde, "Learning Tensorflow.js - Powerful Machine Learning in JavaScript", O'Reilly, 2021-05-07.

0 件のコメント:

コメントを投稿