Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

GoogLeNet을 사용한 딥 드림 영상

이 예제에서는 사전 훈련된 컨벌루션 신경망 GoogLeNet으로 deepDreamImage를 사용하여 영상을 생성하는 방법을 보여줍니다.

딥 드림(Deep Dream)은 신경망 계층을 강하게 활성화하는 영상을 합성하는, 딥러닝의 특징 시각화 기법입니다. 이러한 영상을 시각화하면 신경망에서 학습된 영상 특징을 강조할 수 있습니다. 이러한 영상은 신경망 동작을 이해하고 진단하는 데 유용합니다.

신경망의 끝쪽에 있는 계층의 특징을 시각화하여 흥미로운 영상을 생성할 수 있습니다.

이 예제에서는 Deep Learning Toolbox™와 Deep Learning Toolbox Model for GoogLeNet Network를 사용하여 영상을 생성합니다.

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

사전 훈련된 GoogLeNet 신경망을 불러옵니다. Deep Learning Toolbox Model for GoogLeNet Network 지원 패키지가 설치되어 있지 않으면 이를 다운로드할 수 있는 링크가 제공됩니다.

net = googlenet;

영상 생성하기

주어진 클래스와 가장 근접한 영상을 생성하려면 완전 연결 계층을 선택하십시오. 먼저 analyzeNetwork를 사용하여 신경망 아키텍처를 확인함으로써 이 계층의 계층 인덱스를 찾습니다.

analyzeNetwork(net)

그런 다음 완전 연결 계층(이 예제에서는 142)을 선택합니다.

layer = 142;
layerName = net.Layers(layer).Name
layerName = 
'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를 사용하여 영상을 생성합니다. 이 명령은 사용 가능한 경우 호환되는 GPU를 사용합니다. GPU가 없으면 CPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 릴리스별 GPU 지원 (Parallel Computing Toolbox) 항목을 참조하십시오.

I = deepDreamImage(net,layerName,channels);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.09 |               1 |
|           2 |         0.67 |               1 |
|           3 |         4.86 |               1 |
|           4 |         8.41 |               1 |
|           5 |        11.27 |               1 |
|           6 |        14.86 |               1 |
|           7 |        17.39 |               1 |
|           8 |        22.84 |               1 |
|           9 |        27.78 |               1 |
|          10 |        34.39 |               1 |
|           1 |         3.99 |               2 |
|           2 |        11.51 |               2 |
|           3 |        13.82 |               2 |
|           4 |        19.87 |               2 |
|           5 |        20.67 |               2 |
|           6 |        20.82 |               2 |
|           7 |        24.01 |               2 |
|           8 |        27.20 |               2 |
|           9 |        28.24 |               2 |
|          10 |        35.93 |               2 |
|           1 |        34.91 |               3 |
|           2 |        46.18 |               3 |
|           3 |        41.03 |               3 |
|           4 |        48.84 |               3 |
|           5 |        51.13 |               3 |
|           6 |        58.65 |               3 |
|           7 |        58.12 |               3 |
|           8 |        61.68 |               3 |
|           9 |        71.53 |               3 |
|          10 |        76.01 |               3 |
|==============================================|

imtile를 사용하여 모든 영상을 함께 표시합니다.

figure
I = imtile(I);
imshow(I)

더 상세한 영상 생성하기

피라미드 단계의 개수와 피라미드 단계당 반복 횟수를 늘리면 더욱 상세한 영상을 생성할 수 있습니다. 단, 이때 연산량은 늘어납니다.

'NumIterations' 옵션을 사용하여 반복 횟수를 늘릴 수 있습니다. 반복 횟수를 100으로 설정합니다.

iterations = 100;

'tiger' 클래스(채널 293)를 강하게 활성화하는 상세한 영상을 생성합니다. 'Verbose'를 false로 설정하여 최적화 과정에 대한 상세한 정보가 표시되지 않도록 합니다.

channels = 293;
I = deepDreamImage(net,layerName,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations);

figure
imshow(I)

더 크고 상세한 출력 영상을 생성하려면 피라미드 단계의 개수와 피라미드 단계당 반복 횟수를 늘라면 됩니다.

피라미드 단계의 개수를 4로 설정합니다.

levels = 4;

'castle' 클래스(채널 484)를 강하게 활성화하는 상세한 영상을 생성합니다.

channels = 484;

I = deepDreamImage(net,layerName,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations, ...
    'PyramidLevels',levels);

figure
imshow(I)

참고 항목

| | | |

관련 항목