企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## **实现:** **在输入空间中进行梯度上升**,从空白输入图像开始,将**梯度下降**应用于卷积神经网络输入图像的值,其目的是让某个过滤器的响应**最大化**。得到的输入图像是选定过滤器具有最大响应的图像。 * 构建一个*损失函数*,其目的是让某个卷积层的某个过滤器的值最大化 * 使用随机*梯度*下降来调节输入图像的值,以便让这个激活值最大化 ***** *损失函数* ~~~ from keras.applications import VGG16 from keras import backend as K model = VGG16(weights='imagenet',include_top=False) layer_name = 'block3_conv1' filter_index = 0 layer_output = model.get_layer(layer_name).output loss = K.mean(layer_output[:, :, :, filter_index]) ~~~ 损失相对于输入的*梯度* ~~~ grads = K.gradients(loss, model.input)[0] #调用gradients返回的是一个张量列表(本例中列表长度为1) #因此,只保留第一个元素,它是一个张量 grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5) #做除法前加上1e–5,以防不小心除以0 ~~~ 一种方法:给定输入图像,它能够计算损失张量和梯度张量的值 你可以定义一个 Keras 后端函数来实现此方法:`iterate`是一个函数,它将一个 Numpy 张量(表示为长度为 1 的张量列表)转换为两个 Numpy 张量组成的列表,这两个张量分别是损失值和梯度值。 ~~~ iterate = K.function([model.input], [loss, grads]) import numpy as np loss_value, grads_value = iterate([np.zeros((1, 150, 150, 3))]) ~~~ 通过随机梯度下降让损失最大化 ~~~ input_img_data = np.random.random((1, 150, 150, 3)) * 20 + 128. #从一张带有噪声的灰度图像开始 step = 1. #每次梯度更新的步长 (以下4行)运行40次梯度上升 for i in range(40): loss_value, grads_value = iterate([input_img_data]) #计算损失值和梯度值 input_img_data += grads_value * step #沿着让损失最大化的方向调节输入图像 ~~~ 需要对这个张量进行后处理,将其转换为可显示的图像 ~~~ def deprocess_image(x): x -= x.mean() #(以下3行)对张量做标准化,使其均值为0,标准差为0.1 x /= (x.std() + 1e-5) x *= 0.1 x += 0.5 #(以下2行)将x裁切(clip)到[0, 1]区间 x = np.clip(x, 0, 1) x *= 255 #(以下3行)将x转换为RGB数组 x = np.clip(x, 0, 255).astype('uint8') return x ~~~ ***** 将上述代码片段放到一个 Python 函数中 * 输入一个层的名称和一个过滤器索引 * 返回一个有效的图像张量,表示能够将特定过滤器的激活最大化的模式 ~~~ def generate_pattern(layer_name, filter_index, size=150): layer_output = model.get_layer(layer_name).output #(以下2行)构建一个损失函数,将该层第n个过滤器的激活最大化 loss = K.mean(layer_output[:, :, :, filter_index]) grads = K.gradients(loss, model.input)[0] #计算这个损失相对于输入图像的梯度 grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5) #标准化技巧:将梯度标准化 iterate = K.function([model.input], [loss, grads]) #返回给定输入图像的损失和梯度 input_img_data = np.random.random((1, size, size, 3)) * 20 + 128. #从带有噪声的灰度图像开始 step = 1.#(以下4行)运行40次梯度上升 for i in range(40): loss_value, grads_value = iterate([input_img_data]) input_img_data += grads_value * step img = input_img_data[0] return deprocess_image(img) ~~~