大佬們,在學習計算機視覺程序中,遇到了一個關于可視化卷積神經網路的過濾器的問題。
在構建好三個函式之后,將VGG16的前四層,每層的前64個過濾器,放進由64*64像素的8*8網格中時,輸出結果的網格是空白的,而不是每個過濾器的最大回應。在debug程序中發現可能是初始化網格或者放入網格的程序出了問題,但是沒有找到root cause。
大佬們能瞅瞅是哪的問題,應該怎么改過來嗎
Python code如下:
from keras.applications import VGG16
from keras import backend as K
import numpy as np
import matplotlib.pyplot as plt
model = VGG16(weights='imagenet',
include_top=False)
def deprocess_image(x):
x -= x.mean()
x /= (x.std()+1e-5)
x *= 0.1
x += 0.5
x = np.clip(x, 0, 1)
x *= 255
x = np.clip(x, 0, 255).astype('uint8')
return x
def generate_pattern(layer_name, filter_index, size=150):
layer_output = model.get_layer(layer_name).output
loss = K.mean(layer_output[:, :, :, filter_index])
grads = K.gradients(loss, model.input)[0]
grads /= (K.sqrt(K.mean(K.square(grads)))+1e-5)
interate = K.function([model.input], [loss, grads])
input_img_data = np.random.random((1, size, size, 3))*20+128.
step = 1.
for i in range(40):
loss_value, grads_value = interate([input_img_data])
input_img_data += grads_value*step
img = input_img_data[0]
return deprocess_image(img)
plt.imshow(generate_pattern('block3_conv1', 0))
plt.show()
for layer_name in ['block1_conv1', 'block2_conv1', 'block3_conv1', 'block4_conv1']:
size = 64
margin = 5
results = np.zeros((8*size+7*margin, 8*size+7*margin, 3))
for i in range(8):
for j in range(8):
filter_image = generate_pattern(layer_name, i+(j*8), size=size)
horizontal_start = i*size+i*margin
horizontal_end = horizontal_start+size
vertical_start = j*size+j*margin
vertical_end = vertical_start+size
results[horizontal_start:horizontal_end, vertical_start:vertical_end, :] = filter_image
plt.figure(figsize=(20, 20))
plt.imshow(results)
plt.show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/104974.html
標籤:人工智能技術
