I agree! Having to update all shapes when you change a single layer is a major annoyance. Just moments ago I was trying to write code for a conv autoencoder in a more general way. My solution was to compute the output shape for a random tensor, inside the model initialization method.