如何计算TensorFlow中的类激活映射?

如何计算TensorFlow中的类激活映射?,tensorflow,deep-learning,computer-vision,conv-neural-network,Tensorflow,Deep Learning,Computer Vision,Conv Neural Network,我了解类激活映射的定义以及如何在Numpy中生成它。 但是,我不知道如何在TensorFlow中计算它,特别是当批次大小尺寸未知时 目前,我已经获得了我的最后一个卷积层“激活”的激活。 间隙后最后一个完全连接层的权重矩阵为“last_fc_w” 我想这样计算类激活图: cam = tf.matmul(activation, last_fc_w) 但是,我得到了以下错误: ***ValueError:形状必须为秩2,但对于输入形状为[?,10,10576],[576,2]的“MatMul”(op

我了解类激活映射的定义以及如何在Numpy中生成它。 但是,我不知道如何在TensorFlow中计算它,特别是当批次大小尺寸未知时

目前,我已经获得了我的最后一个卷积层“激活”的激活。 间隙后最后一个完全连接层的权重矩阵为“last_fc_w”

我想这样计算类激活图:

cam = tf.matmul(activation, last_fc_w)
但是,我得到了以下错误: ***ValueError:形状必须为秩2,但对于输入形状为[?,10,10576],[576,2]的“MatMul”(op:'MatMul'),形状必须为秩4

激活张量的形状为[?,10,10576],其中?是批次大小维度。 全连接层权重的形状为[576,2],其中2是类数,576是最后一个卷积层的通道数


预期输出将是大小为[?,10,10,2]的张量,这是这两个类的类激活映射。有谁能提供一些关于如何实现这一点的指导吗?

您可以尝试
keras.backend.dot

import tensorflow as tf
import numpy as np
x = tf.placeholder(shape=[None, 32, 32, 3], dtype=tf.float32)
out = tf.keras.layers.Conv2D(576, (3,3), padding='same', activation='relu')(x)
w = tf.Variable(tf.glorot_normal_initializer()([576, 2]))
print(out.shape)
cam = tf.keras.backend.dot(out, w)
print(cam.shape)
但是在更高的TF版本(针对1.15.0测试)中,您现有的代码可以工作。我测试了以下代码

import tensorflow as tf
import numpy as np
x = tf.placeholder(shape=[None, 32, 32, 3], dtype=tf.float32)
out = tf.keras.layers.Conv2D(576, (3,3), padding='same', activation='relu')(x)
w = tf.Variable(tf.glorot_normal_initializer()([576, 2]))
print(out.shape)
cam = tf.matmul(out, w)
print(cam.shape)
从激活映射创建掩码 轻松点


您可以尝试
keras.backend.dot

import tensorflow as tf
import numpy as np
x = tf.placeholder(shape=[None, 32, 32, 3], dtype=tf.float32)
out = tf.keras.layers.Conv2D(576, (3,3), padding='same', activation='relu')(x)
w = tf.Variable(tf.glorot_normal_initializer()([576, 2]))
print(out.shape)
cam = tf.keras.backend.dot(out, w)
print(cam.shape)
但是在更高的TF版本(针对1.15.0测试)中,您现有的代码可以工作。我测试了以下代码

import tensorflow as tf
import numpy as np
x = tf.placeholder(shape=[None, 32, 32, 3], dtype=tf.float32)
out = tf.keras.layers.Conv2D(576, (3,3), padding='same', activation='relu')(x)
w = tf.Variable(tf.glorot_normal_initializer()([576, 2]))
print(out.shape)
cam = tf.matmul(out, w)
print(cam.shape)
从激活映射创建掩码 轻松点


您正在尝试哪个TF版本?@thushv89我当前正在使用1.13.1。您正在尝试哪个TF版本?@thushv89我当前正在使用1.13.1。非常感谢您的指导。我终于成功了。现在,我有一个CAM[?,10,10]和一个激活[?,10,10,576],我想使用CAM作为掩码,如果对应的CAM像素高于某个阈值,则将激活像素设置为0。你能为如何在TensorFlow中实现这一点提供一些指导吗?非常感谢你的指导。我终于成功了。现在,我有一个CAM[?,10,10]和一个激活[?,10,10,576],我想使用CAM作为掩码,如果对应的CAM像素高于某个阈值,则将激活像素设置为0。你能为如何在TensorFlow中实现这一点提供一些指导吗?