이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

컨벌루션 신경망의 특징 시각화하기

이 예제에서는 컨벌루션 신경망이 학습한 특징을 시각화하는 방법을 보여줍니다.

컨벌루션 신경망은 특징을 사용하여 이미지를 분류합니다. 네트워크는 훈련 과정에서 이러한 특징을 학습합니다. 네트워크가 훈련하면서 무엇을 학습하는지 명확히 알 수 없는 경우가 있습니다. 이때 deepDreamImage 함수를 사용하면 학습된 특징을 시각화할 수 있습니다.

네트워크의 컨벌루션 계층은 여러 개의 2차원 배열을 출력합니다. 각 배열(또는 채널)은 계층 입력값에 적용되는 필터에 해당합니다. 완전 연결 계층이 출력하는 채널은 이전 계층에서 학습한 특징들의 상위 수준 조합에 해당합니다.

deepDreamImage를 사용하여 네트워크 계층의 특정 채널을 강하게 활성화하는 이미지를 생성하면 학습된 특징을 시각화할 수 있습니다.

이 예제를 실행하려면 Deep Learning Toolbox™와 Deep Learning Toolbox Model for AlexNet Network 지원 패키지가 필요합니다.

사전 훈련된 네트워크 불러오기

사전 훈련된 AlexNet 네트워크를 불러옵니다.

net = alexnet;

컨벌루션 계층 시각화하기

AlexNet 네트워크에는 5개의 2차원 컨벌루션 계층이 있습니다. 네트워크의 시작 부분에 있는 컨벌루션 계층은 수용 영역의 크기가 작아서 하위 수준의 작은 특징을 학습합니다. 네트워크의 끝부분에 있는 계층은 수용 영역의 크기가 더 크며 따라서 더 큰 특징을 학습합니다.

Layers 속성을 사용하여 네트워크 아키텍처를 표시하고 컨벌루션 계층을 찾습니다. 계층 2, 6, 10, 12, 14가 2차원 컨벌루션 계층임을 알 수 있습니다.

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가 첫 번째 컨벌루션 계층이 되도록 설정합니다. 이 계층은 네트워크의 두 번째 계층이며 이름이 'conv1'입니다.

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

channels1:56 인덱스 벡터로 설정하고 deepDreamImage를 사용하여 이 계층이 학습한 처음 56개의 특징을 시각화합니다. 이미지가 스케일링되지 않도록 'PyramidLevels'를 1로 설정합니다. 이미지를 모두 한꺼번에 표시하려면 imtile를 사용할 수 있습니다.

기본적으로 deepDreamImage는 사용 가능한 경우 호환되는 GPU를 사용합니다. GPU가 없으면 CPU를 사용합니다. GPU에서 훈련시키려면 CUDA® 지원 NVIDIA® GPU(Compute Capability 3.0 이상)가 필요합니다.

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'의 특징을 사용하여 만들어집니다. 두 번째 컨벌루션 계층의 이름은 'conv2'이며 계층 6에 해당합니다. channels1: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'])

참고 항목

|

관련 항목