LSTM(RNN)中的注意力机制

article/2025/9/15 13:25:05

一、示例代码

目的是让网络“注意”到 index=2 的特征

"""
参考:
https://blog.csdn.net/weixin_44791964/article/details/104000722?spm=1001.2014.3001.5501
"""import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from keras.layers import merge
from keras.layers.core import *
from keras.layers.recurrent import LSTM
from keras.models import *'''
获得数据集、attention_column代表我们希望被注意的列
这个数据集是我们人为创建的,目的是为了演示注意力机制,示例如下:
X = [[-21.03816538   1.4249185 ][  3.76040424 -12.83660875][  1.           1.        ][-10.17242648   5.37333323][  2.97058584  -9.31965078][  3.69295417   8.47650258][ -6.91492102  11.00583167][ -0.03511656  -1.71475966][ 10.9554255   12.47562052][ -5.70470182   4.70055424]]
Y = [1]
我们可以看到,当我们将attention_column设置为2的时候
第2个step的输入和当前batch的输出相同,其它step的值是随机设定的
因此网络应该需要去注意第2个step的输入,这就是我们希望他注意的情况。
'''def get_data_recurrent(n, time_steps, input_dim, attention_column=2):x = np.random.normal(loc=0, scale=10, size=(n, time_steps, input_dim))y = np.random.randint(low=0, high=2, size=(n, 1))x[:, attention_column, :] = np.tile(y[:], (1, input_dim))return x, y# -------------------------------------------#
#   对每一个step的注意力权值
# -------------------------------------------#
def get_activations(model, inputs, layer_name=None):inp = model.inputfor layer in model.layers:if layer.name == layer_name:Y = layer.outputmodel = Model(inp, Y)out = model.predict(inputs)out = np.mean(out[0], axis=-1)return out# ------------------------------------------------------------------------------------------------------#
#   注意力模块,主要是实现对step维度的注意力机制
#   在这里大家可能会疑惑,为什么需要先Permute再进行注意力机制的施加。
#   这是因为,如果我们直接进行全连接的话,我们的最后一维是特征维度,这个时候,我们每个step的特征是分开的,
#   此时进行全连接的话,得出来注意力权值每一个step之间是不存在特征交换的,自然也就不准确了。
#   所以在这里我们需要首先将step维度转到最后一维,然后再进行全连接,根据每一个step的特征获得注意力机制的权值。
# ------------------------------------------------------------------------------------------------------#
def attention_3d_block(inputs):# batch_size, time_steps, lstm_units -> batch_size, lstm_units, time_stepsa = Permute((2, 1))(inputs)# batch_size, lstm_units, time_steps -> batch_size, lstm_units, time_stepsa = Dense(TIME_STEPS, activation='softmax')(a)# batch_size, lstm_units, time_steps -> batch_size, time_steps, lstm_unitsa_probs = Permute((2, 1), name='attention_vec')(a)# 相当于获得每一个step中,每个特征的权重output_attention_mul = merge.multiply([inputs, a_probs], name='attention_mul') # 新版本 keras# output_attention_mul = merge([inputs, a_probs], name='attention_mul', mode='mul') # 旧版本 kerasreturn output_attention_mul# -------------------------------------------#
#  建立注意力模型
# -------------------------------------------#
def get_attention_model(time_steps, input_dim, lstm_units=32):inputs = Input(shape=(time_steps, input_dim,))# (batch_size, time_steps, input_dim) -> (batch_size, input_dim, lstm_units)lstm_out = LSTM(lstm_units, return_sequences=True)(inputs)attention_mul = attention_3d_block(lstm_out)# (batch_size, input_dim, lstm_units) -> (batch_size, input_dim*lstm_units)attention_mul = Flatten()(attention_mul)output = Dense(1, activation='sigmoid')(attention_mul)model = Model(input=[inputs], output=output)return modelif __name__ == '__main__':N = 100000INPUT_DIM = 2TIME_STEPS = 10# ------------------------------------------------------##   每一个输入样本的step为10,每一个step的数据长度为2#   X - batch, 10, 2#   Y - batch, 1# ------------------------------------------------------#X, Y = get_data_recurrent(N, TIME_STEPS, INPUT_DIM)# ------------------------------------------------------##   获得模型并进行训练。# ------------------------------------------------------#model = get_attention_model(TIME_STEPS, INPUT_DIM)model.summary()model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])model.fit(X, Y, epochs=1, batch_size=64, validation_split=0.1)attention_vectors = []# ------------------------------------------------------##   取三百个样本,将他们通道的平均注意力情况取出来# ------------------------------------------------------#for i in range(300):testing_X, testing_Y = get_data_recurrent(1, TIME_STEPS, INPUT_DIM)attention_vector = get_activations(model, testing_X, layer_name='attention_vec')print('attention =', attention_vector)assert (np.sum(attention_vector) - 1.0) < 1e-5attention_vectors.append(attention_vector)attention_vector_final = np.mean(np.array(attention_vectors), axis=0)# ------------------------------------------------------##   将结果绘制成图# ------------------------------------------------------#pd.DataFrame(attention_vector_final, columns=['attention (%)']).plot(kind='bar',title='Attention Mechanism as a function of input dimensions.')plt.show()

在这里插入图片描述

二、另一种Attention

参考:github philipperemy/keras-attention-mechanism

在这里插入图片描述

1. attention.py

from tensorflow.keras.layers import Dense, Lambda, Dot, Activation, Concatenate
from tensorflow.keras.layers import Layerclass Attention(Layer):def __init__(self, units=128, **kwargs):self.units = unitssuper().__init__(**kwargs)def __call__(self, inputs):"""Many-to-one attention mechanism for Keras.@param inputs: 3D tensor with shape (batch_size, time_steps, input_dim).@return: 2D tensor with shape (batch_size, 128)@author: felixhao28, philipperemy."""hidden_states = inputshidden_size = int(hidden_states.shape[2])# Inside dense layer#              hidden_states            dot               W            =>           score_first_part# (batch_size, time_steps, hidden_size) dot (hidden_size, hidden_size) => (batch_size, time_steps, hidden_size)# W is the trainable weight matrix of attention Luong's multiplicative style scorescore_first_part = Dense(hidden_size, use_bias=False, name='attention_score_vec')(hidden_states)#            score_first_part           dot        last_hidden_state     => attention_weights# (batch_size, time_steps, hidden_size) dot   (batch_size, hidden_size)  => (batch_size, time_steps)h_t = Lambda(lambda x: x[:, -1, :], output_shape=(hidden_size,), name='last_hidden_state')(hidden_states)score = Dot(axes=[1, 2], name='attention_score')([h_t, score_first_part])attention_weights = Activation('softmax', name='attention_weight')(score)# (batch_size, time_steps, hidden_size) dot (batch_size, time_steps) => (batch_size, hidden_size)context_vector = Dot(axes=[1, 1], name='context_vector')([hidden_states, attention_weights])pre_activation = Concatenate(name='attention_output')([context_vector, h_t])attention_vector = Dense(self.units, use_bias=False, activation='tanh', name='attention_vector')(pre_activation)return attention_vectordef get_config(self):return {'units': self.units}@classmethoddef from_config(cls, config):return cls(**config)

2. main.py

import numpy as np
from tensorflow.keras import Input
from tensorflow.keras.layers import Dense, LSTM
from tensorflow.keras.models import load_model, Modelfrom attention import Attentiondef main():# Dummy data. There is nothing to learn in this example.num_samples, time_steps, input_dim, output_dim = 100, 10, 1, 1data_x = np.random.uniform(size=(num_samples, time_steps, input_dim))data_y = np.random.uniform(size=(num_samples, output_dim))# Define/compile the model.model_input = Input(shape=(time_steps, input_dim))x = LSTM(64, return_sequences=True)(model_input)x = Attention(32)(x)x = Dense(1)(x)model = Model(model_input, x)model.compile(loss='mae', optimizer='adam')print(model.summary())# train.model.fit(data_x, data_y, epochs=10)# test save/reload model.pred1 = model.predict(data_x)model.save('test_model.h5')model_h5 = load_model('test_model.h5')pred2 = model_h5.predict(data_x)np.testing.assert_almost_equal(pred1, pred2)print('Success.')if __name__ == '__main__':main()

参考:

  1. 睿智的seq2seq模型3——注意力机制概念详解与其在LSTM中的使用
  2. github philipperemy/keras-attention-mechanism
  3. bilibili视频
  4. 深度学习中的注意力机制(2017版)
  5. 易于理解的一些时序相关的操作(LSTM)和注意力机制(Attention Model)
  6. 使用详细的例子来理解RNN中的注意力机制
  7. (知乎)一文看懂 Attention(本质原理+3大优点+5大类型)
  8. 遍地开花的 Attention,你真的懂吗?
  9. 浅谈 Attention 机制的理解

http://chatgpt.dhexx.cn/article/K2r916Eu.shtml

相关文章

Tensorflow (6) Attention 注意力机制

参考&#xff1a; 细讲 | Attention Is All You Need 关于注意力机制&#xff08;《Attention is all you need》&#xff09; 一步步解析Attention is All You Need&#xff01; - 简书(代码) The Illustrated Transformer – Jay Alammar – Visualizing machine learnin…

注意力机制attention图解

来自对https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/的笔记 注意力机制核心观点就是让RNN每一步都监视一个更大的信息集合并从中挑选信息。例如&#xff1a;如果你使用RNN去为一个图像生成注释&#xff0c;…

注意力机制Attention详解

注意力机制Attention详解 一、前言 2018年谷歌提出的NLP语言模型Bert一提出&#xff0c;便在NLP领域引起热议&#xff0c;之所以Bert模型能够火出圈&#xff0c;是由于Bert模型在NLP的多项任务中取得了之前所有模型都不能达到的出色效果。那么Bert模型它是如何提出的呢&#x…

注意力机制(Attention Mechanism)

注意力机制起源于应用于NLP的RNN模型&#xff0c;但也在其他的领域有所应用。对注意力机制的理解也是算法面试经常提及的一道基础面试题&#xff0c;在这篇博文里我们汇总吴恩达深度学习视频序列模型3.7和3.8以及台大李宏毅教授对Attenion Mechanism以及相关参考文献对注意力机…

注意力机制总结

导读 注意力机制&#xff0c;其本质是一种通过网络自主学习出的一组权重系数&#xff0c;并以“动态加权”的方式来强调我们所感兴趣的区域同时抑制不相关背景区域的机制。在计算机视觉领域中&#xff0c;注意力机制可以大致分为两大类&#xff1a;强注意力和软注意力。由于强…

深度学习之注意力机制(Attention Mechanism)和Seq2Seq

这篇文章整理有关注意力机制(Attention Mechanism )的知识,主要涉及以下几点内容: 1、注意力机制是为了解决什么问题而提出来的? 2、软性注意力机制的数学原理; 3、软性注意力机制、Encoder-Decoder框架与Seq2Seq 4、自注意力模型的原理。 一、注意力机制可以解决什么问…

神经网络学习小记录73——Pytorch CA(Coordinate attention)注意力机制的解析与代码详解

神经网络学习小记录73——Pytorch CA&#xff08;Coordinate attention&#xff09;注意力机制的解析与代码详解 学习前言代码下载CA注意力机制的概念与实现注意力机制的应用 学习前言 CA注意力机制是最近提出的一种注意力机制&#xff0c;全面关注特征层的空间信息和通道信息…

【Transformer 相关理论深入理解】注意力机制、自注意力机制、多头注意力机制、位置编码

目录 前言一、注意力机制&#xff1a;Attention二、自注意力机制&#xff1a;Self-Attention三、多头注意力机制&#xff1a;Multi-Head Self-Attention四、位置编码&#xff1a;Positional EncodingReference 前言 最近在学DETR&#xff0c;看源码的时候&#xff0c;发现自己…

注意力机制详解系列(一):注意力机制概述

👨‍💻作者简介: 大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。公众号: GoAI的学习小屋,免费分享书籍、简历、导图等资料,更有交流群分享AI和大数据,加群方式公众号回复“加群”或➡️点击链接。 🎉专栏推荐: 目…

注意力机制详解

注意力机制详解 Attention机制由来Attention定义Encoder-Decoder框架Attenion机制的引入Attention机制的类别Hard AttentionSoft AttentionGlobal AttentionLocal AttentionSelf AttentionMulti-head Attention Attention机制的应用自然语言处理领域计算机视觉领域语音识别领域…

【深度学习】(1) CNN中的注意力机制(SE、ECA、CBAM),附Pytorch完整代码

大家好&#xff0c;今天和各位分享一下如何使用 Pytorch 构建卷积神经网络中的各种注意力机制&#xff0c;如&#xff1a;SENet&#xff0c;ECANet&#xff0c;CBAM。 注意力机制的原理 和 TensorFlow2 的实现方式可以看我下面两篇博文&#xff1a; SENet、ECANet&#xff1a…

注意力机制详述

学习本部分默认大家对RNN神经网络已经深入理解了&#xff0c;这是基础&#xff0c;同时理解什么是时间序列&#xff0c;尤其RNN的常用展开形式进行画图&#xff0c;这个必须理解了。 这篇文章整理有关注意力机制&#xff08;Attention Mechanism &#xff09;的知识&#xff0c…

手把手带你YOLOv5/v7 添加注意力机制(并附上30多种顶会Attention原理图)2023/6/15更新

&#x1f31f;想了解YOLO系列算法更多教程欢迎订阅我的专栏&#x1f31f; 对于基础薄弱的同学来说&#xff0c;推荐阅读《目标检测蓝皮书》&#x1f4d8;&#xff0c;里面涵盖了丰富的目标检测实用知识&#xff0c;是你迅速掌握目标检测的理想选择&#xff01; 如果想了解 YO…

量化交易python入门书籍_张杨飞《Python量化交易入门》PDF下载

张杨飞《Python量化交易入门》PDF下载 首页 > 计算机类 字号:小 中 大 评论:0 条 评论:0 条 Python量化交易入门 【作 者】张杨飞 【形态项】 402 【出版项】 北京:电子工业出版社 , 2019.04 【ISBN号】978-7-121-36140-1 【中图法分类号】F830.91 【原书…

Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】&#xff0c;未经授权&#xff0c;请勿转载。 原文地址&#xff1a;https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近&#xff0c;猫哥的 Python 技术学习群里进来了几位比较特殊的同学&#xff1a;一位初三的以编程为兴趣的女生、…

2019年Python入门书籍推荐

大概是一时改变不了之前的学习习惯&#xff0c;所以很多Python小白都来问我有什么适合的Python入门书籍推荐。接下来我就为大家推荐几本经典的&#xff1a;&#xff08;请大家根据自己以下六种情况对号入座&#xff0c;挑选适合自己的 Python 入门书籍&#xff09;一&#xff0…

Python入门书籍,百万读者都选择!

从0到100万 Python入门神书 如果你是程序员&#xff0c;或者是 Python 爱好者&#xff0c;那你一定听说过一本书&#xff1a;《Python编程 从入门到实践》。作为国内首批 Python 图书之一&#xff0c;蟒蛇书首版自2016年问世以来就狂销70余万册&#xff1b;2020年10月第2版出版…

斯坦福大学教授,极力推荐5本python入门书籍,入门最快基础最好

为什么要选择python Python是一门更注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C++ 这样的语言,它的这两个优势让其在开发者中大受欢迎。 如果你正处于想学习python或者正在python入门阶段,推荐5套python电子学习书籍,对于没有接触过编程,或者基础薄弱者来说…

0基础学Python入门书籍应该看什么?

0基础学Python入门书籍应该看什么&#xff1f;Python 对不少人来说是谜一样的东西不知道如何下手、从何处下手&#xff0c;找了很多资源几个月过去了学习陷入换乱&#xff0c;没没能入门Python开发。出现这种情况大多是因为没有充分做好学习前的准备。 0基础学习Python建议读一…

Python入门书籍推荐——《笨办法学Python》

很多小伙伴在学习Python的道路上&#xff0c;觉得越来越难。今天为小伙伴推荐一本非常适合Python小白的书籍《笨办法学Python》第三版。 在豆瓣有7.8的评分&#xff0c;学习Python的小伙伴千万不要错过了呀。 《笨办法学Python》是一本关于Python的入门书籍&#xff0c;即使是…