Руководство по стилю кода TensorFlow

Стиль Python

Следуйте руководству по стилю Python PEP 8 , за исключением того, что TensorFlow использует 2 пробела вместо 4. Соблюдайте руководство по стилю Google Python и используйте pylint для проверки изменений Python.

пилинт

Чтобы установить pylint :

$ pip install pylint

Чтобы проверить файл с помощью pylint из корневого каталога исходного кода TensorFlow:

$ pylint --rcfile=tensorflow/tools/ci_build/pylintrc tensorflow/python/keras/losses.py

Поддерживаемые версии Python

Поддерживаемые версии Python см. в руководстве по установке TensorFlow.

См. статус непрерывной сборки TensorFlow для официальных сборок и сборок, поддерживаемых сообществом.

стиль кодирования C++

Изменения в коде TensorFlow C++ должны соответствовать Руководству по стилю Google C++ и конкретным деталям стиля TensorFlow . Используйте clang-format для проверки изменений C/C++.

Для установки на Ubuntu 16+ выполните:

$ apt-get install -y clang-format

Вы можете проверить формат файла C/C++ следующим образом:

$ clang-format <my_cc_file> --style=google > /tmp/my_cc_file.cc
$ diff <my_cc_file> /tmp/my_cc_file.cc

Другие языки

Соглашения TensorFlow и специальное использование

Операции Python

Операция TensorFlow — это функция, которая по заданным входным тензорам возвращает выходные тензоры (или добавляет операцию к графу при построении графиков).

  • Первым аргументом должны быть тензоры, за которыми следуют базовые параметры Python. Последний аргумент — это name со значением по умолчанию None .
  • Аргументы тензора должны быть либо одним тензором, либо итерацией тензоров. То есть «Тензор или список тензоров» слишком широк. См. assert_proper_iterable .
  • Операции, которые принимают тензоры в качестве аргументов, должны вызывать convert_to_tensor для преобразования нетензорных входных данных в тензоры, если они используют операции C++. Обратите внимание, что аргументы по-прежнему описываются в документации как объект Tensor определенного типа d.
  • Каждая операция Python должна иметь name_scope . Как показано ниже, передайте имя операции в виде строки.
  • Операции должны содержать обширный комментарий Python с объявлениями Args и Returns, которые объясняют тип и значение каждого значения. Возможные формы, типы или ранги должны быть указаны в описании. См. подробности документации.
  • Для повышения удобства использования включите пример использования с входами/выходами операции в раздел «Пример».
  • Избегайте явного использования tf.Tensor.eval или tf.Session.run . Например, чтобы написать логику, зависящую от значения Tensor, используйте поток управления TensorFlow. В качестве альтернативы можно ограничить выполнение операции только тогда, когда включено активное выполнение ( tf.executing_eagerly() ).

Пример:

def my_op(tensor_in, other_tensor_in, my_param, other_param=0.5,
          output_collections=(), name=None):
  """My operation that adds two tensors with given coefficients.

  Args:
    tensor_in: `Tensor`, input tensor.
    other_tensor_in: `Tensor`, same shape as `tensor_in`, other input tensor.
    my_param: `float`, coefficient for `tensor_in`.
    other_param: `float`, coefficient for `other_tensor_in`.
    output_collections: `tuple` of `string`s, name of the collection to
                        collect result of this op.
    name: `string`, name of the operation.

  Returns:
    `Tensor` of same shape as `tensor_in`, sum of input values with coefficients.

  Example:
    >>> my_op([1., 2.], [3., 4.], my_param=0.5, other_param=0.6,
              output_collections=['MY_OPS'], name='add_t1t2')
    [2.3, 3.4]
  """
  with tf.name_scope(name or "my_op"):
    tensor_in = tf.convert_to_tensor(tensor_in)
    other_tensor_in = tf.convert_to_tensor(other_tensor_in)
    result = my_param * tensor_in + other_param * other_tensor_in
    tf.add_to_collection(output_collections, result)
    return result

Использование:

output = my_op(t1, t2, my_param=0.5, other_param=0.6,
               output_collections=['MY_OPS'], name='add_t1t2')