GAN(64×64ピクセル以上)は、訓練データの収集はもちろん、ネットワーク構成やハイパーパラメータ設定を調整して、いかに発散させず学習させるかというところに結構苦労します。なんとか学習が完了すると、新たな画像生成ができたことを確認したら、直ぐどうもお疲れ様でした、という感じで終わってしまいます。学習済みモデルが手に入ったことで、学習完了のフェーズから、取り組みがスタートできて、とても新鮮な気持ちになり、色々なことを試してみたくなりました。学習済みモデルを使って、入力ベクトルのオフセット、特徴量ベクトルの操作などをして遊んでみたいと思います。*前回のブログをご覧になっていない場合は、ここから前回のブログに飛びます。設定で、8×8の顔画像を生成するプログラムです。見ると、とんでもない画像が混じっていることに気付きます。少なくとも、赤枠で囲った12個はなんとかならないでしょうか。いう理由かは分かりませんが、赤枠の12個には、画像を崩す色々な要素が含まれているはずです。従って、この要素を抽出し、入力ベクトルから引いてやれば(オフセットをかければ)、生成画像の質は改善するはずです。gan(z_values)先ほどのプログラムの一部を修正します。オフセットのかけ方は単純で、赤枠の12個のベクトルの単純平均を取って、乱数から引き算するだけです。ない画像は減りましたね。afterを見てみましょう。画像を崩すベクトルを見つけて単純平均をして引くだけでも結構効果がありますね。充分ではありませんが、生成画像は確実に良い方向に向かっているようです。いうことであれば、今度は、出来の良いベクトルを見つけて単純平均をとって、足してやれば、さらに生成画像は改善するのでしょうか。出来の良いベクトルとして、緑枠の12個を選んで、単純平均をとり、今度は乱数に足してみます。gan(z_values)先ほどのプログラムの一部をさらに修正します。画像を崩すベクトルの平均を引いて、出来栄えの良いベクトルの平均を足します。これは素晴らしい!少し多様性が失われた感はありますが、オフセットをかけない時と比べれば、見違えるように画像生成レベルが向上しました。笑いの特徴量ベクトル女性の笑いの特徴量ベクトルを抽出し、笑っていない女性を笑わせてみようと思います。17で乱数を初期化して100枚画像を生成し、その中から笑っている女性5枚、笑っていない女性5枚をピックアップした例です。それでは、実際に試してみましょう。255)).save(f"result_{i}.png")女性の笑いの特徴量を抽出し、笑っていない女性を笑わせるプログラムです。加算して、画像生成にどう作用するかをみてみます。[66]をターゲット画像にして、女性の笑いの特徴量ベクトルを1/5づつ加えた結果です。顔全体はほとんど変形することなく、口元のみ連続的に変化し、笑い顔になりました。ターゲット画像にした例です。顔全体はほとんど変形することなく、口元のみ連続的に変化し、笑い顔になりました。男性の場合も同様です。気が進みませんが、男性も、ついでに試してみます(笑)。ま、見ていて楽しくはありませんが、男性もちゃんと出来ます(笑)。性別の特徴量ベクトル男性に性別の特徴量を加えて女性にしたいとします。先ほどのプログラムが、そのまま流用できます。ターゲットの男性が女装をすると、こんな感じになるのかなー、という気がします。男性を女性化する場合は、男性に性別特徴量を足しましたが、女性を男性化する場合は、女性から性別特徴量を引いてやればOKです。場合は男装で対応するのは難しいかもしれませんね(笑)。特徴量ベクトルを上手く可視化できると、何か新たな発見があるかもしれません。以前、100次元のベクトルを面グラフで表示してみましたが、今回はヒートマップで表現してみることにします。fmt='.1f')plt.savefig('./sex_vec.png')512次元の性別の特徴量ベクトルを32×16(32×16=512)のヒートマップで可視化するプログラムです。ライブラリーをインポートします。32×16にリシェイプします。引数は、データ、vmax(最大値)、vmin(最小値)、center(中央値)、cmap(カラーパレットの選択)、square(Trueでセルを正方形に)、annot(Trueでセルに数値を表示)、fmt(’.1f’で小数点1位まで表示)です。cmap(カラーパレット)の選び方は、このリンクが分かりやすいので参考にどうぞ。ヒートマップで表したものです。データは+1.6ですね。様々な特徴量を可視化して比較すると、新たな発見があるかもしれませんが、ここを突っ込んで行くとかなり時間がかかりそうなので、今回はここまでにしておきます(笑)。1つ1つの要素を直接いじった時に、どう生成画像が変化するのかを調べると、新たな発見があるかもしれません。10番目の要素をいじると髪の毛が伸びたり、25番目の要素をいじるとメガネを掛けたりとか。画像生成に影響を与えるツボのようなものがあるのではないかという発想です。512個の要素1つづつに、定数を足し算した時に、生成画像がどう変化するかみて見ます。各要素1つ1つに、+10をプラスした時の生成画像を表示させるプログラムです。0〜511の整数のリストを作成し、512個のワンホットベクトル(該当する要素のみ1でそれ以外は0)を生成し、10を掛けています。10を掛けているのは、変化を大きくし見やすくするためです。各要素に、+10をプラスした場合の画像の変化です。なんか、やたらメガネが生成されていますが、「おっ!これがメガネを生成する要素か!」と思うのは気が早いというもの。別の画像では、全く関係なかったりします。画像生成に影響を与えるツボは絶対あるはずですが、要素の1つ1つに機能が割り当てられているという単純なものではなさそうです。学習済みモデル、面白いです。本当にこれ、大人のおもちゃですね(笑)。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。その1RECOMMENDこちらの記事も人気です。一目惚れして、ディープラーニングを始めました。初心者の試行錯誤をブログにしています。