※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。

次のページ>
【Next.js+Tensorflow+TypeScript】機械学習Webアプリの作成|Part2

【Next.js+Tensorflow+TypeScript】機械学習Webアプリの作成|Part1

web開発 フロント開発 機械学習 TypeScript tensorlflow.js DeepLearning next.js

投稿日:2021年6月13日

このエントリーをはてなブックマークに追加
この記事はNext.jsとTensorFlow、TypeScriptを使って簡単なWebアプリ開発をする記事です。

はじめに

この記事について

この記事はNext.jsTensorFlowTypeScriptを使って簡単なWebアプリ開発をする記事です。

環境について

この記事のコードは以下の環境で確認されました。

  • node v10.19.0
  • npm v6.14.4

参考コード


実践

まずはcreate-next-appを使用してNext.jsのアプリケーションを作成しましょう。今回はtypescriptのプロジェクトを作成するので--typescriptオプションをつけます。

ターミナル
$ npx create-next-app --typescript --use-npm app

まずはブラウザでtensorflowを利用するコードを実装してみます。
web開発用のライブラリは@tensorflow/tfjsです。TypeScript用の型定義ファイルはライブラリにデフォルトで含まれているため別途インストールの必要はありません。

ターミナル
$ cd app
$ npm i --save @tensorflow/tfjs

これでブラウザ、サーバーの双方の処理でTensorflowの機能を使うことができます。

実際に動作するかどうか確認してみましょう。

ブラウザ側の動作の確認

実際にサンプルのコードを書いて動作を確認してみましょう。

index.tsx
import * as tf from "@tensorflow/tfjs";
import { useState } from "react";

/**
 * TOPページ
 * @returns
 */
export default function Home() {
    // [ state ] サンプルのリザルト
    const [result, setResult] =
        useState<tf.Tensor<tf.Rank> | tf.Tensor<tf.Rank>[] | null>(null);

    // [ state ] 実行状態を管理
    const [executing, setExecuting] = useState<boolean>(false);

    /**
     * サンプルの学習と推論を実行
     */
    const executeModelFit = () => {
        // 既に実行中の場合は即終了
        if (executing) {
            return;
        } else {
            setExecuting(true);
        }
        // 線形回帰モデルを定義
        const model = tf.sequential();
        model.add(tf.layers.dense({ units: 1, inputShape: [1] }));

        model.compile({ loss: "meanSquaredError", optimizer: "sgd" });

        // 訓練用の模擬データを生成
        const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
        const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);

        // データを使用してモデルを訓練
        model.fit(xs, ys, { epochs: 500 }).then(() => {
            // モデルを使用してモデルが見たことのないデータポイントを推論
            setResult(model.predict(tf.tensor2d([5], [1, 1])));
            // 結果を確認するためにブラウザのDevToolsを開く
            setExecuting(false);
        });
    };

    return (
        <div>
            <button onClick={executeModelFit} disabled={executing}>
                実行
            </button>
            <main>
                {executing
                    ? "処理中です…。"
                    : result
                    ? `結果:${result}`
                    : "実行ボタンをクリック!!"}
            </main>
        </div>
    );
}

このコンポーネントでは実行ボタンをクリックするとexecuteModelFit()関数が実行されます。executeModelFit()関数内ではTensorflowのライブラリを使用して、モデルの構築、サンプルデータの学習、推論を行っています。エラーが出力されずに無事終了すれば、環境構築は問題なく終了できたことを意味します。

実際に実行してみましょう。

ターミナル
$ npx next dev

開発用サーバーが無事起動できたらブラウザでhttp://localhost:3000を確認してみます。
下のようになればOKです!

▲ブラウザの動作確認

サーバー側の環境の確認

サーバー側でも実行できるか確認してみましょう。Next.jsではapiの処理はサーバー側で行われるのでそこで実装してみましょう。

./pages/api/hello.ts
// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from "next";
import * as tf from "@tensorflow/tfjs";

type Data = {
    result: string;
};

export default (req: NextApiRequest, res: NextApiResponse<Data>) => {
    // 線形回帰モデルを定義
    const model = tf.sequential();
    model.add(tf.layers.dense({ units: 1, inputShape: [1] }));

    model.compile({ loss: "meanSquaredError", optimizer: "sgd" });

    // 訓練用の模擬データを生成
    const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
    const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);

    // データを使用してモデルを訓練
    model.fit(xs, ys, { epochs: 500 }).then(() => {
        // モデルを使用してモデルが見たことのないデータポイントを推論
        const result = model.predict(tf.tensor2d([5], [1, 1]));
        res.status(200).json({ result: result.toString() });
    });
};

実行してみましょう。

これでhttp://localhost:3000/api/helloにアクセスすると以下のようなページが確認できます。

▲動作の確認

確認できました!

今回は以上です!

このエントリーをはてなブックマークに追加

次のページ>
【Next.js+Tensorflow+TypeScript】機械学習Webアプリの作成|Part2

関連記事

記事へのコメント