我正在使用转移学习来识别对象。我使用训练有素的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)
但是它会引发错误:
“图像数据的尺寸无效”
我想知道如何将提取的特征向量显示为图像。请提出任何建议。
答案 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()
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)