keras 我怎样才能得到所有输出角层(特征Map)在预测阶段?

kninwzqo  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(117)

我试着获取cfiar数据集,并尝试获取每个输出的特征图,将其中一个测试图像作为输入。

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# Normalize pixel values to be between 0 and 1
train_images, test_images = train_images / 255.0, test_images / 255.0

class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
           'dog', 'frog', 'horse', 'ship', 'truck']

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))

model.compile(optimizer='adam',
          loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
          metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, 
                validation_data=(test_images, test_labels))

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

layer_input = test_images[0]                  

for i in range(len(model.layers)):
    get_layer_output = K.function(inputs = model.layers[i].input, outputs = model.layers[i].output)
    print(get_layer_output(layer_input))
    layer_input = model.layers[i].output

我的感觉是我误解了一些关于如何设置输入以及如何在预测过程中获取输出的东西。

5fjcxozz

5fjcxozz1#

如果使用Sequential型号,则应将输入设置为model.layers[0].input

    • 首先**,扩展测试输入的维度,以包括Batch_Size:
layer_input = test_images[0]    
plt.imshow(layer_input)   # Plot Test Image
layer_input = tf.expand_dims(layer_input,0)   # Add prefix of Batch Size 
print(layer_input.shape)  # Prints  : (1, 32, 32, 3)
    • 输出**:

    • 修改的绘图代码:**
for i in range(len(model.layers)):
    get_layer_output = K.function(inputs = model.layers[0].input, outputs = model.layers[i].output)

    get_1_output = get_layer_output(layer_input)
    # print(get_1_output.shape) << Use this to check if the Output shape matches the shape of Model.summary()

    if get_1_output.ndim == 4:             # Check for Dimensionality to plot ONE feature map (Batch size, Length, Width
      plt.imshow(get_1_output[0][:,:,:3])  # Plots the output of Conv2D and MaxPooling
    else:
      print(get_1_output)   # If not Image, ie. Array, print the Values

    plt.show()
    • 输出**:

希望我回答了你的问题。

4nkexdtk

4nkexdtk2#

你可以使用下面的python脚本来绘制神经网络的特征图。

import tensorflow as tf
import  cv2
import numpy as np

# use 'model' as your model name
# change 224 image size to your model input image size 

layer_names = [layer.name for layer in model.layers]

layer_outputs = [layer.output for layer in model.layers[1:]]

feature_map_model = tf.keras.models.Model(inputs=model.input, outputs=layer_outputs)

img = cv2.imread("path/to/image/image.jpg")
img = cv2.resize(img, (224,224))
img = np.array([img])/255.0

feature_maps = feature_map_model.predict(img, verbose=0)

for layer_name, feature_map in zip(layer_names, feature_maps):

    if len(feature_map.shape) == 4:
    k = feature_map.shape[-1]
    size=feature_map.shape[1]

    image_belt = np.zeros((size, size * k))

    for i in range(k):
        feature_image = feature_map[0, :, :, i]
        feature_image-= feature_image.mean()
        feature_image/= feature_image.std ()
        feature_image*=  64
        feature_image+= 128
        feature_image= np.clip(feature_image, 0, 255).astype('uint8')
        image_belt[:, i * size : (i + 1) * size] = feature_image

    scale = 20. / k
    plt.figure( figsize=(scale * k, scale) )
    plt.title ( layer_name )
    plt.grid  ( False )
    plt.imshow( image_belt, aspect='auto')

参考:https://www.analyticsvidhya.com/blog/2020/11/tutorial-how-to-visualize-feature-maps-directly-from-cnn-layers/

相关问题