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

AlexNet을 사용한 딥 드림 이미지

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

딥 드림(Deep Dream)은 심층 학습에서 사용하는 특징 시각화 기법으로, 네트워크 계층을 강하게 활성화하는 이미지를 합성합니다. 이러한 이미지를 시각화하여 네트워크가 학습한 이미지의 특징을 집중적으로 살펴볼 수 있습니다. 이러한 이미지는 네트워크의 동작을 이해하고 진단할 때 유용합니다.

네트워크의 끝부분 근처에 있는 계층의 특징을 시각화하면 흥미로운 이미지를 생성할 수 있습니다.

이 예제에서는 Deep Learning Toolbox™와 Deep Learning Toolbox Model for AlexNet Network를 사용하여 이미지를 생성합니다.

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

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

net = alexnet;

이미지 생성하기

주어진 클래스와 가장 근접한 이미지를 생성하려면 마지막 완전 연결 계층을 선택하십시오. 먼저 네트워크 netLayers 속성에서 네트워크 아키텍처를 보고 이 계층의 계층 인덱스를 찾습니다.

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

그런 다음 마지막 완전 연결 계층을 선택합니다. 마지막 완전 연결 계층은 계층 23입니다.

layer = 23;

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

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 

deepDreamImage를 사용하여 이미지를 생성합니다. 이 명령은 사용 가능한 경우 호환되는 GPU를 사용합니다. GPU가 없으면 CPU를 사용합니다. GPU에서 훈련시키려면 CUDA® 지원 NVIDIA® GPU(Compute Capability 3.0 이상)가 필요합니다.

I = deepDreamImage(net,layer,channels);
|==============================================|
|  Iteration  |  Activation  |  Pyramid Level  |
|             |   Strength   |                 |
|==============================================|
|           1 |         1.80 |               1 |
|           2 |         3.61 |               1 |
|           3 |         7.37 |               1 |
|           4 |        11.88 |               1 |
|           5 |        19.33 |               1 |
|           6 |        25.02 |               1 |
|           7 |        29.80 |               1 |
|           8 |        36.12 |               1 |
|           9 |        45.36 |               1 |
|          10 |        45.61 |               1 |
|           1 |        16.68 |               2 |
|           2 |        16.33 |               2 |
|           3 |        22.12 |               2 |
|           4 |        21.27 |               2 |
|           5 |        25.75 |               2 |
|           6 |        25.15 |               2 |
|           7 |        33.37 |               2 |
|           8 |        32.06 |               2 |
|           9 |        36.30 |               2 |
|          10 |        34.73 |               2 |
|           1 |        37.16 |               3 |
|           2 |        49.21 |               3 |
|           3 |        50.34 |               3 |
|           4 |        54.80 |               3 |
|           5 |        54.96 |               3 |
|           6 |        64.39 |               3 |
|           7 |        66.36 |               3 |
|           8 |        59.87 |               3 |
|           9 |        71.50 |               3 |
|          10 |        71.53 |               3 |
|==============================================|

imtile를 사용하여 이미지를 모두 한꺼번에 표시합니다.

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

더욱 상세한 이미지 생성하기

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

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

iterations = 100;

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

channels = 9;
I = deepDreamImage(net,layer,channels, ...
    'Verbose',false, ...
    'NumIterations',iterations);

figure
imshow(I)

보다 크고 상세한 출력 이미지를 생성하려면 피라미드 단계의 개수와 피라미드 단계당 반복 횟수를 모두 늘릴 수 있습니다.

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

levels = 4;

'pot' 클래스(채널 739)를 강하게 활성화하는 상세한 이미지를 생성합니다.

channels = 739;

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

figure
imshow(I)

참고 항목

|

관련 항목