أسلوب بايثون
اتبع دليل نمط 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 هي دالة تقوم، في حالة وجود موترات الإدخال، بإرجاع موترات الإخراج (أو إضافة عملية إلى الرسم البياني عند إنشاء الرسوم البيانية).
- يجب أن تكون الوسيطة الأولى عبارة عن موترات، متبوعة بمعلمات بايثون الأساسية. الوسيطة الأخيرة هي
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')