# Train a neural network potential for SiC#

In this tutorial, we train a neural network (NN) potential for a system containing two species: Si and C. This is very similar to the training for systems containing a single specie (take a look at Train a neural network potential for Si if you haven’t yet).

```from kliff import nn
from kliff.calculators.calculator_torch import CalculatorTorchSeparateSpecies
from kliff.dataset import Dataset
from kliff.dataset.weight import Weight
from kliff.descriptors import SymmetryFunction
from kliff.loss import Loss
from kliff.models import NeuralNetwork

descriptor = SymmetryFunction(
cut_name="cos",
cut_dists={"Si-Si": 5.0, "C-C": 5.0, "Si-C": 5.0},
hyperparams="set51",
normalize=True,
)
```

We will create two models, one for Si and the other for C. The purpose is to have a separate set of parameters for Si and C so that they can be differentiated.

```N1 = 10
N2 = 10
model_si = NeuralNetwork(descriptor)
# first hidden layer
nn.Linear(descriptor.get_size(), N1),
nn.Tanh(),
# second hidden layer
nn.Linear(N1, N2),
nn.Tanh(),
# output layer
nn.Linear(N2, 1),
)

N1 = 10
N2 = 10
model_c = NeuralNetwork(descriptor)
# first hidden layer
nn.Linear(descriptor.get_size(), N1),
nn.Tanh(),
# second hidden layer
nn.Linear(N1, N2),
nn.Tanh(),
# output layer
nn.Linear(N2, 1),
)

# training set
weight = Weight(forces_weight=0.3)
tset = Dataset(dataset_path, weight)
configs = tset.get_configs()

# calculator
calc = CalculatorTorchSeparateSpecies({"Si": model_si, "C": model_c}, gpu=False)
_ = calc.create(configs, reuse=False)

# loss
loss = Loss(calc)
result = loss.minimize(method="Adam", num_epochs=10, batch_size=4, lr=0.001)
```

Out:

```Epoch = 0       loss = 5.7247632980e+01
Epoch = 1       loss = 5.7215625763e+01
Epoch = 2       loss = 5.7186323166e+01
Epoch = 3       loss = 5.7158138275e+01
Epoch = 4       loss = 5.7130514145e+01
Epoch = 5       loss = 5.7103128433e+01
Epoch = 6       loss = 5.7075778961e+01
Epoch = 7       loss = 5.7048318863e+01
Epoch = 8       loss = 5.7020624161e+01
Epoch = 9       loss = 5.6992567062e+01
Epoch = 10      loss = 5.6973577499e+01
```

We can save the trained model to disk, and later can load it back if we want.

```model_si.save("final_model_si.pkl")
model_c.save("final_model_c.pkl")
loss.save_optimizer_state("optimizer_stat.pkl")
```

Total running time of the script: ( 0 minutes 1.955 seconds)

Gallery generated by Sphinx-Gallery