def test_conv3d_causal(self): conv3d = nn_layers.Conv3D( filters=3, kernel_size=(3, 3, 3), strides=(1, 2, 2), padding='causal', use_buffered_input=True, kernel_initializer='ones', use_bias=False, ) inputs = tf.ones([1, 2, 4, 4, 3]) paddings = [[0, 0], [2, 0], [0, 0], [0, 0], [0, 0]] padded_inputs = tf.pad(inputs, paddings) predicted = conv3d(padded_inputs) expected = tf.constant( [[[[[12., 12., 12.], [18., 18., 18.]], [[18., 18., 18.], [27., 27., 27.]]], [[[24., 24., 24.], [36., 36., 36.]], [[36., 36., 36.], [54., 54., 54.]]]]]) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected) conv3d.use_buffered_input = False predicted = conv3d(inputs) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected)
def test_conv3d_causal_padding_1d(self): """Test to ensure causal padding works like standard padding.""" conv3d = nn_layers.Conv3D( filters=1, kernel_size=(3, 1, 1), strides=(2, 1, 1), padding='causal', use_buffered_input=False, kernel_initializer='ones', use_bias=False, ) keras_conv1d = tf.keras.layers.Conv1D( filters=1, kernel_size=3, strides=2, padding='causal', kernel_initializer='ones', use_bias=False, ) inputs = tf.ones([1, 4, 1, 1, 1]) predicted = conv3d(inputs) expected = keras_conv1d(tf.squeeze(inputs, axis=[2, 3])) expected = tf.reshape(expected, [1, 2, 1, 1, 1]) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected) self.assertAllClose(predicted, [[[[[1.]]], [[[3.]]]]])
def test_depthwise_conv3d_causal(self): conv3d = nn_layers.Conv3D( filters=3, kernel_size=(3, 3, 3), strides=(1, 2, 2), padding='causal', use_buffered_input=True, kernel_initializer='ones', use_bias=False, groups=3, ) inputs = tf.ones([1, 2, 4, 4, 3]) paddings = [[0, 0], [2, 0], [0, 0], [0, 0], [0, 0]] padded_inputs = tf.pad(inputs, paddings) predicted = conv3d(padded_inputs) expected = tf.constant([[[[[9.0, 9.0, 9.0], [6.0, 6.0, 6.0]], [[6.0, 6.0, 6.0], [4.0, 4.0, 4.0]]], [[[18.0, 18.0, 18.0], [12., 12., 12.]], [[12., 12., 12.], [8., 8., 8.]]]]]) output_shape = conv3d._spatial_output_shape([4, 4, 4]) self.assertAllClose(output_shape, [2, 2, 2]) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected) conv3d.use_buffered_input = False predicted = conv3d(inputs) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected)
def test_conv3d_causal_padding_2d(self): """Test to ensure causal padding works like standard padding.""" conv3d = nn_layers.Conv3D( filters=1, kernel_size=(1, 3, 3), strides=(1, 2, 2), padding='causal', use_buffered_input=False, kernel_initializer='ones', use_bias=False, ) keras_conv3d = tf.keras.layers.Conv3D( filters=1, kernel_size=(1, 3, 3), strides=(1, 2, 2), padding='same', kernel_initializer='ones', use_bias=False, ) inputs = tf.ones([1, 1, 4, 4, 1]) predicted = conv3d(inputs) expected = keras_conv3d(inputs) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected) self.assertAllClose(predicted, [[[[[9.], [6.]], [[6.], [4.]]]]])
def test_stream_buffer(self): conv3d_stream = nn_layers.Conv3D( filters=3, kernel_size=(3, 3, 3), strides=(1, 2, 2), padding='causal', kernel_initializer='ones', use_bias=False, use_buffered_input=True, ) buffer = movinet_layers.StreamBuffer(buffer_size=2) conv3d = nn_layers.Conv3D( filters=3, kernel_size=(3, 3, 3), strides=(1, 2, 2), padding='causal', kernel_initializer='ones', use_bias=False, use_buffered_input=False, ) inputs = tf.ones([1, 4, 2, 2, 3]) expected = conv3d(inputs) for num_splits in [1, 2, 4]: frames = tf.split(inputs, inputs.shape[1] // num_splits, axis=1) states = {} predicted = [] for frame in frames: x, states = buffer(frame, states=states) x = conv3d_stream(x) predicted.append(x) predicted = tf.concat(predicted, axis=1) self.assertEqual(predicted.shape, expected.shape) self.assertAllClose(predicted, expected) self.assertAllClose( predicted, [[[[[12., 12., 12.]]], [[[24., 24., 24.]]], [[[36., 36., 36.]]], [[[36., 36., 36.]]]]])