합성곱 신경망의 시각화

Jaeseok Han·2024년 5월 31일

머신러닝&딥러닝

목록 보기
19/22
post-thumbnail

가중치 시각화

1. 가중치 및 절편 크기 확인

from tensorflow import keras
model = keras.models.load_model('best-cnn-model.h5')
model.layers #케라스 모델 층 확인

# 가중치와 절편 크기 확인
conv =  model.layers[0]
print(conv.weights[0].shape, conv.weights[1].shape) #가중치, 절편

가중치 : (3,3, 1) 커널 크기(3,3) , 깊이 1 , 필터 개수 32
절편 : 각 필터마다 1개의 절편

2. 가중치 배열의 평균과 표준편차

conv_weights = conv.weights[0].numpy()
print(conv_weights.mean(), conv_weights.std()) # 평균, 표준편차
# 출력: -0.008713105 0.21171059

3. 가중치 분포 히스토그램


0.0을 기준으로 좌우로 큰 분포를 띄고있다.

4. 커널 시각화

32개의 그래프 영역을 만들고 순서대로 커널을 출력

5. 훈련하지 않은 가중치 확인

no_training_model = keras.Sequential()
no_training_model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))
no_training_conv = no_training_model.layers[0]
print(no_training_conv.weights[0].shape) # (3, 3, 1, 32)
no_training_weights = no_training_conv.weights[0].numpy()
print(no_training_weights.mean(), no_training_weights.std()) # 평균, 표준편차
# 출력: 0.0005916213 0.08123773

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

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()


균등한 분포를 띈다.


전체적인 가중치가 밋밋하게 초기화되었다.

텐서플로가 신경망의 가중치를 처음 초기화할 때 균등 분포에서 랜덤하게 값을 선택하기 때문이다.

함수형 API를 이요한 특성 맵 시각화

1. 첫 번째 합성곱 층 특성 맵 시각화

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

# 특성 맵 시각화
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
plt.imshow(train_input[0], cmap='gray_r')
plt.show()

# 첫 번째 합성곱층 특성 맵(32개)
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)

fig, axs = plt.subplots(4, 8, figsize=(15, 8))
for i in range(4):
    for j in range(8):
        axs[i, j].imshow(feature_maps[0, :, :, i * 8 + j])
        axs[i, j].axis('off')
plt.show()

첫 번째 합성곱층 특성 맵(32개)

2. 두 번째 합성곱 층 특성 맵 시각화

두 번째 합성곱층 특성 맵(64개)

  • 두 번째 합성곱 층의 필터의 크기는 (3, 3, 32)이며, 첫 번째 필터가 앞서 출력한 32개의 특성 맵과 곱해져서 두 번째 합성곱 층의 첫 번째 특성 맵이 된다.

  • (4, 14, 32) 특성 맵에서 어떤 부위를 감지하는지 직관적으로 이해하기 어렵다


훈련된 모델의 가중치와 특성 맵을 시각화하여 모델이 어떻게 학습되었는지와 각 층에서 어떤 특성들을 추출하는지 직관적으로 이해할 수 있다.

0개의 댓글