1. Именно архитектуру. Когда вы писали нейронки руками, то последовательность выполнения операций определялась лично вами и тем порядком команд, который вы написали. Но при этом очень вероятно, что расходование ресурсов было далеко от оптимального. Тем более это может быть важно в случае обучения на GPU, когда программе надо еще управлять памятью GPU - какие данные там держать, а какие уже можно удалить и вернуть в обычную память. Для решения этой проблемы порядок выполнения вычислений в Tensorflow определяется компилятором - программист сначала описывает граф, по которому будут происходить вычисления (та самая модель, у которой может быть несколько входов, несколько выходов, несколько путей прохожения вычислений); потом компилирует его; потом создает сессию Tensorflow и запускает прогон этого графа с какими-то входными данными. Реальные веса нейронной сети существуют лишь в рамках сессии Tensorflow.
2. Keras - это фреймворк, который ставил целью сделать разработку нейронных сетей проще, подняться на один уровень абстракций выше от математических вычислений к зоопарку слоев нейронных сетей. Плюс абстрагироваться от конкретного фреймворка тензорных вычислений, таких как Theano, CNTK, Tensorflow. В итоге этот фреймворк официально врос в Tensorflow.
3. Исходный язык для Tensorflow - это Python, примеры надо на нем смотреть:
https://www.tensorflow.org/tutorials/keras/basic_c...
Tensorflow - это вообще пример того, что в последнее время стали называть "differentiable programming" - еще одна новая парадигма программирования. Так что после императивного подхода надо чутка мозгами поскрипеть.