## **实现:**
**在输入空间中进行梯度上升**,从空白输入图像开始,将**梯度下降**应用于卷积神经网络输入图像的值,其目的是让某个过滤器的响应**最大化**。得到的输入图像是选定过滤器具有最大响应的图像。
* 构建一个*损失函数*,其目的是让某个卷积层的某个过滤器的值最大化
* 使用随机*梯度*下降来调节输入图像的值,以便让这个激活值最大化
*****
*损失函数*
~~~
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)
~~~
- 基础
- 张量tensor
- 整数序列(列表)=>张量
- 张量运算
- 张量运算的几何解释
- 层:深度学习的基础组件
- 模型:层构成的网络
- 训练循环 (training loop)
- 数据类型与层类型、keras
- Keras
- Keras 开发
- Keras使用本地数据
- fit、predict、evaluate
- K 折 交叉验证
- 二分类问题-基于梯度的优化-训练
- relu运算
- Dens
- 损失函数与优化器:配置学习过程的关键
- 损失-二分类问题
- 优化器
- 过拟合 (overfit)
- 改进
- 小结
- 多分类问题
- 回归问题
- 章节小结
- 机械学习
- 训练集、验证集和测试集
- 三种经典的评估方法
- 模型评估
- 如何准备输入数据和目标?
- 过拟合与欠拟合
- 减小网络大小
- 添加权重正则化
- 添加 dropout 正则化
- 通用工作流程
- 计算机视觉
- 卷积神经网络
- 卷积运算
- 卷积的工作原理
- 训练一个卷积神经网络
- 使用预训练的卷积神经网络
- VGG16
- VGG16详细结构
- 为什么不微调整个卷积基?
- 卷积神经网络的可视化
- 中间输出(中间激活)
- 过滤器
- 热力图
- 文本和序列
- 处理文本数据
- n-gram
- one-hot 编码 (one-hot encoding)
- 标记嵌入 (token embedding)
- 利用 Embedding 层学习词嵌入
- 使用预训练的词嵌入
- 循环神经网络
- 循环神经网络的高级用法
- 温度预测问题
- code
- 用卷积神经网络处理序列
- GRU 层
- LSTM层
- 多输入模型
- 回调函数
- ModelCheckpoint 与 EarlyStopping
- ReduceLROnPlateau
- 自定义回调函数
- TensorBoard_TensorFlow 的可视化框架
- 高级架构模式
- 残差连接
- 批标准化
- 批再标准化
- 深度可分离卷积
- 超参数优化
- 模型集成
- LSTM
- DeepDream
- 神经风格迁移
- 变分自编码器
- 生成式对抗网络
- 术语表