دليل نمط رمز TensorFlow

أسلوب بايثون

اتبع دليل نمط PEP 8 Python ، باستثناء أن TensorFlow يستخدم مسافتين بدلاً من 4. يرجى الالتزام بدليل Google Python Style Guide ، واستخدام pylint للتحقق من تغييرات Python.

بيلينت

لتثبيت pylint :

$ pip install pylint

للتحقق من ملف باستخدام pylint من الدليل الجذر لرمز مصدر TensorFlow:

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

إصدارات بايثون المدعومة

للحصول على إصدارات 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 والاستخدامات الخاصة

عمليات بايثون

عملية TensorFlow هي دالة تقوم، في حالة وجود موترات الإدخال، بإرجاع موترات الإخراج (أو إضافة عملية إلى الرسم البياني عند إنشاء الرسوم البيانية).

  • يجب أن تكون الوسيطة الأولى عبارة عن موترات، متبوعة بمعلمات Python الأساسية. الوسيطة الأخيرة هي name بقيمة افتراضية None .
  • يجب أن تكون وسيطات الموتر إما موترًا واحدًا أو موترًا متكررًا. وهذا يعني أن "الموتر أو قائمة الموترات" واسعة جدًا. راجع assert_proper_iterable .
  • العمليات التي تأخذ الموترات كوسيطات يجب أن تستدعي convert_to_tensor لتحويل المدخلات غير الموترية إلى موترات إذا كانت تستخدم عمليات C++. لاحظ أن الوسائط لا تزال موصوفة ككائن Tensor من نوع dtype محدد في الوثائق.
  • يجب أن تحتوي كل عملية بايثون على name_scope . كما هو موضح أدناه، قم بتمرير اسم المرجع كسلسلة.
  • يجب أن تحتوي العمليات على تعليق بايثون واسع النطاق مع إعلانات Args وReturns التي تشرح نوع ومعنى كل قيمة. يجب تحديد الأشكال أو dtypes أو الرتب المحتملة في الوصف. انظر تفاصيل الوثائق.
  • لزيادة سهولة الاستخدام، قم بتضمين مثال للاستخدام مع مدخلات / مخرجات العملية في قسم المثال.
  • تجنب الاستخدام الصريح لـ 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')