ざっくりとした質問内容は,**『学習済みのニューラルネットワークにおいて,出力側から入力を入れて,逆方向から演算することで,元の入力値の復元は可能か?』**というものです.
例えば,多層パーセプトロンを用いてMNISTの分類器を作ったとします.
モデルの内部には,学習させた重みパラメータ(weightとbias)が存在します.
そこで,本来出力値である10個の確率の配列を,出力側から入力し,逆方向に演算していくことで入力値である数字の手書き画像を復元することは可能なのか?というものです.
試しに学習させたモデルの重みとバイアスを出力側から順番にget_weights()で取り出し,
逐一matmulで演算したものを描画してみたのですが,モザイク状のイメージしか出力されませんでした.
演算は以下のように行ったのですが,やはり間違っているのでしょうか.
(形状なども無理やり合うように転置したので,おかしい部分があるかと思います)
Python
1idx = np.random.randint(x_test.shape[0]) 2inpt = x_test[idx] 3res = myModel.predict(inpt[tf.newaxis, ...]) # 確率値 4 5l = myModel.layers[3] 6res += l.get_weights()[1] # バイアス項 7res = np.matmul(l.get_weights()[0], res.T) # 重み 8 9l = myModel.layers[2] 10res = res.T + l.get_weights()[1] # バイアス項 11res = np.matmul(l.get_weights()[0], res.T) # 重み
上記演算では,活性化関数(ここではsigmoidおよびsoftmax)を全く考慮していませんが,やはり必要でしょうか.
確率値ごとに,このモザイク状の画像もそれぞれの特徴があるようには見受けられました.
(配列の2の部分だけが大きい(=2が答え)ときは特徴的な黒い横棒が表れる等)
しかし数字の手書き画像とは程遠いものです.
原理上可能ということであれば,もう少し突き詰めて考えてみようと思っているので,
可能か不可能かということだけでもご教示頂ければ幸いです.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/09 05:12