【干货】基于Keras的注意力机制实战

【导读】近几年,注意力机制(Attention)大量地出现在自动翻译、信息检索等模型中。可以把Attention看成模型中的一个特征选择组件,特征选择一方面可以增强模型的效果,另一方面,我们可以通过计算出的特征的权重来计算结果与特征之间的某种关联。例如在自动翻译模型中,Attention可以计算出不同语种词之间的关系。本文一个简单的例子,来展示Attention是怎么在模型中起到特征选择作用的。

代码



导入相关库

#coding=utf-8
import numpy as np
from keras.models import *
from keras.layers import Input, Dense, merge
import matplotlib.pyplot as plt
import pandas as pd

数据生成函数

# 输入维度
input_dim = 32


# 生成数据,数据的的第attention_column个特征由label决定,
# 即label只与数据的第attention_column个特征相关
def get_data(n, input_dim, attention_column=1):
    x = np.random.standard_normal(size=(n, input_dim))
    y = np.random.randint(low=0, high=2, size=(n, 1))
    x[:, attention_column] = y[:, 0]
    return x, y

模型定义函数

将输入进行一次变换后,计算出Attention权重,将输入乘上Attention权重,获得新的特征。

# Attention模型
def build_model():
    inputs = Input(shape=(input_dim,))

    # 计算Attention权重
    attention_probs = Dense(input_dim, activation='softmax', 
name='attention_vec')(inputs)
    # 根据Attention权重更新特征
    attention_mul = merge([inputs, attention_probs], 
output_shape=32, 
name='attention_mul', mode='mul')

    # 预测标签
    attention_mul = Dense(64)(attention_mul)
    output = Dense(1, activation='sigmoid')(attention_mul)
    model = Model(input=[inputs], output=output)
    attention_vec_model = Model(input=[inputs], 
output=attention_probs)
    return model, attention_vec_model

主函数

if __name__ == '__main__':
    # 生成训练数据
    N = 10000
    inputs_1, outputs = get_data(N, input_dim)

    # 获取模型,以及用于计算Attention权重的子模型
    m, attention_vec_model = build_model()
    m.compile(optimizer='adam', loss='binary_crossentropy', 
metrics=['accuracy'])
    print(m.summary())

    # 训练
    m.fit([inputs_1], outputs, epochs=20, batch_size=64, 
validation_split=0.5)

    # 生成测试数据
    testing_inputs_1, testing_outputs = get_data(1, input_dim)

    # 根据测试数据计算Attention权重
    attention_vector = attention_vec_model.
    predict([testing_inputs_1])[0].flatten()
    print('attention =', attention_vector)

    # 绘图
pd.DataFrame(attention_vector, columns=['attention (%)'])
.plot(kind='bar', title='Attention Mechanism as a function of 
input dimensions.')
    plt.show()

运行结果

代码中,attention_column为1,也就是说,label只与数据的第1个特征相关。从运行结果中可以看出,Attention权重成功地获取了这个信息。

参考链接

https://github.com/philipperemy/keras-attention-mechanism

更多教程资料请访问:人工智能知识资料全集

原文发布于微信公众号 - 专知(Quan_Zhuanzhi)

原文发表时间:2018-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能LeadAI

深度学习 | Why and How:神经网络中的权重初始化

前言 神经网络中的权重(weight)初始化是个常常被忽略的问题。 最近在手写一个Python的神经网络库(GitHub:hamaa——https://gith...

37460
来自专栏数据科学学习手札

(数据科学学习手札40)tensorflow实现LSTM时间序列预测

  上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在...

59040
来自专栏AI研习社

我们建了个模型,搞定了 MNIST 数字识别任务

对于图像分类任务,当前最先进的架构是卷积神经网络 (CNNs).。无论是面部识别、自动驾驶还是目标检测,CNN 得到广泛使用。在本文中,针对著名的 MNIST ...

10020
来自专栏AlgorithmDog的专栏

Metropolis-Hastings 和 Gibbs sampling

在科学研究中,如何生成服从某个概率分布的样本是一个重要的问题。 如果样本维度很低,只有一两维,我们可以用反切法、拒绝采样和重要性采样等方法。 但是对...

27690
来自专栏Coding迪斯尼

使用预先训练网络和特征抽取大力提升图像识别率

神经网络在项目实践中遇到的一大问题是数据不足。任何人工智能项目,在数据不足面前都会巧妇难为无米之炊,算法再精巧,只要数据量不足,最后的效果都不尽如人意,我们目前...

19850
来自专栏IT派

用 Keras 编写你的第一个人工神经网络

创建一个新的文件,命名为 keras_first_network.py ,然后将教程的代码一步步复制进去。

16050
来自专栏AILearning

【Scikit-Learn 中文文档】协方差估计 / 经验协方差 / 收敛协方差 / 稀疏逆协方差 / Robust 协方差估计 - 无监督学习 - 用户指南 | ApacheCN

2.6. 协方差估计 许多统计问题在某一时刻需要估计一个总体的协方差矩阵,这可以看作是对数据集散点图形状的估计。 大多数情况下,基于样本的估计(基于其...

45050
来自专栏算法channel

Tensorflow笔记|tensorflow做线性回归

本系列推送主要参考: Stanford University CS20SI: Tensorflow for Deep Learning Research. 01...

37360
来自专栏杨熹的专栏

Sklearn 快速入门

学习资料:大家可以去莫烦的学习网站学到更多的知识。 本文结构: Sklearn 简介 选择模型流程 应用模型 ---- Sklearn 简介 Scikit...

39780
来自专栏贾志刚-OpenCV学堂

二值化算法OTSU源码解析

概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二值化算法OTSU的基本原理与源代码解析,最终还通过几行代码演示了一下如何使用OTSU算法API...

45790

扫码关注云+社区

领取腾讯云代金券