Visualizing convnet filters keras示例代码详解

心已入冬 提交于 2019-12-18 02:39:16

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模型

不含全连接层的vgg16
model = 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])
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!