ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

畳み込みニューラル ネットワークの特徴の可視化

この例では、畳み込みニューラル ネットワークによって学習された特徴を可視化する方法を説明します。

畳み込みニューラル ネットワークでは、"特徴" を使用してイメージを分類します。ネットワークは、学習プロセスでこれらの特徴自体を学習します。学習時にネットワークが学習する内容は、よくわからない場合もあります。ただし、関数 deepDreamImage を使用して、学習された特徴を可視化することができます。

ネットワークの "畳み込み" 層では、複数の 2 次元配列が出力されます。各配列 (またはチャネル) は、層の入力に適用されるフィルターに対応します。"全結合" 層によって出力されるチャネルは、それ以前の層によって学習された特徴の高水準の組み合わせに対応しています。

deepDreamImage を使用して、ネットワーク層の特定のチャネルを強く活性化するイメージを生成することによって、学習された特徴を可視化できます。

この例には、Deep Learning Toolbox™ および Deep Learning Toolbox Model for AlexNet Network サポート パッケージが必要です。

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

事前学習済みの AlexNet ネットワークを読み込みます。

net = alexnet;

畳み込み層の可視化

AlexNet ネットワークには、5 つの 2 次元畳み込み層があります。ネットワークの最初の方の畳み込み層では、受容野のサイズが小さく、学習する特徴は小さく低水準になります。ネットワークの最後の方の層では、受容野のサイズが大きく、学習する特徴が大きくなります。

Layers プロパティを使用して、ネットワーク アーキテクチャを表示し、畳み込み層の位置を確認します。2 次元の畳み込み層は、層 2、層 6、層 10、層 12、および層 14 であることがわかります。

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Convolution                   256 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Convolution                   384 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Convolution                   256 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

畳み込み層 1 の特徴

layer を最初の畳み込み層になるように設定します。この層はネットワークの 2 番目の層であり、'conv1' という名前が付いています。

layer = 2;
name = net.Layers(layer).Name
name = 
'conv1'

channels をインデックスのベクトル 1:56 に設定することによって、deepDreamImage を使用してこの層で学習された最初の 56 個の特徴を可視化します。'PyramidLevels' を 1 に設定し、イメージがスケーリングされないようにします。イメージをまとめて表示するには、imtile を使用できます。

deepDreamImage では既定で、互換性のある GPU が利用できる場合は、その GPU が使用されます。そうでない場合は CPU が使用されます。GPU で学習を行うには、Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU が必要です。

channels = 1:56;
I = deepDreamImage(net,layer,channels,'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         4.80 |               1 |
|           2 |        40.36 |               1 |
|           3 |        75.93 |               1 |
|           4 |       111.50 |               1 |
|           5 |       147.06 |               1 |
|           6 |       182.63 |               1 |
|           7 |       218.20 |               1 |
|           8 |       253.76 |               1 |
|           9 |       289.33 |               1 |
|          10 |       324.90 |               1 |
|==============================================|
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
title(['Layer ',name,' Features'])

これらのイメージの多くには、エッジと色が含まれます。これは、'conv1' 層のフィルターがエッジ検出器およびカラー フィルターであることを示します。エッジ検出器はさまざまな角度に存在しており、ネットワークの後の層でより複雑な特徴を構成することを可能にしています。

畳み込み層 2 の特徴

これらの特徴は、'conv1' 層の特徴を使用して作成されます。2 番目の畳み込み層には 'conv2' という名前が付いており、層 6 に対応しています。channels をインデックスのベクトル 1:30 に設定することによって、この層で学習された最初の 30 個の特徴を可視化します。

layer = 6;
channels = 1:30;
I = deepDreamImage(net,layer,channels,'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |        26.96 |               1 |
|           2 |        23.50 |               1 |
|           3 |         1.14 |               1 |
|           4 |        16.74 |               1 |
|           5 |        35.00 |               1 |
|           6 |        49.67 |               1 |
|           7 |        63.39 |               1 |
|           8 |        74.85 |               1 |
|           9 |        85.63 |               1 |
|          10 |        94.82 |               1 |
|==============================================|
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'])

畳み込み層 3 ~ 5 の特徴

残りの各畳み込み層について、学習された最初の 30 個の特徴を可視化します。最適化プロセスで詳細な出力を表示しないようにするには、deepDreamImage を呼び出すときに 'Verbose''false' に設定します。ネットワークの層が深くなるほどフィルターが詳細になることに注意してください。

layers = [10 12 14];
channels = 1:30;

for layer = layers
    I = deepDreamImage(net,layer,channels, ...
        'Verbose',false, ...
        'PyramidLevels',1);
    
    figure
    I = imtile(I,'ThumbnailSize',[128 128]);
    imshow(I)
    name = net.Layers(layer).Name;
    title(['Layer ',name,' Features'])
end

全結合層の可視化

AlexNet モデルには、3 つの全結合層があります。全結合層はネットワークの最後の方にあり、それ以前の層によって学習された特徴の高水準の組み合わせを学習します。

最初の 2 つの全結合層 (層 17 および 20) を選択します。

layers = [17 20];

これらの各層について、deepDreamImage を使用して最初の 6 個の特徴を可視化します。deepDreamImage を呼び出すときに 'NumIterations' を 50 に設定すると、より詳細なイメージが生成されます。最後の全結合層で生成されたイメージは、イメージ クラスに対応しています。

channels = 1:6;

for layer = layers
    I = deepDreamImage(net,layer,channels, ...
        'Verbose',false, ...
        'NumIterations',50);
    
    figure
    I = imtile(I,'ThumbnailSize',[128 128]);
    imshow(I)
    name = net.Layers(layer).Name;
    title(['Layer ',name,' Features'])
end

各クラスに最も似たイメージを生成するには、最後の全結合層を選択し、channels をクラスのインデックスに設定します。

layer = 23;
channels = [9 188 231 563 855 975];

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

net.Layers(end).Classes(channels)
ans = 6×1 categorical array
     hen 
     Yorkshire terrier 
     Shetland sheepdog 
     fountain 
     theater curtain 
     geyser 

これらのクラスを強く活性化する詳細なイメージを生成します。

I = deepDreamImage(net,layer,channels, ...
    'Verbose',false, ...
    'NumIterations',50);
figure
I = imtile(I,'ThumbnailSize',[128 128]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'])

参考

|

関連するトピック