Main Content

GoogLeNet を使用した Deep Dream イメージ

この例では、事前学習済みの畳み込みニューラル ネットワーク GoogLeNet で deepDreamImage を使用してイメージを生成する方法を説明します。

Deep Dream は、ネットワーク層を強く活性化するイメージを合成する、深層学習での特徴可視化の手法です。これらのイメージを可視化することによって、ネットワークによって学習されたイメージの特徴を強調表示できます。これらのイメージは、ネットワーク動作の理解および診断に役立ちます。

ネットワークの最後の方の層の特徴を可視化することによって、興味深いイメージを生成できます。

この例では、Deep Learning Toolbox™ および Deep Learning Toolbox Model for GoogLeNet Network を使用してイメージを生成します。

事前学習済みのネットワークの読み込み

事前学習済みの GoogLeNet ネットワークを読み込みます。Deep Learning Toolbox Model for GoogLeNet Network サポート パッケージがインストールされていない場合、ダウンロード用リンクが表示されます。

net = googlenet;

イメージの生成

特定のクラスに最も似たイメージを生成するには、全結合層を選択します。最初に、analyzeNetwork を使用してネットワーク アーキテクチャを表示して、この層の層インデックスを確認します。

analyzeNetwork(net) 

次に、全結合層を選択します。この例では 142 です。

layer = 142;
layerName = net.Layers(layer).Name
layerName = 
'loss3-classifier'

複数のクラスを選択することによって、一度に複数のイメージを生成できます。可視化するクラスを選択するには、channels をこれらのクラス名のインデックスに設定します。

channels = [114 293 341 484 563 950];

クラスは、出力層 (最後の層) の Classes プロパティに格納されます。channels のエントリを選択することによって、選択されたクラスの名前を表示できます。

net.Layers(end).Classes(channels)
ans = 6×1 categorical
     snail 
     tiger 
     zebra 
     castle 
     fountain 
     strawberry 

deepDreamImage を使用してイメージを生成します。このコマンドでは、互換性のある GPU が利用できる場合は、その GPU が使用されます。そうでない場合は CPU が使用されます。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。

I = deepDreamImage(net,layerName,channels);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.01 |               1 |
|           2 |         1.47 |               1 |
|           3 |         3.63 |               1 |
|           4 |         7.24 |               1 |
|           5 |        10.63 |               1 |
|           6 |        15.78 |               1 |
|           7 |        19.05 |               1 |
|           8 |        24.21 |               1 |
|           9 |        27.25 |               1 |
|          10 |        29.49 |               1 |
|           1 |         7.93 |               2 |
|           2 |        10.10 |               2 |
|           3 |        14.41 |               2 |
|           4 |        20.48 |               2 |
|           5 |        17.10 |               2 |
|           6 |        23.32 |               2 |
|           7 |        27.97 |               2 |
|           8 |        25.79 |               2 |
|           9 |        30.26 |               2 |
|          10 |        35.68 |               2 |
|           1 |        33.57 |               3 |
|           2 |        42.50 |               3 |
|           3 |        49.39 |               3 |
|           4 |        58.22 |               3 |
|           5 |        58.82 |               3 |
|           6 |        52.32 |               3 |
|           7 |        67.45 |               3 |
|           8 |        68.73 |               3 |
|           9 |        75.19 |               3 |
|          10 |        68.91 |               3 |
|==============================================|
Training finished: Max epochs completed.

imtile を使用して、すべてのイメージをまとめて表示します。

figure
I = imtile(I);
imshow(I)

詳細なイメージの生成

ピラミッド レベルの数およびピラミッド レベル 1 つあたりの反復回数を増やすと、計算量が増加しますが、より詳細なイメージを生成できます。

反復回数は、'NumIterations' オプションを使用して増やすことができます。反復回数を 100 に設定します。

iterations = 100;

'tiger' クラス (チャネル 293) を強く活性化する詳細なイメージを生成します。最適化プロセスの詳細を表示しないようにするには、'Verbose' を false に設定します。

channels = 293;
I = deepDreamImage(net,layerName,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations);

figure
imshow(I)

より大きく詳細な出力イメージを生成するには、ピラミッド レベルの数とピラミッド レベル 1 つあたりの反復回数の両方を増やします。

ピラミッド レベルの数を 4 に設定します。

levels = 4;

'castle' クラス (チャネル 484) を強く活性化する詳細なイメージを生成します。

channels = 484;

I = deepDreamImage(net,layerName,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations, ...
    'PyramidLevels',levels);

figure
imshow(I)

参考

| | | |

関連するトピック