ホップフィールドネットワークの想起過程のPython実装

はじめに

前回の記事ではC言語でHopfieldモデルの想起過程を実装していた。

tam5917.hatenablog.com

当然、Pythonでも実装可能なので、その実装を紹介するのが本記事の主旨である。

実装

以下に置いた。Enjoy!

実装している機能そのものはC言語版と同様である。ランダム記憶パターンを生成するための関数 define_patterns や状態を初期化するための関数 init_state の実装は、Numpy の力を借りて簡潔に書くことができた。また記憶行列を学習する learn 関数もまた、Numpyの行列計算を駆使することで簡潔に書くことができた。実際、これだけの行数で済む:

num_neurons = patterns.shape[1]
weights = (patterns.T @ patterns).astype(np.float64)
weights = weights / num_neurons
if self_connection is False:
    np.fill_diagonal(weights, 0.0)

コード全体を見ても、メモリ確保・解放まわりのコードがなくなったので、行数が減ってスリムになった。実行速度そのものはC言語版(Ofastオプションによるコンパイル)と比べて若干遅い。

実験を動かすには以下のようなシェルスクリプトを書くとよい。

#!/bin/bash

CURDIR=$(cd $(dirname $0);pwd)
LOGDIR=${CURDIR}/log

mkdir -p ${LOGDIR}

HOPNET=hopnet_dynamics.py
PYTHON=$(which python)

N_NEURONS=1000   # The number of neurons
N_PATTERNS=80   # The maximum number of patterns
N_STEPS=25
SELF_CONNECT=False

for i in 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.6 0.7 0.8 0.9; do
    LOG_FILE=log_${i}.txt
    echo -n "Initial similarity ${i} ... "
    ${PYTHON} ${CURDIR}/${HOPNET} --num_neurons ${N_NEURONS} \
              --num_patterns ${N_PATTERNS} \
              --num_steps ${N_STEPS} \
              --similarity ${i} \
              --self_connection ${SELF_CONNECT} \
              --log_file ${LOGDIR}/${LOG_FILE}
    echo "done"
done

おわりに

Python版自体はあっという間に実装できた。今後の記事を見据えると、Python(Numpy)を使った実装も並行して準備しておくのが望ましいと考えたのだった。