私は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
本当に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]
お役に立てば幸いです。