Visualizing convnet filters
1. 任务内容及目标
观察卷积网络学习到了什么。
2. 主要思路
随机输入噪声,优化指定滤波器的激活值,通过梯度增加的方式,修改输入图片,观察滤波器对什么图案响应比较高。
2.1 输入
随机初始化一张有点噪声的图,将图片输入网络
input_img_data = np.random.random((1, img_width, img_height, 3))
input_img_data = (input_img_data - 0.5) * 20 + 128
2.2 损失函数
损失函数的目标是最大可视化的滤波器的激活值loss = K.mean(layer_output[:, :, ;, filter])
2.3 根据损失函数更新输入图片
计算损失函数对应的梯度,为了使损失函数更大,迭代input_img_data += grads_value * step
调整输入的图片(固定权重,调整图片)
3.代码解析
3.1模型
不含全连接层的vgg16model = vgg16.VGG16(weights='imagenet', include_top=False)
3.2 生成数据处理
生成的图片中的值可能不在[0,255]之间,所
以需要处理数据成为一张可以展示的图片
def deprocess_image(x):
# normalize tensor: center on 0., ensure std is 0.1
x -= x.mean()
x /= (x.std() + K.epsilon())
x *= 0.1
# clip to [0, 1]
x += 0.5
x = np.clip(x, 0, 1)
# convert to RGB array
x *= 255
x = np.clip(x, 0, 255).astype('uint8')
return x
3.3 backend涉及到的一些函数
function(inputs, outputs, updates=[])
实例化一个Keras函数
参数:
• inputs::列表,其元素为占位符或张量变量
• outputs:输出张量的列表
• updates:列表,其元素是形如<tf.Tensor ‘AssignAdd_9:0’ shape=() dtype=float32_ref>的张量.
gradients(loss, variables)
返回loss函数关于variables的梯度,variables为张量变量的列表
grads = K.gradients(loss, input_img)[0]
# normalization trick: we normalize the gradient
grads = normalize(grads)
# 返回输入图片的损失值和梯度
iterate = K.function([input_img], [loss, grads])
来源:CSDN
作者:打酱油QAQ
链接:https://blog.csdn.net/qq_24906797/article/details/103578917