最も古典的なニューラルネットワーク「ホップフィールドネットワーク」を学ぶ:FPGAにニューラルネットワークを実装する(2)(1/2 ページ)
FPGAにニューラルネットワークを実装するプロセスを学ぶ本連載。第2回では、ニューラルネットワークのモデルの一つである「ホップフィールドネットワーク」を用いて、PC上で文字認識を行えるようにする。
はじめに
連載第2回の今回は、ニューラルネットワークのモデルの一つである「ホップフィールドネットワーク」について学びます。
今回の演習は全てPCでの作業となります。狙いとしては、ホップフィールドネットワークの計算方法や、それに伴うアルゴリズム、さらにはプログラム言語による実装方法を理解していただくことにあります。
連載第1回でも述べましたが、当初の連載数回まではPCで学習を行ってから、推論(実行)をFPGAで行うという手順になります。その間はこの第2回記事に立ち戻り、参照していただくこともあるでしょう。読者の皆さんの中には、ニューラルネットワークをFPGAに実装するところまでに多くのハードルがあるのだろうかと感じられる方もいらっしゃるかもしれません。
まずは今回の記事で、ニューラルネットワークを扱うということに対して感じているハードルが実際にはそれほど高くないと実感していただければと思います。また、単純にニューラルネットワークの基本をPCで試してみたいとい方にとってもよい演習になるでしょう。
⇒連載「FPGAにニューラルネットワークを実装する」バックナンバーはこちら
ホップフィールドネットワークとは
ホップフィールドネットワークは、米国の物理学者ジョン・ホップフィールド(J.J. Hopfield)氏が考案したニューラルネットワークのモデルの一つです。最も古典的なモデルで、後に登場するボルツマンマシンなどのニューラルネットワークモデルに多大な影響を与えました。というわけで、ニューラルネットワークモデルの中では古臭いモデルであることは否めないのですが、ニューラルネットワークの基本を押さえるにはむしろ最適であるともいえます。
PCの環境
PCはWindows PCを使っています。バージョンはWindows 10 Pro、プロセッサはIntel Core i5-4310U、RAMは16GBで、一般的なソフトウェア開発に用いるPCと言っていいかと思います。今回の文字認識を行うニューラルネットワークの学習プログラムはC/C++言語で開発しています。C/C++言語のバージョンは「gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)」です。
5×5ドットで表現した4つの文字を学習させる
アルファベットの大文字である“D”“C”“J”“M”を、PCのC言語で書いたプログラムで覚えこませます。これらの文字は5×5ドットの枠内で表現されています(図1、図2)。
#### # # # # # # ###
##### # # # # ### #### # # # #### # # ## ## # # # # # # #
リスト1は“D”の文字に関するコンピュータ内部での表現です。以降を含めて本稿で用いるプログラムリストは以下のリポジトリから参照できます。ファイル名は「neuro.c」です。また、リストに示す行番号は、執筆時にリポジトリにアップロードした時のもので、その後リポジトリのファイルが更新されるとここで示した行番号とずれる可能性がありますので、その点はご了承ください。
⇒本連載で用いるプログラムリストがあるGitHubのリポジトリはこちら
25要素の1次元配列に、5×5の文字のドットを1と-1の数値で表現しています。1が「学習させる“D”の文字を#の並びで表現したもの」で示した“#”に当たります。また、-1がスペースに当たります。
3: int D[25]={ 4: 1, 1, 1, 1,-1, 5: -1, 1,-1,-1, 1, 6: -1, 1,-1,-1, 1, 7: -1, 1,-1,-1, 1, 8: -1, 1, 1, 1,-1 9: };
“J”“C”“M”の文字も同様に、プログラムリスト内の10〜28行目の中で、それぞれj[25]、C[25]、M[25]として値が格納されています。
Copyright © ITmedia, Inc. All Rights Reserved.