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)
참고 항목
imagePretrainedNetwork
| dlnetwork
| trainingOptions
| trainnet
| deepDreamImage
| occlusionSensitivity
| imageLIME
| gradCAM