關於視覺化神經網路中間層的詳細說明
阿新 • • 發佈:2021-01-12
關於視覺化神經網路中間層的詳細說明
一、對一些處理的意義的說明
activation_model = models.Model(inputs=model.input, outputs=layer_outputs) #此處的inputs是之前匯入的模型,model = load_model('...(解釋:自己的模型)') # 特徵圖的形狀(1,寬,高,n_features) size = layer_activation.shape[1] # n_cols定義一個影象輸出格式即一行幾個圖,一共有幾行 把特徵圖平鋪在這個上面 n_cols = n_features / images_per_row display_grid = np.zeros((size * n_cols, images_per_row * size))
如:
一行十六個圖片,一共兩行
display_grid = np.zeros((size * n_cols, images_per_row * size))
#print("不明;", display_grid)
"""[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]
…
[0. 0. 0. … 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]
[0. 0. 0. … 0. 0. 0.]]"""
#製造一個特徵圖的載體,即後續影象會被存在到這個框架中
二、程式碼
import os #os.environ["KERAS_BACKEND"] = "plaidml.keras.backend" """視覺化中間層,有助於理解變換""" from keras.models import load_model model = load_model('cats_and_dogs_small_2.h5') img_path = r'J:\PyCharm專案\學習進行中\keras深度學習\data\train\train\cat.1700.jpg' # 我們將影象預處理為4D張量:即樣本數,圖片 from keras.preprocessing import image import numpy as np img = image.load_img(img_path, target_size=(150, 150))
i mg_tensor = image.img_to_array(img)
img_tensor = np.expand_dims(img_tensor, axis=0) """理解為增加一個括號!11""" print("擴充套件:",img_tensor.shape) # 請記住,模型是通過以下方式對輸入進行訓練的即圖片格式化: img_tensor /= 255. # Its shape is (1, 150, 150, 3) """圖片視覺化""" import matplotlib.pyplot as plt plt.imshow(img_tensor[0]) plt.show() from keras import models """提取所有的輸出圖片""" import keras # 這些是圖層的名稱 layer_names = [] for layer in model.layers[:8]: layer_names.append(layer.name) images_per_row = 16#繪圖時將16張圖放在一行 # 現在讓我們顯示特徵圖 for layer_name, layer_activation in zip(layer_names, activations): #這是要素圖中的要素數量,是每一層有多少特徵圖 n_features = layer_activation.shape[-1] # 特徵圖具有形狀(1,寬,高,n_features) size = layer_activation.shape[1] print("特徵大小:", size) # 定義一個影象輸出背景即一行幾個圖,一共有幾行 把特徵圖平鋪在這個上面 n_cols = n_features // images_per_row #print("圖的格子即有多少行;",n_cols) display_grid = np.zeros((size * n_cols, images_per_row * size)) """[[0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] ... [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.] [0. 0. 0. ... 0. 0. 0.]]""" #製造一個特徵圖的載體 # 我們將每個濾鏡平鋪到這個大的影象輸出格式中 for col in range(n_cols):#每一列 for row in range(images_per_row):#每一行 channel_image = layer_activation[0,:, :,col * images_per_row + row] # 對特徵進行後處理,注意此處輸出的是變化後的張量,因而對之進行預處理 channel_image -= channel_image.mean()#均值化 channel_image /= channel_image.std()#標準差 #圖片復原,即從預處理的特徵縮放為0,1之間的資料復原 channel_image *= 64 channel_image += 128 #由張量向圖片格式轉化 channel_image = np.clip(channel_image, 0, 255).astype('uint8')#資料裁剪到0到255內,8點陣圖像節省記憶體空間 # 將每一個特徵圖載入到視覺化的物件中去,行列物件位置 display_grid[col * size: (col + 1) * size, row * size: (row + 1) * size] = channel_image # 顯示所有圖片 scale = 1. / size plt.figure(figsize=(scale * display_grid.shape[1], scale * display_grid.shape[0])) plt.title(layer_name) plt.grid(False) plt.imshow(display_grid, aspect='auto', cmap='viridis') plt.show()