ホームページ > 記事 > ウェブフロントエンド > TensorFlow.js を使用して基本的な AI モデルを作成するにはどうすればよいですか?
この記事では、TensorFlow.js を使用して基本的な AI モデルを作成し、より複雑なモデルを使用していくつかの興味深い機能を実現する方法を説明します。人工知能に触れ始めたばかりで、人工知能に関する深い知識は必要ありませんが、いくつかの概念を理解する必要があります。
現実の世界は非常に複雑なので、理解するには単純化する必要があります。モデルを使用して単純化できます。モデルには世界地図やチャートなど、さまざまな種類があります。
たとえば、住宅の賃貸価格と住宅面積の関係を表現するモデルを構築したい場合: まず、いくつかのデータを収集する必要があります:
部屋数 | #価格|
---|---|
3 | |
4 | |
##4 | |
5 | |
次に、これらのデータを 2 次元グラフに表示し、各パラメーター (価格、部屋数) を 1 つの次元として扱います。 次に、ラインを作成して、部屋数が多い家の家賃を予測します。このモデルは線形回帰と呼ばれ、機械学習の最も単純なモデルの 1 つです。しかし、このモデルは十分ではありません。
最初の問題は、さらにデータ (たとえば 100 万件) を追加することで解決できます。 2 番目の質問では、さらに次元を追加できます。 2 次元グラフではデータを理解し線を引くのが簡単ですが、3 次元グラフでは平面を使用できます。 しかし、次の場合はどうでしょうか。データの次元は 3 次元、4 次元、さらには 1000,000 次元です。次元が 3 次元を超えると、脳はそれをチャート上に視覚化することができませんが、次元が 3 次元を超えると超平面を数学的に計算でき、ニューラル ネットワークはこの問題を解決するために生まれました。 ニューラル ネットワークとは何ですか?ニューラル ネットワークとは何かを理解するには、ニューロンとは何かを知る必要があります。実際のニューロンは次のようになります: ニューロンは次の部分で構成されます:
機械学習のニューロン (簡略化):
アクティベーション関数は非常に便利で、主にニューラル ネットワークの力がこの関数に貢献します。活性化関数がなければ、インテリジェントなニューロン ネットワークを実現することは不可能です。ニューラル ネットワーク内に複数のニューロンがある場合でも、ニューラル ネットワークの出力は常に線形回帰となるためです。したがって、非線形問題を解決するには、各線形回帰を非線形に変換する何らかのメカニズムが必要です。これらの線形関数は、アクティベーション関数を通じて非線形関数に変換できます。 #トレーニング モデル2D 線形回帰の例で説明したように、単にグラフ内の線を使用して新しいデータを予測します。それでも、「ディープラーニング」のアイデアは、ニューラルネットワークにこの線を引くことを学習させることです。単純な線の場合は、ニューロンが 1 つだけある非常に単純なニューラル ネットワークを使用できますが、2 セットのデータを分類するなど、より複雑なことを行うモデルの場合は、ネットワークを「トレーニング」する必要があります。 プロセスは 2 次元であるため、複雑ではありません。各モデルは世界を説明するために使用されますが、「トレーニング」の概念はすべてのモデルで非常に似ています。最初のステップは、ランダムな線を描画し、アルゴリズム内で繰り返し改善し、各繰り返し中にプロセス内のエラーを修正することです。この最適化アルゴリズムは勾配降下法と呼ばれます (同じ概念のアルゴリズムには、より複雑な SGD や ADAM などもあります)。各アルゴリズム (線形回帰、対数回帰など) には誤差を測定するための異なるコスト関数があり、コスト関数は常に特定の点に収束します。凸関数でも凹関数でも構いませんが、最終的には誤差 0% の点に収束します。私たちの目標はこれを達成することです。 勾配降下法アルゴリズムを使用する場合、コスト関数内のランダムな点から開始しますが、それがどこにあるのかわかりません。それは目隠しをされて山に放り出されるようなもので、山を下りたければ一歩ずつ一番低いところまで行かなければなりません。地形が不規則である場合(凹面など)、降下はさらに複雑になります。 「勾配降下法」アルゴリズムについてはここでは詳しく説明しませんが、これは AI モデルのトレーニングの過程で予測誤差を最小限に抑えるための最適化アルゴリズムであることを覚えておくだけで十分です。このアルゴリズムは、行列の乗算に多くの時間と GPU を必要とします。通常、最初の実行でこの収束点に到達することは難しいため、学習率や正則化の追加など、一部のハイパーパラメータを変更する必要があります。勾配降下法の反復後、誤差が 0% に近づくと収束点に近づきます。これにより、予測に使用できるモデルが作成されます。 TensorFlow.js を使用したモデルのトレーニングTensorFlow.js は、ニューラル ネットワークを作成する簡単な方法を提供します。まず、 import * as tf from '@tensorflow/tfjs'; /** * 线性模型类 */ export default class LinearModel { /** * 训练模型 */ async trainModel(xs, ys){ const layers = tf.layers.dense({ units: 1, // 输出空间的纬度 inputShape: [1], // 只有一个参数 }); const lossAndOptimizer = { loss: 'meanSquaredError', optimizer: 'sgd', // 随机梯度下降 }; this.linearModel = tf.sequential(); this.linearModel.add(layers); // 添加一层 this.linearModel.compile(lossAndOptimizer); // 开始模型训练 await this.linearModel.fit( tf.tensor1d(xs), tf.tensor1d(ys), ); } //... } このクラスをトレーニングに使用します: const model = new LinearModel() // xs 与 ys 是 数组成员(x-axis 与 y-axis) await model.trainModel(xs, ys) トレーニングの終了 その後、予測を開始できます。 TensorFlow.js による予測モデルのトレーニング時に一部のハイパーパラメーターを事前に定義する必要がありますが、一般的な予測を行うのはまだ簡単です。次のコードを渡すだけで十分です: import * as tf from '@tensorflow/tfjs'; export default class LinearModel { ... //前面训练模型的代码 predict(value){ return Array.from( this.linearModel .predict(tf.tensor2d([value], [1, 1])) .dataSync() ) } } これで、予測できるようになります: const prediction = model.predict(500) // 预测数字 500 console.log(prediction) // => 420.423 TensorFlow.jsで事前トレーニングされたモデルを使用するモデルのトレーニングが最も難しい部分です。まず、データはトレーニング用に標準化されており、すべてのハイパーパラメータが正しく設定されている必要があります。私たち初心者は、これらの事前トレーニングされたモデルを直接使用できます。 TensorFlow.js は、多くの事前トレーニング済みモデルを使用でき、TensorFlow または Keras で作成された外部モデルをインポートすることもできます。たとえば、posnet モデル (リアルタイムの人間の姿勢評価) を直接使用して、いくつかの興味深いプロジェクトを実行できます: このデモのコード: https://github .com/aralroca/posenet- d3 使い方は簡単です: import * as posenet from '@tensorflow-models/posenet' // 设置一些常数 const imageScaleFactor = 0.5 const outputStride = 16 const flipHorizontal = true const weight = 0.5 // 加载模型 const net = await posenet.load(weight) // 进行预测 const poses = await net.estimateSinglePose( imageElement, imageScaleFactor, flipHorizontal, outputStride ) この JSON は pose 変数: { "score": 0.32371445304906, "keypoints": [ { "position": { "y": 76.291801452637, "x": 253.36747741699 }, "part": "nose", "score": 0.99539834260941 }, { "position": { "y": 71.10383605957, "x": 253.54365539551 }, "part": "leftEye", "score": 0.98781454563141 } // 后面还有: rightEye, leftEar, rightEar, leftShoulder, rightShoulder // leftElbow, rightElbow, leftWrist, rightWrist, leftHip, rightHip, // leftKnee, rightKnee, leftAnkle, rightAnkle... ] } これを見ることができます公式デモから、このモデルを使用してください。開発できる興味深いプロジェクトがたくさんあります。 #このプロジェクトのソース コード: https://github.com/aralroca/fishFollow-posenet-tfjsKeras モデルのインポート外部モデルは TensorFlow.js にインポートできます。以下はKerasモデル(h5形式)を使用した数値認識プログラムです。まず、tfjs_converter を使用してモデルの形式を変換します。 pip install tensorflowjsコンバータを使用します: tensorflowjs_converter --input_format keras keras/cnn.h5 src/assets最後に、モデルを JS コードにインポートします: // 载入模型 const model = await tf.loadModel('./assets/model.json') // 准备图片 let img = tf.fromPixels(imageData, 1) img = img.reshape([1, 28, 28, 1]) img = tf.cast(img, 'float32') // 进行预测 const output = model.predict(img)これは、数行のコードのみで完了します。もちろん、コードにロジックを追加してさらに多くの機能を実現することもできます。たとえば、キャンバスに数値を書き込み、その画像を取得して予測することもできます。 このプロジェクトのソース コード: https://github.com/aralroca/MNIST_React_TensorFlowJSなぜブラウザで使用する必要があるのですか? デバイスが異なるため、ブラウザーでモデルをトレーニングする場合、効率が非常に低くなる可能性があります。 TensorFlow.js を使用して WebGL を使用してバックグラウンドでモデルをトレーニングすると、Python バージョンの TensorFlow を使用するよりも 1.5 ~ 2 倍遅くなります。 しかし、TensorFlow.js が登場する前は、ブラウザーで機械学習モデルを直接使用できる API はありませんでしたが、現在では、モデルをブラウザー アプリケーションでオフラインでトレーニングして使用できるようになりました。また、サーバーへのリクエストがないため、予測が高速になります。もう 1 つの利点は、これらの計算がすべてクライアント側で行われるため、コストが低いことです。 概要
プログラミング コース |
以上がTensorFlow.js を使用して基本的な AI モデルを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。