راهنمای سبک کد TensorFlow

سبک پایتون

راهنمای سبک PEP 8 Python را دنبال کنید، به جز اینکه TensorFlow از 2 فاصله به جای 4 استفاده می کند. لطفاً با راهنمای سبک پایتون Google مطابقت داشته باشید، و از pylint برای بررسی تغییرات پایتون خود استفاده کنید.

ستون

برای نصب pylint :

$ pip install pylint

برای بررسی یک فایل با pylint از فهرست اصلی کد منبع TensorFlow:

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

نسخه های پایتون پشتیبانی می شود

برای نسخه های پایتون پشتیبانی شده، راهنمای نصب TensorFlow را ببینید.

وضعیت ساخت مداوم TensorFlow را برای ساخت‌های رسمی و پشتیبانی شده توسط انجمن ببینید.

سبک کدنویسی C++

تغییرات در کد TensorFlow C++ باید با راهنمای سبک Google C++ و جزئیات سبک خاص TensorFlow مطابقت داشته باشد. از clang-format برای بررسی تغییرات C/C++ خود استفاده کنید.

برای نصب در اوبونتو 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 تابعی است که با توجه به تانسورهای ورودی، تانسورهای خروجی را برمی گرداند (یا هنگام ساختن نمودارها، یک op به نمودار اضافه می کند).

  • اولین آرگومان باید تانسورها و به دنبال آن پارامترهای پایه پایتون باشد. آخرین آرگومان name با مقدار پیش فرض None است.
  • آرگومان های تانسور باید یا یک تانسور منفرد یا یک تانسور تکرار شونده باشند. یعنی «تنسور یا فهرست تنسورها» خیلی گسترده است. assert_proper_iterable را ببینید.
  • عملیاتی که تانسورها را به عنوان آرگومان می گیرند، باید convert_to_tensor فراخوانی کنند تا ورودی های غیر تانسوری را به تانسور تبدیل کنند، اگر از عملیات C++ استفاده می کنند. توجه داشته باشید که آرگومان ها همچنان به عنوان یک شی Tensor از نوع d خاص در مستندات توصیف می شوند.
  • هر عملیات پایتون باید یک name_scope داشته باشد. همانطور که در زیر مشاهده می کنید، نام op را به عنوان یک رشته ارسال کنید.
  • عملیات باید حاوی یک نظر گسترده پایتون با اعلان‌های Args و Returns باشد که هم نوع و هم معنای هر مقدار را توضیح دهد. شکل‌ها، dtypes یا رتبه‌های احتمالی باید در توضیحات مشخص شوند. جزئیات مستندات را ببینید.
  • برای افزایش قابلیت استفاده، مثالی از استفاده با ورودی/خروجی عملیات را در بخش Example قرار دهید.
  • از استفاده صریح از 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')