0
点赞
收藏
分享

微信扫一扫

TensorFlow实现自注意力机制(Self-attention),程序员如何解决中年危机

zhaoxj0217 2022-03-18 阅读 66

深度学习中的大多数计算都是为了提高速度性能而矢量化的,而对于自注意力也没有什么不同。如果为简单起见忽略 batch 维度,则 1×1 卷积后的激活将具有 (H, W, C) 的形状。第一步是将其重塑为形状为 (H×W, C) 的2D矩阵,并使用 θ θ θ 与 φ φ φ 的矩阵相乘来计算注意力图。在SAGAN中使用的自注意力模块中,还有另一个1×1卷积,用于将通道数恢复到与输入通道数相同的数量,然后使用可学习的参数进行缩放操作。

Tensorflow实现自注意力模块


首先在自定义层的build()中定义所有 1×1 卷积层和权重。这里,使用频谱归一化函数作为卷积层的核约束:

class SelfAttention(Layer):

def init(self):

super(SelfAttention, self).init()

def build(self, input_shape):

n,h,w,c = input_shape

self.n_feats = h * w

self.conv_theta = Conv2D(c//8, 1, padding=‘same’, kernel_constraint=SpectralNorm(), name=‘Conv_Theta’)

self.conv_phi = Conv2D(c//8, 1, padding=‘same’, kernel_constraint=SpectralNorm(), name=‘Conv_Phi’)

self.conv_g = Conv2D(c//8, 1, padding=‘same’, kernel_constraint=SpectralNorm(), name=‘Conv_g’)

self.conv_attn_g = Conv2D(c//8, 1, padding=‘same’, kernel_constraint=SpectralNorm(), name=‘Conv_AttnG’)

self.sigma = self.add_weight(shape=[1], initializer=‘zeros’, trainable=True, name=‘sigma’)

需要注意的是:

  1. 内部的激活可以减小尺寸,以使计算运行更快。

  2. 在每个卷积层之后,激活由形状 (H, W, C) 被重塑为形状为 (H*W, C) 的二维矩阵。然后,我们可以在矩阵上使用矩阵乘法。

接下来在 call() 函数中将各层进行连接,用于执行自注意力操作。首先计算 θ \theta θ, φ φ φ 和 g g g:

def call(self, x):

n, h, w, c = x.shape

theta = self.conv_theta(x)

theta = tf.reshape(theta, (-1, self.n_feats, theta.shape[-1]))

phi = self.conv_phi(x)

phi = tf.nn.max_pool2d(phi, ksize=2, strides=2, padding=‘VALID’)

phi = tf.reshape(phi, (-1, self.n_feats//4, phi.shape[-1]))

g = self.conv_g(x)

g = tf.nn.max_pool2d(g, ksize=2, strides=2, padding=‘VALID’)

g = tf.reshape(g, (-1, self.n_feats//4, g.shape[-1]))

然后,将按以下方式计算注意力图:

attn = tf.matmul(theta, phi, transpose_b=True)

attn = tf.nn.softmax(attn)

最后,将注意力图与查询 g g g 相乘,并产生最终输出

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

举报

相关推荐

0 条评论