I'm not sure I'd choose the word synergy. Every time they move something from contrib into the main package, it seems to create a lot of redundancy. Now we have tf.keras.utils.to_categorical and tf.feature_column.categorical_column_with_vocabulary_list.
To clarify: `tf.keras` is an implementation of the entire Keras API written from the ground-up in pure TensorFlow. The first benefit of that is a greater level of blending between non-Keras-TF workflows and TF-Keras workflows: for instance, layers from `tf.layers` and `tf.keras` are interchangeable in all use cases.
Additionally, this enables us to add TensorFlow-specific features that would be difficult to add to the multi-backend version of Keras, and to do performance optimizations that would otherwise be impossible.
Such features include support for Eager mode (dynamic graphs), support for TensorFlow Estimators, which enables distributed training and training on TPUs, and more to come.
There is also some overlap with Keras’s preprocessing tools (now native to TensorFlow), so there’s some nice synergy.