Застрял с реализацией самоконтроля

Реализация самоконтроля в тензорном потоке Keras с битовой модификацией (например, остаточное (добавить соединение)).

У меня есть следующая форма ввода:

мой ввод: KerasTensor(type_spec=TensorSpec(shape=(None, 8, 6, 64), dtype=tf.float32, name=None), name='multiply/mul:0', description="created by layer 'multiply'")

Моя цель - обработать TensorSpec(shape=(None, 8, 6, 64)( 8 меток времени одну за другой ( 6 * 64 )) с помощью внимания к себе и получить карту функций внимания к себе для каждой метки времени, а затем снова объединить ее в форму выходного тензора (None, 8, 6, 64) .

Мой код для реализации самостоятельного внимания:

      def conv1d(x, channels, ks=1, strides=1, padding='same'):
    conv = tf.keras.layers.Conv1D(channels, ks, strides, padding, activation='relu', use_bias=False,
                                  kernel_initializer='HeNormal')(x)
    return conv

# Self attention
def my_self_attention(x, channels):  
    f = conv1d(x, channels)  # KerasTensor(type_spec=TensorSpec(shape=(None, 6, 64), dtype=tf.float32, name=None), name='conv1d/Relu:0', description="created by layer 'conv1d'")
    g = conv1d(x, channels) # KerasTensor(type_spec=TensorSpec(shape=(None, 6, 64), dtype=tf.float32, name=None), name='conv1d_1/Relu:0', description="created by layer 'conv1d_1'")
    h = conv1d(x, channels) # KerasTensor(type_spec=TensorSpec(shape=(None, 6, 64), dtype=tf.float32, name=None), name='conv1d_2/Relu:0', description="created by layer 'conv1d_2'")
    attention_weights = tf.keras.activations.softmax(
        tf.matmul(g, Permute((2, 1))(f)))  # KerasTensor(type_spec=TensorSpec(shape=(None, 6, 6), dtype=tf.float32, name=None), name='tf.math.truediv/truediv:0', description="created by layer 'tf.math.truediv'")
    sensor_att_fm = tf.matmul(attention_weights, h) # KerasTensor(type_spec=TensorSpec(shape=(None, 6, 64), dtype=tf.float32, name=None), name='tf.linalg.matmul_1/MatMul:0', description="created by layer 'tf.linalg.matmul_1'") 
    gamma = tf.compat.v1.get_variable("gamma", [1], initializer=tf.constant_initializer(0.0)) # <tf.Variable 'gamma:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>  
    # to refined feature map adding feature map with input 
    o = gamma * sensor_att_fm + x # KerasTensor(type_spec=TensorSpec(shape=(None, 6, 64), dtype=tf.float32, name=None), name='tf.__operators__.add/AddV2:0', description="created by layer 'tf.__operators__.add'")
    return o

# Calling function 
sa = [my_self_attention(my_input[:, t, :, :], channels) for t in range(my_input.shape[1])]

Где я застрял

Я пытаюсь объединить их одну за другой на карте функций внимания и получить выходной тензор (None, 8, 6, 64), но не смог добиться успеха. Не могли бы вы помочь мне решить эту проблему. Во-вторых, убедитесь, что функции (my_self_attention и conv1d), которые я реализовал, в порядке.

Спасибо

0 ответов

Другие вопросы по тегам