|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Tests for Keras-based positional embedding layer.""" |
|
|
|
from __future__ import absolute_import |
|
from __future__ import division |
|
from __future__ import print_function |
|
|
|
import numpy as np |
|
import tensorflow as tf |
|
|
|
from tensorflow.python.keras import keras_parameterized |
|
from official.nlp.modeling.layers import position_embedding |
|
|
|
|
|
|
|
|
|
@keras_parameterized.run_all_keras_modes |
|
class PositionEmbeddingLayerTest(keras_parameterized.TestCase): |
|
|
|
def test_static_layer_output_shape(self): |
|
test_layer = position_embedding.PositionEmbedding() |
|
|
|
sequence_length = 21 |
|
width = 30 |
|
input_tensor = tf.keras.Input(shape=(sequence_length, width)) |
|
output_tensor = test_layer(input_tensor) |
|
|
|
|
|
|
|
expected_output_shape = [None, sequence_length, width] |
|
self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) |
|
|
|
self.assertEqual(tf.float32, output_tensor.dtype) |
|
|
|
def test_float16_dtype(self): |
|
test_layer = position_embedding.PositionEmbedding(dtype="float16") |
|
|
|
sequence_length = 21 |
|
width = 30 |
|
input_tensor = tf.keras.Input(shape=(sequence_length, width)) |
|
output_tensor = test_layer(input_tensor) |
|
|
|
|
|
|
|
expected_output_shape = [None, sequence_length, width] |
|
self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) |
|
|
|
self.assertEqual(tf.float16, output_tensor.dtype) |
|
|
|
def test_dynamic_layer_output_shape(self): |
|
max_sequence_length = 40 |
|
test_layer = position_embedding.PositionEmbedding( |
|
use_dynamic_slicing=True, max_sequence_length=max_sequence_length) |
|
|
|
width = 30 |
|
input_tensor = tf.keras.Input(shape=(None, width)) |
|
output_tensor = test_layer(input_tensor) |
|
|
|
|
|
|
|
|
|
expected_output_shape = [None, None, width] |
|
self.assertEqual(expected_output_shape, output_tensor.shape.as_list()) |
|
|
|
def test_dynamic_layer_slicing(self): |
|
max_sequence_length = 40 |
|
test_layer = position_embedding.PositionEmbedding( |
|
use_dynamic_slicing=True, max_sequence_length=max_sequence_length) |
|
|
|
width = 30 |
|
input_tensor = tf.keras.Input(shape=(None, width)) |
|
output_tensor = test_layer(input_tensor) |
|
|
|
model = tf.keras.Model(input_tensor, output_tensor) |
|
|
|
|
|
|
|
input_length = 17 |
|
|
|
|
|
|
|
|
|
input_data = np.ones((1, input_length, width)) |
|
output_data = model.predict(input_data) |
|
|
|
self.assertAllEqual([1, input_length, width], output_data.shape) |
|
|
|
def test_relative_tensor_input(self): |
|
hidden_size = 8 |
|
test_layer = position_embedding.RelativePositionEmbedding( |
|
hidden_size=hidden_size) |
|
|
|
|
|
input_tensor = tf.constant([[[0] * hidden_size]]) |
|
output_tensor = test_layer(input_tensor) |
|
|
|
|
|
|
|
expected_output_tensor = tf.constant([[0, 0, 0, 0, 1, 1, 1, 1]]) |
|
self.assertAllEqual(output_tensor, expected_output_tensor) |
|
|
|
def test_relative_length_input(self): |
|
hidden_size = 8 |
|
|
|
|
|
|
|
test_layer = position_embedding.RelativePositionEmbedding( |
|
hidden_size=hidden_size) |
|
input_tensor = None |
|
output_tensor = test_layer(input_tensor, length=1) |
|
|
|
|
|
|
|
expected_output_tensor = tf.constant([[0, 0, 0, 0, 1, 1, 1, 1]]) |
|
self.assertAllEqual(output_tensor, expected_output_tensor) |
|
|
|
if __name__ == "__main__": |
|
tf.test.main() |
|
|