カタベログ

IT技術に関するブログを書きたい.食べ物関連はInstagramをご参照の事.

リカレントネットワークによる記憶画像の想起 [追記]

ネックであった重み計算でのループ回数の削減を試みました.今までは記憶させるパターンの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]

こんな感じで該当部分を書き換えると動くと思います.なんでこんな簡単なことを見落としていたのだろう・・・愚かですね.