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,classNames] = imagePretrainedNetwork("googlenet");

영상 생성하기

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

analyzeNetwork(net)

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

layer = 142;
layerName = net.Layers(layer).Name
layerName = 
'loss3-classifier'

여러 클래스를 선택하여 한 번에 여러 개의 영상을 생성할 수 있습니다. channels를 시각화하려는 클래스 이름의 인덱스로 설정하여 해당 클래스를 선택합니다.

channels = [114 293 341 484 563 950];

선택한 클래스의 이름을 보려면 channels의 항목을 선택합니다.

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

deepDreamImage를 사용하여 영상을 생성합니다. 이 명령은 사용 가능한 경우 호환되는 GPU를 사용합니다. GPU가 없으면 CPU를 사용합니다. GPU를 사용하려면 Parallel Computing Toolbox™와 지원되는 GPU 장치가 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. 더 선명한 영상을 얻기 위해 영상에 자르기를 수행합니다.

I = deepDreamImage(net,layerName,channels,OutputScaling="clipped");
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         0.59 |               1 |
|           2 |         1.24 |               1 |
|           3 |         4.56 |               1 |
|           4 |         7.37 |               1 |
|           5 |        11.30 |               1 |
|           6 |        13.99 |               1 |
|           7 |        16.75 |               1 |
|           8 |        19.87 |               1 |
|           9 |        23.71 |               1 |
|          10 |        28.93 |               1 |
|           1 |         6.66 |               2 |
|           2 |         9.83 |               2 |
|           3 |        15.96 |               2 |
|           4 |        14.49 |               2 |
|           5 |        19.06 |               2 |
|           6 |        22.67 |               2 |
|           7 |        24.10 |               2 |
|           8 |        24.78 |               2 |
|           9 |        27.90 |               2 |
|          10 |        32.13 |               2 |
|           1 |        34.09 |               3 |
|           2 |        40.02 |               3 |
|           3 |        50.95 |               3 |
|           4 |        50.22 |               3 |
|           5 |        50.22 |               3 |
|           6 |        54.28 |               3 |
|           7 |        62.82 |               3 |
|           8 |        70.92 |               3 |
|           9 |        66.08 |               3 |
|          10 |        75.71 |               3 |
|==============================================|
Training finished: Max epochs completed.

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, ...
    OutputScaling="clipped");

figure
imshow(I)

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

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

levels = 4;

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

channels = 484;

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

figure
imshow(I)

참고 항목

| | | | | | |

관련 항목