我想遍历4D张量的2D矩阵,这是resnet层(激活图或特征图)的输出,以便在测试时对其进行一些修改
NB:我在使用喀拉拉邦
我尝试使用不同的代码将张量转换为numpy数组,但出现了一些奇怪的错误
总结:我只需要对resnet层的激活张量进行一些修改,然后继续进行前向遍历,以便“也许”获得一些准确性
答案 0 :(得分:0)
您可以使用keras.backend.function。由于您尚未提供模型结构,因此我将使用以下模型,其输出为4D张量。
model = Sequential(
[
Conv2D(z, 3, input_shape=(x, y, 3), padding="same"),
]
);
print(model.output.shape) # None, x, y, z)
使用此模型,可以使用keras.backend.function
函数在特定位置获取输出值。在您的情况下,您尝试获取最后2个维度,因此必须使用批处理索引和宽度索引(假设channels_last数据格式)进行索引。
def get_model_output_at(model, batch_index, width_index):
output = model.output[batch_index][width_index]
return keras.backend.function(model.input, output)
现在您可以使用此功能通过特定的索引获取二维张量。
func = get_model_output_at(model, 0, 0) # To access the first row of the first image(batch 0 and row 0).
images = np.random.randn(10, x, y, z) # Random images
output = func(images)
print(output.shape) # (y, z)
要遍历特征图,请使用以下功能
def get_feature_map_at(model, index):
output = model.output[:, :, :, index]
return keras.backend.function(model.input, output)
现在,使用上述功能,您可以遍历每个特征图。
image = np.random.randn(1, 55, 55, 256)
for i in range(model.output.shape[-1]):
feature_map_i_function = get_feature_map_at(model, i)
feature_map_i = feature_map_i_function(image).reshape(55, 55)
实际上,有更好的方法可以使用model.predict并遍历结果数组来完成上述任务。
image = np.random.randn(1, 55, 55, 256)
predicted_feature_map = model.predict(image)
for i in range(predicted_feature_map.shape[-1]):
feature_map_i = predicted_feature_map[:, :, :, i].reshape(55,55)