从模型的训练层显示提取的特征向量为图像

时间:2019-02-03 13:06:00

标签: python numpy keras feature-extraction keras-layer

我正在使用转移学习来识别对象。我使用训练有素的VGG16模型作为基础模型,并使用Keras在其之上添加了分类器。然后,我根据数据对模型进行了训练,模型运行良好。我想查看由模型的中间层为给定数据生成的功能。为此,我使用了以下代码:

def ModeloutputAtthisLayer(model, layernme, imgnme, width, height):

    layer_name = layernme
    intermediate_layer_model = Model(inputs=model.input,
                                     outputs=model.get_layer(layer_name).output)
    img = image.load_img(imgnme, target_size=(width, height))
    imageArray = image.img_to_array(img)
    image_batch = np.expand_dims(imageArray, axis=0)
    processed_image = preprocess_input(image_batch.copy())
    intermediate_output = intermediate_layer_model.predict(processed_image)
    print("outshape of ", layernme, "is ", intermediate_output.shape)

在代码中,我使用np.expand_dims为批次添加了一个额外的维度,因为网络的输入矩阵应为(batchsize, height, width, channels)的形式。此代码可以正常工作。特征向量的形状为1, 224, 224, 64

现在,我希望将其显示为图像,为此,我了解到有一个附加尺寸作为批次添加,因此我应该将其删除。在此之后,我使用了以下几行代码:

imge = np.squeeze(intermediate_output, axis=0)
plt.imshow(imge)

但是它会引发错误:

  

“图像数据的尺寸无效”

我想知道如何将提取的特征向量显示为图像。请提出任何建议。

2 个答案:

答案 0 :(得分:2)

您的要素形状为Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:eu-central-1:890543041640:targetgroup/prc-service-devTargetGroup/97e3566c8b307abf) ,您不能直接绘制(1,224,224,64)通道图像。您可以做的是像下面这样独立绘制各个通道

64

这将在imge = np.squeeze(intermediate_output, axis=0) filters = imge.shape[2] plt.figure(1, figsize=(32, 32)) # plot image of size (32x32) n_columns = 8 n_rows = math.ceil(filters / n_columns) + 1 for i in range(filters): plt.subplot(n_rows, n_columns, i+1) plt.title('Filter ' + str(i)) plt.imshow(imge[:,:,i], interpolation="nearest", cmap="gray") 行和64列中绘制8图像。

答案 1 :(得分:1)

一种可行的方法是通过如下所示的加权和将64个通道组合成一个单通道图像:

weighted_imge = np.sum(imge*weights, axis=-1)

其中weights是具有64个加权系数的数组。

如果您希望赋予所有通道相同的权重,则可以简单地计算平均值:

weighted_imge = np.mean(imge, axis=-1)

演示

import numpy as np
import matplotlib.pyplot as plt

intermediate_output = np.random.randint(size=(1, 224, 224, 64), 
                                        low=0, high=2**8, dtype=np.uint8)
imge = np.squeeze(intermediate_output, axis=0)
weights = np.random.random(size=(imge.shape[-1],))

weighted_imge = np.sum(imge*weights, axis=-1)

plt.imshow(weighted_imge)
plt.colorbar()

weighted_imge

In [33]: intermediate_output.shape
Out[33]: (1, 224, 224, 64)

In [34]: imge.shape
Out[34]: (224, 224, 64)

In [35]: weights.shape
Out[35]: (64,)

In [36]: weighted_imge.shape
Out[36]: (224, 224)