สไตล์หลาม
ปฏิบัติตาม คำแนะนำสไตล์ PEP 8 Python ยกเว้น 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
ภาษาอื่นๆ
- คู่มือสไตล์ Google Java
- คู่มือสไตล์ Google JavaScript
- คู่มือสไตล์ Google Shell
- คู่มือสไตล์ Google Objective-C
แบบแผนของ TensorFlow และการใช้งานพิเศษ
การดำเนินการหลาม
การดำเนินการ TensorFlow เป็นฟังก์ชันที่เทนเซอร์อินพุตที่กำหนดส่งคืนเทนเซอร์เอาต์พุต (หรือเพิ่ม op ให้กับกราฟเมื่อสร้างกราฟ)
- อาร์กิวเมนต์แรกควรเป็นเทนเซอร์ ตามด้วยพารามิเตอร์ Python พื้นฐาน อาร์กิวเมนต์สุดท้ายคือ
name
ที่มีค่าเริ่มต้นเป็นNone
- อาร์กิวเมนต์เทนเซอร์ควรเป็นเทนเซอร์ตัวเดียวหรือเทนเซอร์ที่ทำซ้ำได้ นั่นคือ "เทนเซอร์หรือรายชื่อเทนเซอร์" นั้นกว้างเกินไป ดู
assert_proper_iterable
- การดำเนินการที่ใช้เทนเซอร์เป็นอาร์กิวเมนต์ควรเรียก
convert_to_tensor
เพื่อแปลงอินพุตที่ไม่ใช่เทนเซอร์เป็นเทนเซอร์หากพวกเขากำลังใช้การดำเนินการ C ++ โปรดทราบว่าอาร์กิวเมนต์ยังคงอธิบายว่าเป็นวัตถุTensor
ของ dtype เฉพาะในเอกสารประกอบ - แต่ละการดำเนินการของ Python ควรมี
name_scope
ตามที่เห็นด้านล่าง ให้ส่งชื่อของ op เป็นสตริง - การดำเนินการควรมีความคิดเห็น Python ที่ครอบคลุมพร้อมการประกาศ Args และ Returns ที่อธิบายทั้งประเภทและความหมายของแต่ละค่า ควรระบุรูปร่าง ประเภท หรืออันดับที่เป็นไปได้ในคำอธิบาย ดูรายละเอียดเอกสาร
- เพื่อการใช้งานที่เพิ่มขึ้น ให้รวมตัวอย่างการใช้งานกับอินพุต / เอาท์พุตของ op ในส่วนตัวอย่าง
- หลีกเลี่ยงการใช้
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')