# Custom Neural Network Architectures¶

## Modification of Neural Network Architecture¶

By default, TensorDiffEq will build a fully-connected network using the layer sizes and lengths you define in the layer_sizes parameter, which is fed into the model.compile call. However, once the model has been compiled, that network can be overwritten with any Keras neural network. Here we demonstrate how to do so, adding batch norm layers to the network. Referencing the example here, we can modify the neural network as such:

# need to include keras.layers and Sequential API
from tf.keras import layers, Sequential

layer_sizes = [2, 128, 128, 128, 128, 1]

model_bn = tf.keras.Sequential(
[
layers.Dense(2, activation=tf.nn.tanh,
kernel_initializer="glorot_normal"),
layers.BatchNormalization(),
layers.Dense(128, activation=tf.nn.tanh,
kernel_initializer="glorot_normal"),
layers.BatchNormalization(),
layers.Dense(128, activation=tf.nn.tanh,
kernel_initializer="glorot_normal"),
layers.BatchNormalization(),
layers.Dense(1, activation=None),
]
)

model = CollocationSolverND()
model.compile(layer_sizes, f_model, Domain, BCs)
# overwrite the default NN with our new one defined above
model.u_model = model_bn
model.fit(tf_iter=1000, newton_iter=1000)


This will fit your custom network (i.e., with batch norm) as the PDE approximation network, allowing more stability and reducing the likelihood of vanishing gradients in the training.