Main Content

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

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

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

컨벌루션 계층은 3차원 활성화 볼륨을 출력하며, 여기서 3차원을 따라 있는 슬라이스가 계층 입력에 적용되는 단일 필터에 해당합니다. 신경망의 끝부분에 있는 완전 연결 계층이 출력하는 채널은 이전 계층에서 학습한 특징들의 상위 수준 조합에 해당합니다.

deepDreamImage를 사용하여 신경망 계층의 특정 채널을 강하게 활성화하는 영상을 생성하면 학습된 특징을 시각화할 수 있습니다.

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

사전 훈련된 신경망 불러오기

사전 훈련된 GoogLeNet 신경망과 해당 클래스 이름을 불러옵니다. 이 작업을 수행하려면 Deep Learning Toolbox™ Model for GoogLeNet Network 지원 패키지가 필요합니다. 이 지원 패키지가 설치되어 있지 않으면 다운로드 링크가 제공됩니다. 사용 가능한 모든 신경망 목록을 보려면 사전 훈련된 심층 신경망 항목을 참조하십시오.

[net,classNames] = imagePretrainedNetwork("googlenet");

앞쪽에 있는 컨벌루션 계층 시각화하기

GoogLeNet 신경망에는 여러 개의 컨벌루션 계층이 있습니다. 신경망의 시작 부분에 있는 컨벌루션 계층은 수용 영역의 크기가 작아서 하위 수준의 작은 특징을 학습합니다. 신경망의 끝부분에 있는 계층은 수용 영역의 크기가 더 크며 따라서 더 큰 특징을 학습합니다.

analyzeNetwork를 사용하여 신경망 아키텍처를 표시하고 컨벌루션 계층을 찾습니다.

analyzeNetwork(net)

컨벌루션 계층 1에서 학습하는 특징

layer가 첫 번째 컨벌루션 계층이 되도록 설정합니다. 이 계층은 신경망의 두 번째 계층이며 이름이 'conv1-7x7_s2'입니다.

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

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

기본적으로 deepDreamImage는 사용 가능한 경우 호환되는 GPU를 사용합니다. GPU가 없으면 CPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오.

channels = 1:36;
I = deepDreamImage(net,name,channels, ...
    'PyramidLevels',1);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |        15.84 |               1 |
|           2 |       423.25 |               1 |
|           3 |       849.50 |               1 |
|           4 |      1275.84 |               1 |
|           5 |      1702.21 |               1 |
|           6 |      2128.59 |               1 |
|           7 |      2554.97 |               1 |
|           8 |      2981.36 |               1 |
|           9 |      3407.74 |               1 |
|          10 |      3834.13 |               1 |
|==============================================|
Training finished: Max epochs completed.
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
title(['Layer ',name,' Features'],'Interpreter','none')

위 영상은 대부분 경계와 색을 포함하고 있는데, 이를 통해 계층 'conv1-7x7_s2'의 필터가 경계 검출기이자 색 필터임을 알 수 있습니다.

컨벌루션 계층 2에서 학습하는 특징

두 번째 컨벌루션 계층의 이름은 'conv2-3x3_reduce'이며 계층 6에 해당합니다. channels1: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, ...
    'OutputScaling',"clipped");
figure
I = imtile(I,'ThumbnailSize',[64 64]);
imshow(I)
name = net.Layers(layer).Name;
title(['Layer ',name,' Features'],'Interpreter','none')

이 계층의 필터는 첫 번째 컨벌루션 계층보다 더 복잡한 패턴을 검출합니다.

심층 컨벌루션 계층 시각화하기

심층 계층은 앞쪽 계층에서 학습한 특징들의 상위 수준 조합을 학습합니다.

피라미드 단계의 개수와 피라미드 단계당 반복 횟수를 늘리면 더욱 상세한 영상을 생성할 수 있습니다. 단, 이때 연산량은 늘어납니다. '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, ...
    'OutputScaling', "clipped");
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의 항목을 선택합니다.

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

이러한 클래스를 강하게 활성화하는 상세한 영상을 생성합니다. 더욱 상세한 영상이 생성되도록 deepDreamImage를 호출할 때 'NumIterations'를 100으로 설정합니다. 완전 연결 계층에서 생성된 영상이 영상 클래스에 해당합니다.

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

생성된 영상은 선택된 클래스를 강하게 활성화합니다. ‘zebra’ 클래스에 대해 생성된 영상은 뚜렷한 얼룩말 줄무늬를 포함하며, ‘castle’ 클래스에 대해 생성된 영상은 작은 탑과 창문을 포함합니다.

참고 항목

| | | | | | |

관련 항목