И теперь нам нужно создать нейронную сеть. Вот мы и добрались до самого интересного. Чтобы создать нейронную сеть, нам нужно создать класс, назовём его "SineNet", предполагая, что это будет нейросеть, которая решает задачу восстановления синуса. Её мы должны отнаследовать от класса torch.nn.Module. Вот такое наследование внесет в наш объект дополнительные функции, которые мы сейчас же будем использовать. Кроме того, нам нужно проинициализировать те слои, которые будут использоваться в сети. То есть мы пишем функцию "__init__", она на вход может принимать что угодно, любые параметры, которые нам будет интересно передать в эту сеть в момент конструирования. Нам, например, интересно передать количество скрытых нейронов, которые будут храниться в каждом слое, то есть мы предполагаем, что все слои будут одинакового размера. Там будет N "hidden neurons". Соответственно инициируем родительский объект. И давайте создавать слои: первый слой, который будет называться fc1, это "fully connected" слой, полносвязанный слой. В PyTorch "fully connected" слой называется "linear". Что мы передаём на вход? Мы передаём количество входных нейронов и количество выходных нейронов. Входных нейронов у нас будет один. То есть это, на самом деле, не нейрон будет, а сам вход в нейрон. Это одно число "x", координата нашей точки, по которой мы будем что-то предсказывать. Если бы у нас координата точки была какая-то многомерная, если точка у нас бы задалась в многомерном пространстве, то -- размерность того пространства, которое задаёт точку. Выходных нейронов, у нас будет как раз "n_hidden_neurons".
После этого нам нужна функция активации. Кстати, попробуйте убрать функцию активации, узнайте что получится. Функцию активации мы здесь берем -- сигмоиду. В принципе, нам бы подошла любая функция активации. Но сигмоида-- самая простая, почему бы и нет. Кроме того, мы добавим ещё один полносвязанный слой, но у него будет всего один нейрон. Этот нейрон будет нашим ответом на вопрос. Так как у нас задача регрессии, нас интересует ответ, который является одним числом, то на выходе нашей сети должен быть один нейрон. В итоге, наша нейросеть будет выглядеть, как два слоя, в одном из них будет несколько нейронов а во втором будет один. И теперь нам нужно написать функцию forward, то есть то, как наши слои последовательно применяются. Сначала мы применяем слой "fc1", на "x". То что получилось мы передаём в функцию активации, то что вышло из функций активации мы передаём в "fc2", и вот это же мы возвращаем. То есть, в принципе, функция forward повторяет нашу инициализацию. И давайте создадим такую сеть. Количество скрытых нейронов -- 50, чтобы точно хватило. У нас теперь есть "SineNet" -- объект, который, в принципе, можно обучать. Можно предсказывать.

К сожалению, у нас пока нет статистики ответов на данный вопрос, но мы работаем над этим.