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)
参考
imagePretrainedNetwork
| dlnetwork
| trainingOptions
| trainnet
| deepDreamImage
| occlusionSensitivity
| imageLIME
| gradCAM