【人工智能笔记】第二十五节 tensorflow 2.0 实现卷积注意力模块

卷积注意力有两种:

  1. 平面注意力,通过对单通道,同一平面内的特征,进行注意力权重的计算与应用。能实现平面内的特征动态权重分配。
  2. 通道注意力,通过所有通道,同一位置的单个特征点,进行注意力权重的计算与应用。能实现跨纬度的特征动态权重分配。

下面把两种注意力模式结合起来,实现代码如下:

import tensorflow as tf
from typing import Tuple, Union

class AttentionConv2D(tf.keras.layers.Layer):
    def __init__(self,
                 filters:int, 
                 kernel_size:Union[int,Tuple[int,int]], 
                 strides:Union[int,Tuple[int,int]]=(1,1),
                 padding:str='same', 
                 use_bias:bool=False, 
                 kernel_initializer:tf.keras.initializers.Initializer=tf.keras.initializers.he_normal,
                 *args, 
                 **kwargs):
        super().__init__(*args, **kwargs)
        self.filters=filters
        self.kernel_size=kernel_size
        self.padding=padding
        self.use_bias=use_bias
        self.strides=strides
        self.kernel_initializer=kernel_initializer

    def build(self, input_shape):
        self.W1_1 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same')
        self.W1_2 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same')
        self.V1 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same')
        self.W2_1 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same')
        self.W2_2 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same')
        self.V2 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same')
        self.conv1 = tf.keras.layers.Conv2D(filters=input_shape[-1], kernel_size=(1, 1), padding='same', use_bias=False)
        self.bn1 = tf.keras.layers.BatchNormalization()
        self.conv2 = tf.keras.layers.Conv2D(
            filters=self.filters, 
            kernel_size=self.kernel_size, 
            strides=self.strides,
            padding=self.padding, 
            use_bias=self.use_bias,
            kernel_initializer=self.kernel_initializer)

    def call(self, x):
        # 卷积部分
        o=self.conv1(x)
        o=self.bn1(o)
        o=tf.nn.swish(o)
        # 平面注意力
        o1_1=self.W1_1(x)
        o1_2=self.W1_2(o)
        o1=tf.math.tanh(o1_1+o1_2)
        o1=self.V1(o1)
        o1=tf.math.exp(o1) / tf.math.reduce_sum(tf.math.exp(o1), axis=[1,2], keepdims=True)
        # 通道注意力
        o2_1=self.W2_1(x)
        o2_2=self.W2_2(o)
        o2=tf.math.tanh(o2_1+o2_2)
        o2=self.V2(o2)
        o2=tf.math.exp(o2) / tf.math.reduce_sum(tf.math.exp(o2), axis=-1, keepdims=True)
        # 输入保留率,注意力
        o=tf.concat([o*o1+o*o2,x*(1.0-o1)+x*(1.0-o2)], axis=-1)
        o=self.conv2(o)
        return o

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PPHT-H

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值