神经网络中的attention机制及tensorflow实现

参考文献:Hierarchical Attention Networks for Document Classification
在这里插入图片描述
文献中主要讨论了层次的注意力机制在文本分类中的应用,这里的两层神经网络模型结构基本相同
首先通过word_embedding将每一个句子的单词映射成embedding向量,输入到神经网络当中,
此处为双向GRU网络,然后加入attention机制,实际上就是添加两层网络,一层大小为attention_size,每一次的输入为 h i t h_{it} hit,输出为,然后利用softmax函数获取每一次输出的权重,最终加权每一次输出获得句子的表示。文中attention_size层激活函数为tanh。公式如下:

u i t = t a n h ( W w h i t + b w ) . . . . . . . . 1 u_{it}=tanh(W_wh_{it}+b_w)........1 uit=tanh(Wwhit+bw)........1
α i t = exp ⁡ ( u i t T u w ) ∑ t exp ⁡ ( u i t T u w ) . . . . . . . . 2 \alpha_{it} =\frac {\exp(u_{it}^Tu_w)}{\sum_t \exp(u_{it}^Tu_w)}........2 αit=texp(uitTuw)exp(uitTuw)........2
s i = ∑ t α i t h i t . . . . . . . . 3 s_i =\sum_t \alpha_{it}h{it}........3 si=tαithit........3

h i t h_it hit为每一次的输出信息, W w W_w Ww大小为attention_size × \times × 2*T , u i t u_it uit为接入attention层以后的输出信息, u i t T u w u_{it}^Tu_w uitTuw为attention输出信息的加权和, u w u_w uw为attention向量。然后运用softmax函数获得每一次输出权重,最终加权和输出获取最终的文本表示方法。文本到类别的训练方法类似。

tensorflow实现:

定义attention layer

attention_size = attn_size
with tf.name_scope('attention'), tf.variable_scope('attention'):
	#定义W_w
	attention_w = tf.Variable(tf.truncated_normal([2*rnn_size, attention_size], stddev=0.1), name='attention_w') #W_w
	#定义b_w
	attention_b = tf.Variable(tf.constant(0.1, shape=[attention_size]), name='attention_b')# b_w
	u_list = []
	for t in xrange(sequence_length):
	#公式1
		u_t = tf.tanh(tf.matmul(outputs[t], attention_w) + attention_b) #
		u_list.append(u_t)
	#定义u_w
	u_w = tf.Variable(tf.truncated_normal([attention_size, 1], stddev=0.1), name='attention_uw')
	attn_z = []
	for t in xrange(sequence_length):
	#公式2括号里面的内容
		z_t = tf.matmul(u_list[t], u_w)
		attn_z.append(z_t)
	# transform to batch_size * sequence_length
	attn_zconcat = tf.concat(attn_z, axis=1)
	#运用softmax函数
	self.alpha = tf.nn.softmax(attn_zconcat)
	# transform to sequence_length * batch_size * 1 , same rank as outputs
	alpha_trans = tf.reshape(tf.transpose(self.alpha, [1,0]), [sequence_length, -1, 1])
	#公式3
	self.final_output = tf.reduce_sum(outputs * alpha_trans, 0)
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于TensorFlow的卷积神经网络空间注意力机制的代码示例: ```python import tensorflow as tf def spatial_attention(input_feature, name='spatial_attention'): with tf.variable_scope(name): kernel_size = 7 kernel_initializer = tf.contrib.layers.variance_scaling_initializer() bias_initializer = tf.constant_initializer(value=0.0) filters = input_feature.get_shape()[-1] # Compute attention map attention = tf.layers.conv2d(inputs=input_feature, filters=filters, kernel_size=kernel_size, padding='same', activation=tf.nn.sigmoid, kernel_initializer=kernel_initializer, bias_initializer=bias_initializer, name='attention') # Apply attention map attention_feature = tf.multiply(input_feature, attention, name='attention_feature') return attention_feature ``` 在这个函数,我们首先定义了一些超参数,如卷积核大小、初始化方式等。然后,我们使用一个卷积层来计算输入特征的注意力图。注意力图是一个与输入特征相同大小的张量,其每个元素都是一个0到1之间的数,用于控制输入特征的重要程度。最后,我们将输入特征与注意力图相乘,得到加权后的特征图作为输出。 在使用这个函数时,我们只需要将待处理的特征图作为输入传入即可: ```python input_feature = tf.placeholder(tf.float32, shape=[None, 64, 64, 32]) attention_feature = spatial_attention(input_feature) ``` 这里我们使用了一个占位符来表示输入特征,然后使用`spatial_attention`函数对其进行处理,得到加权后的特征图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值