プロジェクト 中間発表 15K1015 関根 修斗 取り組んだ内容 講義資料に記載されていた応用例 (http://enakai00.hatenablog.com/entry/20150108/1420719651) を参考に Hopfieldを用いて文字認識を行えるようなプログラムを作成した。 (dockerで起動して使う) プログラムの大まかな概要 このプログラムはnumpyとpandasを利用している。 文字は5×5の行列で表し、#と空白文字を組みわせて用いる。 例えばDの文字は以下のように入力する (['#### ',' # #',' # #',' # #',' ### ']) この入力をもとにホップフィールドを作成していく プログラムの説明(個々の関数の説明)1 names = [(x,y) for x in range(n) for y in range(n)] links = pd.DataFrame(np.zeros(shape=(n**2, n**2)), index=names, columns=names) links.index.name = 'input' links.columns.name = 'output' 始めに、linksをニューロン同士の結びつき(シナプス群)としてゼロ行列で定義している。25個 のドットがあるので25×25の行列となる。 プログラムの説明(個々の関数の説明)2 def run_hopfield(neurons, links): for index, value in links.iterrows(): a = (value * neurons).sum() if a >= 0: neurons[index] = 1 else: neurons[index] = -1 これは講義資料にあるものと同じ、シナプス群を用いて ホップフィールドネットワークの神経(ドット)の状態を更新する関数になっている プログラムの説明(個々の関数の説明)3 def create_neurons(pict): names=[(x,y) for x in range(n) for y in range(n)] neurons=pd.Series([-1]*len(names),index=names,name='Activation') for y,line in enumerate(pict): for x in range(len(line)): if line[x] != ' ': neurons[(x,y)]=1 else: neurons[(x,y)]=-1 return neurons この関数で始めの神経(ドット)の状態を定義している。#は1,空白文字は-1とする プログラムの説明(個々の関数の説明)4 def show(neurons): for y in range(n): for x in range(n): if neurons[(x,y)]==1: print '#', else: print ' ', print この関数は与えられた神経(ドット)の状態を文字として表示する機能を持つ プログラムの説明(個々の関数の説明)4 def learn_character(neurons, links): pairs = [(f,t) for f in links.index for t in links.columns if f != t] for (f,t) in pairs: if neurons[f] == neurons[t]: links.ix[f, t] += 1 else: links.ix[f, t] -= 1 この関数を実行するとホップフィールドのリンク(シナプス群)を学習させることができる 実行結果 input = create_neurons(['#### ',' # #',' # #','## #',' ### ']) show(input) run_hopfield(input,links) show(input)
© Copyright 2024 ExpyDoc