投稿日:2021年6月13日
この記事はNext.jsとTensorFlow、TypeScriptを使って簡単なWebアプリ開発をする記事です。
この記事はNext.jsとTensorFlow、TypeScriptを使って簡単なWebアプリ開発をする記事です。
この記事のコードは以下の環境で確認されました。
まずは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の機能を使うことができます。
実際に動作するかどうか確認してみましょう。
実際にサンプルのコードを書いて動作を確認してみましょう。
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の処理はサーバー側で行われるのでそこで実装してみましょう。
// 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にアクセスすると以下のようなページが確認できます。
確認できました!
今回は以上です!