code: def dna_transformation(prev_image, dna_input, dna_kernel_size, relu_shift):
    
    # Construct translated images.
    prev_image_pad = tf.pad(prev_image, [[0, 0], [2, 2], [2, 2], [0, 0]])
    image_height = int(prev_image.get_shape()[1])
    image_width = int(prev_image.get_shape()[2])
  
    inputs = []
    for xkern in range(dna_kernel_size):
      for ykern in range(dna_kernel_size):
        inputs.append(
            tf.expand_dims(
                tf.slice(prev_image_pad, [0, xkern, ykern, 0],
                         [-1, image_height, image_width, -1]), [3]))
    inputs = tf.concat(axis=3, values=inputs)
  
    # Normalize channels to 1.
    kernel = tf.nn.relu(dna_input - relu_shift) + relu_shift
    kernel = tf.expand_dims(
        kernel / tf.reduce_sum(kernel, [3], keep_dims=True), [4])
    return tf.reduce_sum(kernel * inputs, [3], keep_dims=False)
docs: Apply dynamic neural advection to previous image.
  
    Args:
      prev_image: previous image to be transformed.
      dna_input: hidden lyaer to be used for computing DNA transformation.
      dna_kernel_size: dna kernel size.
      relu_shift: shift for ReLU function.
    Returns:
      List of images transformed by the predicted CDNA kernels.