CNNの勉強用にフルスクラッチでコードを起こして、SDSoCでZYBOに適用したのだがデータがPLに転送できないメモリアクセスエラーが発生した。
エラー内容からどの配列でエラーが起きているかわからないのでなにが原因か解らなかった。
メモリ領域もsds_allocしたし、AXIバスも正常に生成されている。
ソースコードをよく見なおしてみると、CNNの畳み込みのフィルタ配列が勘違いでメモリリークを起こしていた。
よく見ると、フィルタが半分はガボールフィルタで半分が全結合の中間層の重みが割り当たっていたようだ。
まだ、詳細に確認したわければ無いがガボールフィルタは最初に生成した時点から変更はしない。
全結合の中間層の重みは学習しながらパラメータを修正していように作っていた。
つまり、畳み込みのフィルタの半分が動的に変更される中で全結合の学習を行っていた形になっていた。
検証範囲に限った話だがメモリリークを修正して正常な形で動作確認を行った時よりもメモリリークしてた時のほうが結果が良い方向にでた。
なぜか学習の収束も速く、メモリリークよりも正常時のほうが1.7倍ぐらいかかるようになった。
畳み込みのフィルタを全結合の中間層の重みを使うといいかもしれないという怪我の功名的な発見だった。
こういうのもありなのかもね・・・