IT_World
[Deep learning]컨볼 루션 신경망에서 필터 및 기능 맵을 시각화하는 방법 -2- 본문
[Deep learning]컨볼 루션 신경망에서 필터 및 기능 맵을 시각화하는 방법 -2-
engine 2021. 4. 29. 09:44machinelearningmastery.com/how-to-visualize-filters-and-feature-maps-in-convolutional-neural-networks/
How to Visualize Filters and Feature Maps in Convolutional Neural Networks
Deep learning neural networks are generally opaque, meaning that although they can make useful and skillful predictions, it is not […]
machinelearningmastery.com
niniit.tistory.com/12
[Deep learning]컨볼 루션 신경망에서 필터 및 기능 맵을 시각화하는 방법 -1-
machinelearningmastery.com/how-to-visualize-filters-and-feature-maps-in-convolutional-neural-networks/ How to Visualize Filters and Feature Maps in Convolutional Neural Networks Deep learning neural..
niniit.tistory.com
지난번 포스팅에 이어 네 가지를 알아볼 것이다.
- 컨볼 루션 레이어 시각화
- 사전 맞춤 VGG 모델
- 필터 시각화 방법
- 기능 맵을 시각화하는 방법
아래 포스팅에서는 튜토리얼부터 차례로 알아볼 것이다.
1.컨볼 루션 레이어 시각화
컨볼 루션 신경망을 시각화하는 두 가지 접근 방식을 모두 살펴볼 것이다.
1-1 신경망 모델은 일반적으로 불투명하다고 한다. 그들이 특정 결정이나 예측을 한 이유를 설명하는 데 부족하다는 것을 의미한다. 컨볼 루션 신경망은 이미지 데이터와 함께 작동하도록 설계되었으며 그 구조와 기능은 다른 유형의 신경망보다 덜 이해하기 쉬워야 한다. 특히, 모델은 작은 선형 필터와 활성화 맵 또는 보다 일반적으로 기능 맵이라는 필터를 적용한 결과로 구성된다.
1-2 필터와 기능 맵을 모두 시각화할 수 있다. 예를 들어, 라인 감지기와 같은 작은 필터를 설계하고 이해할 수 있다. 학습된 컨볼 루션 신경망 내에서 필터를 시각화하면 모델 작동 방식에 대한 통찰력을 얻을 수 있다. 입력 이미지에 필터를 적용하고 이전 계층에서 출력 한 기능 맵에 생성된 기능 맵은 모델이 모델의 특정 지점에서 특정 입력을 갖는 내부 표현에 대한 통찰력을 제공할 수 있다.
2. 사전 맞춤 VGG 모델
시각화할 모델이 필요하다.
resNet50도 좋지만 VGG16으로 맞추었기 때문에 VGG16으로 사용
# load vgg model
from tensorflow.keras.applications.vgg16 import VGG16
# load the model
model = VGG16()
# summarize the model
model.summary()
3. 필터 시각화 방법
수행할 수 있는 가장 간단한 시각화는 학습된 필터를 직접 플로팅 하는 것이다.
신경망 용어에서 학습된 필터는 단순히 가중치이지만 필터의 특수한 2차원 구조로 인해 가중치 값은 서로 공간적 관계를 가지며 각 필터를 2차원 이미지로 플로팅 하는 것은 의미가 있다)
첫 번째 단계는 모델의 필터를 검토하여 작업해야 하는 사항을 확인하는 것이다.
이전 섹션에서 인쇄된 모델 요약은 각 레이어의 출력 모양 (예 : 결과 피쳐 맵의 모양)을 요약한다. 네트워크에서 필터 (가중치)의 모양에 대한 아이디어는 제공하지 않으며 레이어 당 총 가중치 수만 제공한다.
model.layers 속성을 통해 모델의 모든 계층에 액세스 할 수 있다.
각 레이어에는 layer.name 속성이 있습니다. 여기서 컨볼 루션 레이어에는 block # _conv # 와 같은 명명 컨볼 루션이 있다. 여기서 ' # '는 정수이다. 따라서 각 레이어의 이름을 확인하고 ' conv ' 문자열이 포함되지 않은 레이어는 건너뛸 수 있다.
# summarize filter shapes
for layer in model.layers:
# check for convolutional layer
if 'conv' not in layer.name:
continue
각 컨벌루션 계층에는 두 세트의 가중치가 있다.
하나는 필터 블록이고 다른 하나는 바이어스 값 블록이다. layer.get_weights () 함수를 통해 액세스 할 수 있다. 이러한 가중치를 검색 한 다음 그 모양을 요약할 수 있다.
# get filter weights
filters, biases = layer.get_weights()
print(layer.name, filters.shape)
전체 코드
# summarize filters in each convolutional layer
from tensorflow.keras.applications.vgg16 import VGG16
from matplotlib import pyplot
# load the model
model = VGG16()
# summarize filter shapes
for layer in model.layers:
# check for convolutional layer
if 'conv' not in layer.name:
continue
# get filter weights
filters, biases = layer.get_weights()
print(layer.name, filters.shape)
예제를 실행하면 레이어 이름과 레이어의 필터 모양이 포함된 레이어 세부 정보 목록이 인쇄된다.
컨볼 루션 신경망의 구조적 문제는 필터의 깊이가 필터에 대한 입력 깊이 (예 : 채널 수)와 일치해야 한다는 것이다.
빨강, 녹색 및 파랑에 대해 3 개의 채널이 있는 입력 이미지의 경우 각 필터의 깊이가 3 임을 알 수 있다 (여기서는 채널-마지막 형식으로 작업함). 하나의 필터를 각 채널에 대해 하나씩 세 개의 이미지가 있는 플롯으로 시각화하거나 세 개를 모두 단일 색상 이미지로 압축하거나 첫 번째 채널을 보고 다른 채널이 동일하게 보일 것이라고 가정할 수도 있다. 문제는 시각화하고 싶은 63 개의 다른 필터가 있다는 것이다.
다음과 같이 첫 번째 레이어에서 필터를 검색할 수 있다.
# retrieve weights from the second hidden layer
filters, biases = model.layers[1].get_weights()
가중치 값은 0.0을 중심으로 하는 작은 양수 및 음수 값일 수 있다.
값을 쉽게 시각화할 수 있도록 0-1 범위로 정규화할 수 있다.
# normalize filter values to 0-1 so we can visualize them
f_min, f_max = filters.min(), filters.max()
filters = (filters - f_min) / (f_max - f_min)
이제 블록의 64 개 중 처음 6 개 필터를 열거하고 각 필터의 3 개 채널을 각각 플로팅 할 수 있다.
matplotlib 라이브러리를 사용하고 각 필터를 새로운 서브플롯 행으로 플로팅 하고 각 필터 채널 또는 깊이를 새 열로 플로팅 한다.
# plot first few filters
n_filters, ix = 6, 1
for i in range(n_filters):
# get the filter
f = filters[:, :, :, i]
# plot each channel separately
for j in range(3):
# specify subplot and turn of axis
ax = pyplot.subplot(n_filters, 3, ix)
ax.set_xticks([])
ax.set_yticks([])
# plot filter channel in grayscale
pyplot.imshow(f[:, :, j], cmap='gray')
ix += 1
# show the figure
pyplot.show()
이를 결합하여 VGG16 모델의 첫 번째 은닉 컨벌루션 레이어에서 처음 6 개 필터를 플로팅 하는 전체 예제가 아래에 나열되어 있다.
전체 코드
# cannot easily visualize filters lower down
from tensorflow.keras.applications.vgg16 import VGG16
from matplotlib import pyplot
# load the model
model = VGG16()
# retrieve weights from the second hidden layer
filters, biases = model.layers[1].get_weights()
# normalize filter values to 0-1 so we can visualize them
f_min, f_max = filters.min(), filters.max()
filters = (filters - f_min) / (f_max - f_min)
# plot first few filters
n_filters, ix = 6, 1
for i in range(n_filters):
# get the filter
f = filters[:, :, :, i]
# plot each channel separately
for j in range(3):
# specify subplot and turn of axis
ax = pyplot.subplot(n_filters, 3, ix)
ax.set_xticks([])
ax.set_yticks([])
# plot filter channel in grayscale
pyplot.imshow(f[:, :, j], cmap='gray')
ix += 1
# show the figure
pyplot.show()
예제를 실행하면 3 개의 이미지로 구성된 6 개의 행 또는 18 개의 이미지가 있는 Figure가 생성된다.
어떤 경우에는 필터가 채널 (첫 번째 행)에서 동일하고 다른 경우 (마지막 행) 필터가 다르다는 것을 알 수 있다.
어두운 사각형은 작거나 억제된 무게를 나타내고 밝은 사각형은 크거나 흥분하는 무게를 나타낸다. 이 직관을 사용하면 첫 번째 행의 필터가 왼쪽 상단의 빛에서 오른쪽 하단의 어두운 곳으로의 그라디언트를 감지한다는 것을 알 수 있다.
시각화가 있지만 첫 번째 컨볼 루션 레이어의 64 개 필터 중 처음 6 개만 볼 수 있습니다. 64 개의 모든 필터를 하나의 이미지로 시각화하는 것이 가능하다.
두 번째 컨벌루션 레이어에서 필터를 살펴보려면 다시 64 개의 필터가 있지만 각 필터에는 입력 특성 맵과 일치하는 64 개의 채널이 있음을 알 수 있다. 64 개 필터 모두에 대해 한 행에 있는 모든 64 개 채널을 보려면 (64x64) 4,096 개의 서브플롯이 필요하므로 세부 정보를 확인하기 어려울 수 있다.
'Artificial intelligence, AI > TensorFlow' 카테고리의 다른 글
[Deep learning]컨볼 루션 신경망에서 필터 및 기능 맵을 시각화하는 방법 -3- (0) | 2021.04.30 |
---|---|
[Deep learning]컨볼 루션 신경망에서 필터 및 기능 맵을 시각화하는 방법 -1- (0) | 2021.04.29 |
[PYTHON] 감마를 이용하여 grayscale 이미지 밝기 조정 (0) | 2021.04.26 |
[PYTHON] 컬러사진 흑백으로 만들기 -1- (0) | 2021.04.14 |
[PYTHON] 파이썬 이미지 resize (0) | 2021.04.09 |