如何从 resnet 层循环遍历 4D(无,x,y,z)激活张量的 2D 矩阵?

Posted

技术标签:

【中文标题】如何从 resnet 层循环遍历 4D(无,x,y,z)激活张量的 2D 矩阵?【英文标题】:How to loop through 2D matrices of a 4D (None, x, y, z) activation tensor from a resnet layer? 【发布时间】:2019-10-01 11:20:41 【问题描述】:

我想遍历 4D 张量的 2D 矩阵,它是 resnet 层(激活图或特征图)的输出,以便在测试时对其进行一些修改

注意:我正在使用 keras

我尝试使用不同的代码将张量转换为 numpy 数组,但出现了一些奇怪的错误

总结一下:我只需要对 resnet 层的激活张量进行一些修改,然后继续前向传递,以便“可能”获得一些准确性提升

【问题讨论】:

【参考方案1】:

您可以使用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)

现在您可以使用此函数通过特定索引获取 2D 张量。

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)

【讨论】:

感谢您的回复,目前在测试时间,批量大小为 1,我需要获取每个图像激活的 2D 矩阵,例如在我的第一个块之后我有一个张量形状 (1, 55, 55, 256) 并且我需要遍历这个张量的所有 256 个矩阵我在提取它时没有问题,因为我将我的处理块添加到预训练模型本身所以我有它的输出 非常感谢您的回复,但我认为您没有明白我的意思,问题是我没有模型,我想稍微调整一下,我不能称之为在修改它的同时,我在我的模型的体系结构中工作,试图获取它的中间输出并处理它们,而不是将这个处理过的张量转发到下一层等。我面临着如何进行这些中间激活和循环的问题在它们之上,然后将此处理后的激活转发到下一层 这意味着我不能用 model.predict() 调用它我正在修改它的架构,当我试图捕捉它的中间输出时我无法处理它们 非常感谢您的帮助,我想我明白了,我会将 resnet 分成两个模型并在第一个模型上进行预测,然后预处理这个预测的激活并将其作为第二个模型的输入,但是直到现在我在创建 seconf 模型时遇到错误,因为它的输入如下: resnet.get_layer('layerName').input

以上是关于如何从 resnet 层循环遍历 4D(无,x,y,z)激活张量的 2D 矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

JS 循环遍历JSON数据

论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解

论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解

论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解

论文基于RF的3D骨架(RF-Based 3D Skeletons)--关于4D卷积分解的理解

x变成y的最少操作次数(层次遍历)