First thing to point out: while I’m not as well-versed in TF 1, I believe your example will end up evaluating the maximum of a completely different random tensor then the one you inspect because eval runs a the graph in a different session each time, e.g. tf.random.normal will get called again to evaluate the max. So (I think) you won’t be able to follow the results by inspecting them in this way.
Otherwise, this is the basically the result you should expect. keras.backend.max will return the maximum value along a specified axis/axes, effectively reducing the dimension away. Your examples starts by printing a (4, 4, 2, 2) tensor. After the call to keras.backend.max, with axis=-1 (which wraps to the last axis in the tensor), the result is a tensor with shape (4, 4, 2). That’s because you’re telling the function to “walk” the last axis and find the maximum value of the If you want the absolute maximum value of the entire tensor, axis should be set to None.
Here are some answers that demonstrate keras.backend.max with different axis arguments, and one with keepdims set to True:
with tf.compat.v1.Session() as test_a:
  example = tf.random.normal([4, 4, 2, 2], mean=1, stddev=4, seed = 1)
  # Print absolute maximum value (shape: ())
  abs_max = K.max(example, axis=None)
  print(abs_max.shape)

  # Print maximum values along axis 0, 2 (shape: (4, 2))
  max_axis_0_2 = K.max(example, axis=(0, 2,))
  print(max_axis_0_2.shape)

  # Print maximum values along axis 1 (shape: (4, 2, 2))
  max_axis_1 = K.max(example, axis=(1,))
  print(max_axis_1.shape)

  # Print maximum values along axis 0, 2, and keep reduced axes
  # reduced axes will be size 1
  max_axis_0_2_keep = K.max(example, axis=(0, 2,), keepdims=True)
  print(max_axis_0_2_keep.shape)