我想实现对训练有素的图像分类 CNN 模型的关注。例如,有 30 个类别,使用 Keras CNN,我为每张图像获得预测类别。但是,为了可视化预测结果的重要特征/位置。我想在 FC 层之后添加一个 Soft Attention。我尝试阅读“ Show, Attend and Tell: Neural Image Caption Generation with Visual Attention ”以获得类似的结果。但是,我无法理解作者是如何实现的。因为我的问题不是图像标题或文本 seq2seq 问题。
我有一个图像分类 CNN,想提取特征并将其放入 LSTM 以可视化软注意力。虽然我每次都被卡住。
我采取的步骤:
- 加载 CNN 模型
- 从单个图像中提取特征(但是,LSTM 将检查同一图像,并在图像中删除一些补丁)
我采取的步骤:
- 加载 CNN 模型(我之前已经训练了 CNN 进行预测)
- 从单个图像中提取特征(但是,LSTM 将检查同一图像,并在图像中删除一些补丁)
在执行以下步骤后卡住:
- 创建具有软注意力的 LSTM
- 获得单个输出
我正在使用具有 TensorFlow 背景的 Keras。CNN 特征是使用 ResNet50 提取的。图像为 224x224,FC 层有 2048 个单位作为输出形状。
#Extract CNN features:
base_model = load_model(weight_file, custom_objects={'custom_mae': custom_mae})
last_conv_layer = base_model.get_layer("global_average_pooling2d_3")
cnn_model = Model(input=base_model.input, output=last_conv_layer.output)
cnn_model.trainable = False
bottleneck_features_train_v2 = cnn_model.predict(train_gen.images)
#Create LSTM:
seq_input = Input(shape=(1, 224, 224, 3 ))
encoded_frame = TimeDistributed(cnn_model)(seq_input)
encoded_vid = LSTM(2048)(encoded_frame)
lstm = Dropout(0.5)(encoded_vid)
#Add soft attention
attention = Dense(1, activation='tanh')(lstm)
attention = Flatten()(attention)
attention = Activation('softmax')(attention)
attention = RepeatVector(units)(attention)
attention = Permute([2, 1])(attention)
#output 101 classes
predictions = Dense(101, activation='softmax', name='pred_age')(attention)
我期望的是从最后一个 FC 层给出一个图像特征。将软注意力添加到 LSTM 以训练注意力权重,并希望从输出中获得一个类并将软注意力可视化以了解系统在进行预测时正在查看的位置(类似于论文中的软注意力可视化)。
由于我是注意力机制的新手,所以我做了很多研究,但找不到解决方案/理解我的问题。我想知道我是否做得对。