日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

卷机神经网络的可视化(可视化中间激活)

發布時間:2025/4/16 编程问答 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卷机神经网络的可视化(可视化中间激活) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于中間激活的可視化,我們使用之前在貓狗分類中從頭開始訓練的小型卷積神經網絡。

from keras.models import load_modelmodel = load_model('cats_and_dogs_small_2.h5') model.summary() Layer (type) Output Shape Param # ================================================================= conv2d_5 (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________ max_pooling2d_5 (MaxPooling2 (None, 74, 74, 32) 0 _________________________________________________________________ conv2d_6 (Conv2D) (None, 72, 72, 64) 18496 _________________________________________________________________ max_pooling2d_6 (MaxPooling2 (None, 36, 36, 64) 0 _________________________________________________________________ conv2d_7 (Conv2D) (None, 34, 34, 128) 73856 _________________________________________________________________ max_pooling2d_7 (MaxPooling2 (None, 17, 17, 128) 0 _________________________________________________________________ conv2d_8 (Conv2D) (None, 15, 15, 128) 147584 _________________________________________________________________ max_pooling2d_8 (MaxPooling2 (None, 7, 7, 128) 0 _________________________________________________________________ flatten_2 (Flatten) (None, 6272) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 6272) 0 _________________________________________________________________ dense_3 (Dense) (None, 512) 3211776 _________________________________________________________________ dense_4 (Dense) (None, 1) 513 ================================================================= Total params: 3,453,121 Trainable params: 3,453,121 Non-trainable params: 0

接下面,輸入一張不屬于網絡的貓的圖像

img_path = '/Users/fchollet/Downloads/cats_and_dogs_small/test/cats/cat.1700.jpg'from keras.preprocessing import image # 將圖像處理成為一個4D張量 import numpy as npimg = image.load_img(img_path, target_size=(150, 150)) img_tensor = image.img_to_array(img) img_tensor = np.expand_dims(img_tensor, axis=0) img_tensor /= 255.print(img_tensor.shape)

(1, 150, 150, 3)

顯示測試圖像

import matplotlib.pyplot as pltplt.imshow(img_tensor[0]) plt.show()

為了提取想要查看的特征圖,我們需要創建一個Keras模型,以圖像批量作為輸入,并輸出所有卷積層和池化層的激活。為此,我們需要使用Keras的Model類。模型實例化需要兩個參數:一個輸入張量(或輸入張量的列表)和一個輸出張量(或輸出張量的列表)。

from keras import modelslayer_outputs = [layer.output for layer in model.layers[:8]] #提取前8層的輸出activation_model = models.Model(inputs=model.input, outputs=layer_outputs) #創建一個模型,給定模型的輸入,可以返回這些輸出

這段語句是輸入一張圖像,這個模型將返回原始模型的前8層激活值。這個模型有一個輸入和8個輸出,即每層激活對應一個輸出。

activations = activation_model.predict(img_tensor) # 返回8個Numpy數組組成的列表,每個層激活對應一個Numpy數組first_layer_activation = activations[0] print(first_layer_activation.shape)

(1, 148, 148, 32)
它是大小為148*148的特征圖,有32個通道。我們來繪制原始模型第3個通道:

import matplotlib.pyplot as pltplt.matshow(first_layer_activation[0, :, :, 3], cmap='viridis') plt.show()


再看看第30個通道:

plt.matshow(first_layer_activation[0, :, :, 30], cmap='viridis') plt.show()

我們可以看到,似乎不同通道對于圖像檢測有不同側重,比如第3個通道更側重于邊緣檢測,第30個通道更側于”綠色圓點“檢測。

下面我們來繪制網絡中所有激活的完整可視化圖。我們需要在8個特征圖里的每一個都提取并繪制一個通道,然后將結果疊加在一個大的圖像張量中,按通道并排。

import keraslayer_names = [] for layer in model.layers[:8]:layer_names.append(layer.name) # 用來存儲層的名稱,這樣你就可以把層的名稱畫到圖中images_per_row = 16for layer_name, layer_activation in zip(layer_names, activations): # 顯示特征圖n_features = layer_activation.shape[-1] # 特征圖中的特征個數size = layer_activation.shape[1] # 特征圖的形狀為(1, size, size, n_features)n_cols = n_features // images_per_row # 在這個矩陣中將激活通道平鋪display_grid = np.zeros((size * n_cols, images_per_row * size))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()channel_image *= 64channel_image += 128channel_image = np.clip(channel_image, 0, 255).astype('uint8')display_grid[col * size : (col + 1) * size,row * size : (row + 1) * size] = channel_image # 顯示網格scale = 1. / sizeplt.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()








更多精彩內容,歡迎關注我的微信公眾號:數據瞎分析

總結

以上是生活随笔為你收集整理的卷机神经网络的可视化(可视化中间激活)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。