该章节介绍VITGAN对抗生成网络中,CoordinatesPositionalEmbedding博里叶位置编码 部分的代码实现。
目录(文章发布后会补上链接):
- 网络结构简介
- Mapping NetWork 实现
- PositionalEmbedding 实现
- MLP 实现
- MSA多头注意力 实现
- SLN自调制 实现
- CoordinatesPositionalEmbedding 实现
- ModulatedLinear 实现
- Siren 实现
- Generator生成器 实现
- PatchEmbedding 实现
- ISN 实现
- Discriminator鉴别器 实现
- VITGAN 实现
CoordinatesPositionalEmbedding博里叶位置编码 简介
CoordinatesPositionalEmbedding博里叶位置编码 是用于生成二维位置信息,就是里面的
E
f
o
u
E_{fou}
Efou ,对应图中 Fourier Embedding部分。
注意:该部分代码可能有误,欢迎留言指正!!!
代码实现
import tensorflow as tf
class CoordinatesPositionalEmbedding(tf.keras.layers.Layer):
"""
博里叶位置编码
"""
def __init__(
self,
patch_size,
emb_dim,
):
super().__init__()
self.patch_size = patch_size
self.emb_dim = emb_dim
self.pos_emb = tf.keras.layers.Dense(emb_dim, use_bias=True)
pos_input = tf.linspace(-1, 1, patch_size)
pos_x, pos_y = tf.meshgrid(pos_input, pos_input)
pos_input = tf.concat([pos_y[..., tf.newaxis],pos_x[..., tf.newaxis]], axis=-1)
pos_input = tf.reshape(pos_input,[-1, 2])
self.pos_input = pos_input
def call(self, x):
x_shape = tf.shape(x)
batch_size = x_shape[0] * x_shape[1] # batch_size*num_patches
x = self.pos_emb(self.pos_input) # (P*P, emb_dim)
x = tf.math.sin(x)
x = tf.repeat(x[tf.newaxis, ...], batch_size, axis=0) # (B*L, P*P, emb_dim)
return x
if __name__ == "__main__":
layer = CoordinatesPositionalEmbedding(
patch_size=16,
emb_dim=768 # 16*16*3
)
x = tf.random.uniform([2,196,768], dtype=tf.float32) # (batch_size*num_patches, patch_size*patch_size, emb_dim)
o1 = layer(x)
tf.print('o1:', tf.shape(o1))