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,classNames] = imagePretrainedNetwork("googlenet");

イメージの生成

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

analyzeNetwork(net)

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

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

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

channels = [114 293 341 484 563 950];

channels のエントリを選択することによって、選択されたクラスの名前を表示できます。

classNames(channels)
ans = 6×1 string
    "snail"
    "tiger"
    "zebra"
    "castle"
    "fountain"
    "strawberry"

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

I = deepDreamImage(net,layerName,channels,OutputScaling="clipped");
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.59 |               1 |
|           2 |         1.24 |               1 |
|           3 |         4.56 |               1 |
|           4 |         7.37 |               1 |
|           5 |        11.30 |               1 |
|           6 |        13.99 |               1 |
|           7 |        16.75 |               1 |
|           8 |        19.87 |               1 |
|           9 |        23.71 |               1 |
|          10 |        28.93 |               1 |
|           1 |         6.66 |               2 |
|           2 |         9.83 |               2 |
|           3 |        15.96 |               2 |
|           4 |        14.49 |               2 |
|           5 |        19.06 |               2 |
|           6 |        22.67 |               2 |
|           7 |        24.10 |               2 |
|           8 |        24.78 |               2 |
|           9 |        27.90 |               2 |
|          10 |        32.13 |               2 |
|           1 |        34.09 |               3 |
|           2 |        40.02 |               3 |
|           3 |        50.95 |               3 |
|           4 |        50.22 |               3 |
|           5 |        50.22 |               3 |
|           6 |        54.28 |               3 |
|           7 |        62.82 |               3 |
|           8 |        70.92 |               3 |
|           9 |        66.08 |               3 |
|          10 |        75.71 |               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, ...
    OutputScaling="clipped");

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)

参考

| | | | | | |

関連するトピック