Main Content

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

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

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

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

"畳み込み" 層は、3 次元の活性化ボリュームを出力します。ここで、3 番目の次元に沿ったスライスは、層の入力に適用された 1 つのフィルターに対応します。ネットワークの終わりにある "全結合" 層によって出力されるチャネルは、それ以前の層によって学習された特徴の高度な組み合わせに対応しています。

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

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

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

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

net = googlenet;

初期の畳み込み層の可視化

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

analyzeNetwork を使用して、ネットワーク アーキテクチャを表示し、畳み込み層の位置を確認します。

analyzeNetwork(net)

畳み込み層 1 の特徴

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

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

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

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

channels = 1:36;
I = deepDreamImage(net,name,channels, ...
    'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.26 |               1 |
|           2 |         6.99 |               1 |
|           3 |        14.24 |               1 |
|           4 |        21.49 |               1 |
|           5 |        28.74 |               1 |
|           6 |        35.99 |               1 |
|           7 |        43.24 |               1 |
|           8 |        50.50 |               1 |
|           9 |        57.75 |               1 |
|          10 |        65.00 |               1 |
|==============================================|
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
title(['Layer ',name,' Features'],'Interpreter','none')

これらのイメージの多くには、エッジと色が含まれます。これは、'conv1-7x7_s2' 層のフィルターがエッジ検出器およびカラー フィルターであることを示します。

畳み込み層 2 の特徴

2 番目の畳み込み層は 'conv2-3x3_reduce' という名前で、層 6 に対応します。channels をインデックスのベクトル 1:36 に設定することによって、この層で学習された最初の 36 個の特徴を可視化します。

最適化プロセスで詳細な出力を表示しないようにするには、deepDreamImage. を呼び出すときに 'Verbose''false' に設定します。

layer = 6;
name = net.Layers(layer).Name
name = 
'conv2-3x3_reduce'
channels = 1:36;
I = deepDreamImage(net,name,channels, ...
    'Verbose',false, ...
    'PyramidLevels',1);
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'],'Interpreter','none')

この層のフィルターは、最初の畳み込み層よりも複雑なパターンを検出できます。

より深い畳み込み層の可視化

深い層では、それ以前の層によって学習された特徴の高水準の組み合わせを学習します。

ピラミッド レベルの数およびピラミッド レベル 1 つあたりの反復回数を増やすと、計算量が増加しますが、より詳細なイメージを生成できます。反復の回数を増やすには 'NumIterations' オプションを使用し、ピラミッド レベルの数を増やすには 'PyramidLevels' オプションを使用します。

layer = 97;
name = net.Layers(layer).Name
name = 
'inception_4e-1x1'
channels = 1:6;
I = deepDreamImage(net,name,channels, ...
    'Verbose',false, ...
    "NumIterations",20, ...
    'PyramidLevels',2);
figure
I = imtile(I,'ThumbnailSize',[250 250]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'],'Interpreter','none')

ネットワークの層が深くなるほどフィルターが詳細になり、複雑なパターンとテクスチャが学習されていることに注意してください。

全結合層の可視化

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

全結合層 (層 142) を選択します。

layer = 142;
name = net.Layers(layer).Name
name = 
'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 を呼び出すときに 'NumIterations' を 100 に設定すると、より詳細なイメージが生成されます。全結合層で生成されたイメージは、イメージ クラスに対応しています。

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

生成されたイメージは選択されたクラスを強く活性化しています。'zebra' クラスとして生成されたイメージは鮮明なシマウマ模様を含み、'castle' クラスとして生成されたイメージはタレットと窓を含んでいます。

参考

|

関連するトピック