プロジェクト 中間発表

プロジェクト 中間発表
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)