## **實現:**
**在輸入空間中進行梯度上升**,從空白輸入圖像開始,將**梯度下降**應用于卷積神經網絡輸入圖像的值,其目的是讓某個過濾器的響應**最大化**。得到的輸入圖像是選定過濾器具有最大響應的圖像。
* 構建一個*損失函數*,其目的是讓某個卷積層的某個過濾器的值最大化
* 使用隨機*梯度*下降來調節輸入圖像的值,以便讓這個激活值最大化
*****
*損失函數*
~~~
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
- 神經風格遷移
- 變分自編碼器
- 生成式對抗網絡
- 術語表