Рассмотрим, из каких кирпичиков состоят нейронные сети и их основные свойства.
Наиболее крупными структурными единицами нейросетей являются слои, которые выполняют определенные задачи, как сокращение размерности, обобщение признаков, нормализация данных, получение временной и пространственной информации... В основе же слоев лежат наборы переменных, выполняющие некоторые операции со входными данными.
В библиотеке глубокого обучения TensorFlow (псевдоним tf) большинство высокоуровневых слоев являются подклассами tf.Module. Напишем простой класс из двух переменных, реализующий умножение входа на матрицу и сложение с вектор-строкой:
Метод __call__ - запускается при вызове объекта по имени. Например так:
Для получения переменных слоя можно вызвать свойство variables. При этом существует также возможность извлечения только обучаемых переменных (trainable_variables):
При решение сложных задач требуется создавать несколько слоев, которые объединяются друг с другом. Для этого опять же можно создать класс, наследующий tf.Module и уже внутри него вызывать не только отдельные операции, а ранее определенные слои. Например, видоизменим наш слой MyModule и включим его в двухслойную структуру:
В класс MyModule добавлена инициализация переменных, а также задание размеров в соответствии с вводимыми данными (из-за этого их реализация переместилась в метод __call__). В классе TwoLayerModel вызываются слои MyModule, а также функция активации relu.
Аналогично MyModule TwoLayerModel также имеет свойство variables. Кроме того, присутствует свойство submodules, которое содержит информацию о внутренних слоях модели: