リカレントネットワークによる記憶画像の想起 [追記]
ネックであった重み計算でのループ回数の削減を試みました.今までは記憶させるパターンのN次元ベクトルをp個生成するという形でした.今回のは記憶させるパターンのi番目の画素を要素としたp次元ベクトルをN個生成します.こうすることで内積一発で重みが計算できるので1000個記憶させても2個記憶させたときと同じくらいの速度で重みが計算されます.たぶん,これ以上は内積を利用した高速化は無理だと思います.
#直交する記憶パターンの生成 for i in xrange(self.__size): tmpNDArray = np.zeros(self.__patternNum) tmpNDArray[0] = self.__lena[i] for k in xrange(1, self.__patternNum): tmpNDArray[k] = (1.0 if(rnd.random() > 0.5) else -1.0) self.__pattern.append(tmpNDArray) self.__weight = np.zeros((self.__size, self.__size)) for i in xrange(self.__size): for j in xrange(i, self.__size): if i != j : self.__weight[i][j] = np.dot(self.__pattern[i], (self.__pattern[j]).T) / self.__size self.__weight[j][i] = self.__weight[i][j]
こんな感じで該当部分を書き換えると動くと思います.なんでこんな簡単なことを見落としていたのだろう・・・愚かですね.