22강 - 합성곱 신경망의 시각화

2021. 7. 8. 01:00ICT 멘토링/혼자 공부하는 머신러닝+딥러닝

22강 - 합성곱 신경망의 시각화

학습 로드맵

가중치 시각화

합성곱 신경망 시각적으로 보기 좋음.

입력에 작은 필터(가중치)를 곱해서 출력 특성 맵을 만듦.

가중치가 높은 부분과 곱해지면 높은 출력 값 가짐.

가중치가 낮은 부분과 곱해지면 낮은 출력 값 가짐.

층의 가중치 분포

model.layers


#//[<tensorflow.python.keras.layers.convolutional.Conv2D at 0x7fc6e69348d0>,
#// <tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x7fc6e60b5860>,
#// <tensorflow.python.keras.layers.convolutional.Conv2D at 0x7fc6acc80ac8>,
#// <tensorflow.python.keras.layers.pooling.MaxPooling2D at 0x7fc6e60b6978>,
#// <tensorflow.python.keras.layers.core.Flatten at 0x7fc6a034f0f0>,
#// <tensorflow.python.keras.layers.core.Dense at 0x7fc6a034f898>,
#// <tensorflow.python.keras.layers.core.Dropout at 0x7fc6a034f0b8>,
#// <tensorflow.python.keras.layers.core.Dense at 0x7fc6a0352f28>]

 

conv = model.layers[0]

print(conv.weights[0].shape, conv.weights[1].shape)

#//(3, 3, 1, 32) (32,)

필터의 가중치와 절편.

conv_weights = conv.weights[0].numpy()

plt.hist(conv_weights.reshape(-1, 1))
plt.xlabel('weight')
plt.ylabel('count')
plt.show()

가중치 그래프로 출력

대부분 0에 많이 들어 있음.

양수 음수 값 존재.

0에 가까운 것은 의미 있는 것을 학습하는 가중치는 아님.

양수와 음수로 퍼져 있는 것은 어떤 특성을 방지하기 위해 학습한 것.

층만 만들어서 가중치를 시각화하면 균등분포를 이룸.

가중치는 0으로 초기화하면 안 되므로 0은 아닌 작은 실수값을 가지게 함.

 

균등분포가 훈련 후에는 위의 그래프처럼 변화함.

층의 가중치 시각화

fig, axs = plt.subplots(2, 16, figsize=(15,2))

for i in range(2):
    for j in range(16):
        axs[i, j].imshow(no_training_weights[:,:,0,i*16 + j], vmin=-0.5, vmax=0.5)
        axs[i, j].axis('off')

plt.show()

3*3*1 32개

imshow - 임의로 출력. 배열 값을 최소값을 가장 어둡게 최대값을 가장 밝게 표현.

최대값이 0.1 이든 1이든 가장 밝은 노란색으로 표시됨.

동일한 기준을 가지도록 vmin, vmax 지정.

함수형 API

함수처럼 호출할 수 있음.

 

InputLayer - 케라스에선 지정 필요, sequential 클래스에선 자동으로 만들어줌. 함수형 API에서는 명시적 지정 필요. 

모델 객체의 층

 

첫 번째 특성 맵 시각화

conv_acti = keras.Model(model.input, model.layers[0].output)

inputs = train_input[0:1].reshape(-1, 28, 28, 1)/255.0
feature_maps = conv_acti.predict(inputs)
print(feature_maps.shape)

#//(1, 28, 28, 32)

두 번째 특성 맵 시각화

conv2_acti = keras.Model(model.input, model.layers[2].output)

feature_maps = conv2_acti.predict(train_input[0:1].reshape(-1, 28, 28, 1)/255.0)

print(feature_maps.shape)

#//(1, 14, 14, 64)

낮은 층에서 저수준 특성 학습.

단순 모양, 패턴, 색깔

높은 층에서 고수준 특성 학습.

10 클래스의 추상적인 개념.

층이 깊어질수록 난해하고 이해하기 어려움.

참고자료

https://www.youtube.com/watch?v=_lDVf8jDKHg&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=22