web-dev-qa-db-ja.com

ニューラルネットワークで活性化関数を記述して、任意の次元のレイヤーアーキテクチャを処理するにはどうすればよいですか?

私はClojureで整数の配列を取り、ニューラルネットワークのレイヤーを表すデータ構造を返すことができるニューラルネットワークを作成しています:so (make-layers [1 4 5])は次のように評価されます:

[[0]          <-- input
 [0 0 0 0]    <-- hidden
 [0 0 0 0 0]] <-- output 

ただし、ネットワークの重みで活性化関数を実行すると、重みの転置を使用して1次元ベクトルの入力で行列の乗算を実行できないというcore.matrixエラーが発生します。

(core.matrix.operators/* inputs (transpose weights))
 user=> Incompatible shapes, cannot broadcast [1] to [4 2]

行列の乗算の観点からこれが機能しない理由は理解できますが、任意の長さのレイヤーを処理するように関数を書き直す方法がわかりません。

これが私が取り組んでいることを示す要点です: https://Gist.github.com/gamma235/b8db845a512c60d123af

3
kurofune

本当にmmul(行列の乗算)を使用したいのに、*(要素ごとの乗算)を使用しているようです。

長さ1の入力ベクトルから長さ4の隠れ層を計算する場合、重み行列は4x1行列である必要があります。例:

(def weights [[1.0] [2.0] [3.0] [4.0]]) ;; a 4x1 weight matrix
(def input [1.5])
(mmul weights input)
=> [1.5 3.0 4.5 6.0]

お役に立てば幸いです。

1
mikera