1. 程式人生 > 其它 >關於視覺化神經網路中間層的詳細說明

關於視覺化神經網路中間層的詳細說明

技術標籤:持續更新格式轉換視覺化神經網路深度學習

關於視覺化神經網路中間層的詳細說明

一、對一些處理的意義的說明

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()