سبک پایتون
راهنمای سبک 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')