Tensorflow 의 가중치 와 feature map 의 시각 화 에 대한 상세 한 설명
11578 단어 Tensorflowfeaturemap
Tensorflow 에 서 는 tensorboard 라 는 강력 한 도 구 를 사용 하여 계산 도,loss,네트워크 매개 변수 등 을 시각 화 할 수 있 습 니 다.본 고 는 tensorboard 에 대한 소개 가 아니 라 코드 를 통 해 네트워크 가중치 와 feature map 를 어떻게 더욱 유연 하 게 처리 하고 표시 하 며 저장 하 는 지 설명 하 는 데 목적 을 둔다.본 논문 의 관련 코드 는 주로 github 의 작은 프로젝트 를 참고 하 였 으 나 이 를 개선 하 였 다.
원래 항목 의 주 소 는(https://github.com/grishasergei/conviz)이다.
본 고 는 다음 과 같은 두 가지 측면 에서 소개 할 것 이다.
권 적 지식
네트워크 가중치 와 feature map 의 시각 화
1.볼 륨 지식 보충
뒤에 코드 설명 이 편리 하도록 볼 륨 의 일부 지식 을 소개 합 니 다.볼 륨 핵 이 이미지 의 한 통로 에서 어떻게 미끄럼 계산 을 하 는 지 에 대해 인터넷 에는 많은 자료 가 있 는데 볼 륨 신경 망 에 대해 어느 정도 알 고 있 는 독자 들 이 모두 비교적 잘 알 아야 한다 고 믿 고 본 고 는 더 이상 군말 하지 않 는 다.여기 서 볼 륨 핵 이 그림 에서 feature map 를 계산 하 는 방법 을 소개 합 니 다.
원본 이미지 에서 첫 번 째 볼 륨 층 을 거 쳐 첫 번 째 feature map 를 얻 은 것 을 예 로 들 면(얻 은 feature map 부터 그 후의 feature map 까지 마찬가지)첫 번 째 feature map 가 모두 64 개 라 고 가정 하면 이 feature map 도 한 폭 의 이미지 로 볼 수 있 습 니 다.다만 채널 수 는 64 이 고 일반적인 의미 의 이미 지 는 RGB 3 채널 입 니 다.이 첫 번 째 feature map 를 얻 기 위해 서 는 64 개의 볼 륨 핵 이 필요 합 니 다.모든 볼 륨 핵 은 k x k x 3 의 행렬 입 니 다.그 중에서 k 는 볼 륨 핵 의 크기(정사각형 볼 륨 핵 이 라 고 가정)이 고 3 은 입력 이미지 의 채널 수 에 대응 합 니 다.다음은 간단 하고 거 친 그림 으로 그림 이 볼 륨 핵 을 거 쳐 feature map 를 얻 는 과정 을 보 여 드 리 겠 습 니 다.
그림 에서 보 듯 이 사실은 볼 륨 핵 으로 볼 수 있 는 모든 채널(정확 하지 않 습 니 다.한 번 만)과 이미지 의 모든 채널 이 볼 륨 작업 을 한 다음 에 위 치 를 추가 하면 하나의 feature map 를 얻 을 수 있 습 니 다.
그러면 한 그룹(64 개)의 볼 륨 핵 으로 한 폭 의 그림 을 볼 륨 하고 64 개의 feature map 를 얻 으 면 다음 그림 과 같다.즉,모든 볼 륨 핵 은 하나의 feature map 를 얻 고 64 개의 볼 륨 핵 은 64 개의 feature map 를 얻 을 수 있다.
또한 이 문 제 를 약간 다른 각도 에서 볼 수 있다.그것 은 그림 의 특정한 채널 이 각각 64 개의 볼 륨 핵 에 대응 하 는 채널 과 볼 륨 을 하여 64 개의 feature map 의 중간 결 과 를 얻 은 다음 에 3 개의 채널 이 대응 하 는 중간 결 과 를 더 한 다음 에 최종 feature map 를 얻 는 것 이다.다음 그림 과 같다.
이것 이 바로 첫 번 째 그림 이 다 권 적 핵 으로 확 장 된 상황 을 볼 수 있 습 니 다.그림 이 비교적 거 칠 게 그 려 졌 고 어떤 중간 결과 와 최종 결 과 는 똑 같은 서브 그림 을 직접 사 용 했 습 니 다.이해 할 때 조금 만 주의 하 세 요.아래 코드 에서 볼 륨 핵 을 전시 할 때 사용 하 는 것 은 바로 이런 방식 이다.즉,이미지 한 채널 을 입력 하여 볼 륨 핵 을 표시 하 는 대응 채널 에 대응 하 는 것 이지 볼 륨 핵 을 표시 하 는 모든 채널 이 아니 라 설명 이 약간 돌아 있 을 수 있 으 므 로 주의해 야 한다.아래 의 이 작은 그림 을 통 해 더 잘 이해 할 수 있 을 것 이다.
그림 에서 빨 간 테두리 로 동 그 라 미 를 친 부분 은 바로 우리 가 보 여 준 가중치 매개 변수 이다.
2.네트워크 가중치 와 feature map 의 시각 화
(1)네트워크 가중치 파라미터 시각 화
먼저 Tensorflow 에서 볼 륨 핵 모양 을 소개 합 니 다.다음 코드 는 다음 과 같 습 니 다.
weights = tf.Variable(tf.random_normal([filter_size, filter_size, channels, filter_num]))
앞의 2 차원 은 볼 륨 핵 의 높이 와 너비 이 고 3 차원 은 윗 층 feature map 의 채널 수 입 니 다.첫 번 째 절(볼 륨 지식 보충)에서 저 는 윗 층 의 feature map 가 몇 개(즉,채널 수가 얼마 인지)라 고 언급 했 습 니 다.그러면 하나의 볼 륨 핵 에 도 이렇게 많은 채널 이 있어 야 합 니 다.4 차원 은 현재 볼 륨 층 의 볼 륨 핵 수량 이자 현재 층 에서 출력 하 는 feature map 의 채널 수 입 니 다.다음은 제 가 변경 한 네트워크 가중치 파라미터(볼 륨 핵)의 시각 화 코드 입 니 다.
from __future__ import print_function
#import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import os
import visualize_utils
def plot_conv_weights(weights, plot_dir, name, channels_all=True, filters_all=True, channels=[0], filters=[0]):
"""
Plots convolutional filters
:param weights: numpy array of rank 4
:param name: string, name of convolutional layer
:param channels_all: boolean, optional
:return: nothing, plots are saved on the disk
"""
w_min = np.min(weights)
w_max = np.max(weights)
# make a list of channels if all are plotted
if channels_all:
channels = range(weights.shape[2])
# get number of convolutional filters
if filters_all:
num_filters = weights.shape[3]
filters = range(weights.shape[3])
else:
num_filters = len(filters)
# get number of grid rows and columns
grid_r, grid_c = visualize_utils.get_grid_dim(num_filters)
# create figure and axes
fig, axes = plt.subplots(min([grid_r, grid_c]),
max([grid_r, grid_c]))
# iterate channels
for channel_ID in channels:
# iterate filters inside every channel
if num_filters == 1:
img = weights[:, :, channel_ID, filters[0]]
axes.imshow(img, vmin=w_min, vmax=w_max, interpolation='nearest', cmap='seismic')
# remove any labels from the axes
axes.set_xticks([])
axes.set_yticks([])
else:
for l, ax in enumerate(axes.flat):
# get a single filter
img = weights[:, :, channel_ID, filters[l]]
# put it on the grid
ax.imshow(img, vmin=w_min, vmax=w_max, interpolation='nearest', cmap='seismic')
# remove any labels from the axes
ax.set_xticks([])
ax.set_yticks([])
# save figure
plt.savefig(os.path.join(plot_dir, '{}-{}.png'.format(name, channel_ID)), bbox_inches='tight')
원래 프로젝트 의 코드 는 특정한 층 의 가중치 파라미터 나 feature map 를 한 격자 에서 모두 보 여 주 는 것 입 니 다.만약 에 매개 변수 나 feature map 가 너무 많 으 면 보 여 주 는 결과 에서 모든 그림 이 작 아서 유용 한 것 을 알 아 보기 어렵 습 니 다.다음 그림 과 같 습 니 다.그래서 나 는 코드 를 수정 해서 임의로 지정 한 filter 나 feature map 를 표시 할 수 있 도록 했다.
코드 중,
w_min = np.min(weights)
w_max = np.max(weights)
이 두 문장 은 그림 을 후속 적 으로 표시 하기 위해 사용 되 며,matplotlib.pyplot 의 imshow()함 수 를 구체 적 으로 볼 수 있 습 니 다.다음은 모든 채널(채널 수)이나 모든 filter 를 표시 할 지 여 부 를 판단 합 니 다.그렇다면,원본 코드 와 일치 합 니 다.그렇지 않 으 면 함수 매개 변수 channels 와 filers 가 지정 한 filter 를 그립 니 다.
다음 두 개의 코드 는 그림 을 그 리 는 데 사 용 됩 니 다.우 리 는 한 그림 에 여러 개의 키 그림 을 표시 할 수 있 습 니 다.아래 의 이 문장 은 큰 그림 을 몇 줄 로 나 누 는 것 이 적당 하 다 는 것 을 계산 하기 위해 서 입 니 다.(큰 그림 은 사각형 의 배열 로 나 눌 수 있 습 니 다.예 를 들 어 64 개의 키 그림 이 있 으 면 8 x 8 의 배열 로 나 눌 수 있 습 니 다)코드 디 테 일 은 원래 프로젝트 의 utils 에서 찾 을 수 있 습 니 다.
grid_r, grid_c = visualize_utils.get_grid_dim(num_filters)
실제 그림 을 그 릴 때 그림 하 나 를 그 리 려 면 따로 처리 해 야 한다.큰 그림 에 여러 개의 키 그림 을 표시 하려 면 원본 코드 로 하 십시오.다만 필터 없 이 모든 출력 을 표시 할 수 있 습 니 다.주로 데 이 터 를 받 은 것 은 다음 과 같은 코드 입 니 다.
img = weights[:, :, channel_ID, filters[l]]
나머지 는 모두 그림 과 관련 된 함수 이 므 로 본 고 는 그림 에 대해 더 이상 소개 하지 않 겠 다.이 코드 를 사용 하여 filter 를 시각 화하 고 저장 할 때 먼저 모델 을 불 러 온 다음 에 우리 가 시각 화 하고 자 하 는 부분 인 자 를 가 져 온 다음 에 함 수 를 직접 호출 하면 됩 니 다.다음 과 같 습 니 다.
with tf.Session(graph=tf.get_default_graph()) as sess:
init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init_op)
saver.restore(sess, model_path)
with tf.variable_scope('inference', reuse=True):
conv_weights = tf.get_variable('conv3_1_w').eval()
visualize.plot_conv_weights(conv_weights, dir_prefix, 'conv3_1')
필터 에 대한 추가 지정 이 없습니다.feature map 의 시각 화 에서 관련 예 를 드 리 겠 습 니 다.(2)feature map 시각 화
사실 feature map 의 시각 화 는 filter 와 매우 비슷 하고 미세 하 게 만 다 릅 니 다.일단 전체 코드 를 붙 이 는 게 좋 을 것 같 습 니 다.
def plot_conv_output(conv_img, plot_dir, name, filters_all=True, filters=[0]):
w_min = np.min(conv_img)
w_max = np.max(conv_img)
# get number of convolutional filters
if filters_all:
num_filters = conv_img.shape[3]
filters = range(conv_img.shape[3])
else:
num_filters = len(filters)
# get number of grid rows and columns
grid_r, grid_c = visualize_utils.get_grid_dim(num_filters)
# create figure and axes
fig, axes = plt.subplots(min([grid_r, grid_c]),
max([grid_r, grid_c]))
# iterate filters
if num_filters == 1:
img = conv_img[0, :, :, filters[0]]
axes.imshow(img, vmin=w_min, vmax=w_max, interpolation='bicubic', cmap=cm.hot)
# remove any labels from the axes
axes.set_xticks([])
axes.set_yticks([])
else:
for l, ax in enumerate(axes.flat):
# get a single image
img = conv_img[0, :, :, filters[l]]
# put it on the grid
ax.imshow(img, vmin=w_min, vmax=w_max, interpolation='bicubic', cmap=cm.hot)
# remove any labels from the axes
ax.set_xticks([])
ax.set_yticks([])
# save figure
plt.savefig(os.path.join(plot_dir, '{}.png'.format(name)), bbox_inches='tight')
코드 와 filter 의 시각 화 된 똑 같은 부분 은 더 이상 언급 하지 않 습 니 다.여 기 는 feature map 의 시각 화 독특한 부분 만 말 합 니 다.사실은 다음 과 같은 코드,즉 시각 화 된 데 이 터 를 얻 는 것 입 니 다.
img = conv_img[0, :, :, filters[0]]
신경 망 은 일반적으로 하나의 batch,하나의 batch 의 입력 데이터 로 입력 하 는 모양 은?
image = tf.placeholder(tf.float32, shape = [None, IMAGE_SIZE, IMAGE_SIZE, 3], name = "input_image")
첫 번 째 는 batch 에 있 는 그림 의 수량 입 니 다.유연 하 게 None 으로 설정 할 수 있 도록 Tensorflow 는 실제 입력 한 데이터 에 따라 계산 합 니 다.2,3 차원 은 그림 의 높이 와 너비 이 고 4 차원 은 그림 의 통로 수 이 며 보통 3 이다.그림 을 입력 하고 활성화 값(feature map)을 보 려 면 위 차원 에서 batch 형식 으로 입력 해 야 합 니 다.즉,[1,IMAGESIZE, IMAGE_SIZE, 3]。그래서 feature map 데 이 터 를 가 져 올 때 첫 번 째 차원 은 0(batch 의 현재 그림 에 대응)을 취하 고 2,3 차원 은 모든 것 을 취하 고 4 차원 은 우리 가 보고 싶 은 feature map 의 특정한 통 로 를 취한 다.
시각 화 된 feature map 를 원한 다 면 네트워크 를 구축 할 때 손발 을 움 직 여야 합 니 다.계산 도 를 정의 할 때 한 그룹의 활성화 값 을 받 을 때마다 Tensorflow collection 에 추가 해 야 합 니 다.다음 과 같 습 니 다.
tf.add_to_collection('activations', current)
실제 feature map 시각 화 를 진행 할 때 먼저 그림 을 입력 한 다음 에 네트워크 를 실행 하여 해당 하 는 데 이 터 를 얻 고 마지막 으로 데 이 터 를 시각 화 함수 에 전달 해 야 합 니 다.다음 예 는 지 정 된 볼 륨 층 의 feature map 의 모든 채널 을 어떻게 시각 화하 고 저장 하 는 지 보 여 줍 니 다.VGG 16 네트워크 를 사용 합 니 다.
visualize_layers = ['conv1_1', 'conv1_2', 'conv2_1', 'conv2_2', 'conv3_1', 'conv3_2', 'conv3_3', 'conv4_1', 'conv4_2', 'conv4_3', 'conv5_1', 'conv5_2', 'conv5_3']
with tf.Session(graph=tf.get_default_graph()) as sess:
init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init_op)
saver.restore(sess, model_path)
image_path = root_path + 'images/train_images/sunny_0058.jpg'
img = misc.imread(image_path)
img = img - meanvalue
img = np.float32(img)
img = np.expand_dims(img, axis=0)
conv_out = sess.run(tf.get_collection('activations'), feed_dict={x: img, keep_prob: 1.0})
for i, layer in enumerate(visualize_layers):
visualize_utils.create_dir(dir_prefix + layer)
for j in range(conv_out[i].shape[3]):
visualize.plot_conv_output(conv_out[i], dir_prefix + layer, str(j), filters_all=False, filters=[j])
sess.close()
그 중,convout 은 collection 에 추 가 된 모든 feature map 를 포함 하고 있 습 니 다.이 feature map 는 conv 에 있 습 니 다.out 에 서 는 볼 륨 층 에 따라 구분 되 어 있 습 니 다.최종 적 으로 얻 은 결 과 는 다음 그림 과 같다.
첫 번 째 폴 더 의 모든 결과:
이 편 은 Tensorflow 의 가중치 와 feature map 에 대한 시각 적 상세 한 설명 은 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시 기 를 바 랍 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[번역] TF-api(1)tf.nn.max_poolArgs: value: A 4-D Tensor with shape [batch, height, width, channels] and type tf.float32 . value는 4D의 tensor입니다. maxpoo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.