TensorFlow风格指南

此页面包含TensorFlow的开发人员和用户应遵循的风格决策,以增加其代码的可读性,减少错误数量并提高一致性。

Python风格

一般遵循 PEP8 Python风格指南,除了使用2个空格。

Python 2和3兼容

  • 所有代码都需要与Python 2和3兼容。
  • 所有Python文件中都应存在下一行: from __future__ import absolute_import from __future__ import division from __future__ import print_functio
  • 使用six写兼容代码(例如six.moves.range)。

Bazel BUILD规则

TensorFlow使用Bazel构建系统并执行下一个要求:

  • 每个BUILD文件应包含下一个标题: # Description: # <...> package( default_visibility = ["//visibility:private"], features = ["-parse_headers"], ) licenses(["notice"])  # Apache 2.0 exports_files(["LICENSE"])
  • 在每个BUILD文件的末尾,应包含: filegroup( name = "all_files", srcs = glob( ["**/*"], exclude = [ "**/METADATA", "**/OWNERS", ], ), visibility = ["//third_party/tensorflow:__subpackages__"], )
  • 添加新的BUILD文件时,将此行添加tensorflow/BUILDall_opensource_files目标文件中。 "//third_party/tensorflow/<directory>:all_files",

  • 对于所有Python BUILD目标(库和测试)添加下一行: srcs_version = "PY2AND3",

张量

  • 处理批次的操作可以假设Tensor的第一个维度是批量维度。

Python操作

的Python操作是一个函数,给定输入张量和参数,创建图的一部分,并返回输出张量。

  • 第一个参数应该是张量,其次是基本的python参数。最后一个参数name的默认值为None。如果操作需要将一些Tensors 保存到Graph集合,则将参数与集合名称一起放在name参数之前。
  • 张量参数应该是单张量或迭代张量。例如“张量或张量表”太广泛了。见assert_proper_iterable
  • convert_to_tensor 如果使用C ++操作,将张量作为参数的操作应调用将非张量输入转换为张量。请注意,参数仍被描述为文档中Tensor特定dtype的对象。
  • 每个Python操作应该有op_scope如下所示。传递输入张量列表,name并将op的默认名称作为参数。
  • 操作应该包含一个广泛的Python注释与Args和Returns声明,解释每个值的类型和含义。应在说明中指定可能的形状,型式或等级。 请参阅文档详细信息
  • 为了提高可用性,包括使用示例部分中op操作的输入/输出示例。

例:

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, "my_op", [tensor_in, other_tensor_in]):   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_collections(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')

图层

是结合可变创建和/或一个或多个其他图形操作一个Python操作。遵循与常规Python操作相同的要求。

  • 如果一个层创建一个或多个变量,层函数也应该遵循下列参数:
  • initializers:可选地允许指定变量的初始值。
  • regularizers:可选地允许为变量指定正则化程序。
  • trainable:哪个控制他们的变量是否可训练。
  • scopeVariableScope该变量将被放在下面的对象。
  • reusebool指示变量如果存在于范围内,应重新使用。
  • 训练过程中行为不同的层应具有:
  • is_trainingbool指示是否建立训练图。

例:

def conv2d(inputs,            num_filters_out,            kernel_size,            stride=1,            padding='SAME',            activation_fn=tf.nn.relu,            normalization_fn=add_bias,            normalization_params=None,            initializers=None,            regularizers=None,            trainable=True,            scope=None,            reuse=None):   ... see implementation at tensorflow/contrib/layers/python/layers/layers.py ...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)

首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(me...

2140
来自专栏生信宝典

R语言学习 - 韦恩图

韦恩图 韦恩图是用来反映不同集合之间的交集和并集情况的展示图。一般用于展示2-5个集合之间的交并关系。集合数目更多时,将会比较难分辨,更多集合的展示方式一般使用...

2827
来自专栏程序员互动联盟

【答疑释惑】C语言里面结构体大小统计方法

之前说过一个关于结构体在内存中所占字节数的问题,我们知道结构体长度的计算并不是所有成员长度的相加,而是因为编译器优化会对其进行对齐,这样会优化访问速度等。 那...

2937
来自专栏企鹅号快讯

Windows路径转换为Msys2表示的Linux路径

实现功能: H:\MySpace\PluginConfig 转换为: /h/MySpace/PluginConfig ? 实现代码 #!/usr/bin/gaw...

2066
来自专栏xingoo, 一个梦想做发明家的程序员

圆排列问题-回溯法

问题描述:     给定n个大小不等的圆 c1 c2 c3 c4 要将n个圆排进一个矩形框中,且要求底边相切。找出有最小长度的圆排列。     例如:当n=3,...

2249
来自专栏java思维导图

8张图理解Java,一图胜千言

一图胜千言,下面图解均来自Program Creek 网站。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。 1、字符串不变性 下面这张图展示了这段代码...

2313
来自专栏Python小屋

详解Python中的序列解包(2)

8个月前曾经发过一篇关于序列解包的文章,见详解Python序列解包,本文再稍作补充。 可以说,序列解包的本质就是把一个序列或可迭代对象中的元素同时赋值给多个变量...

3345
来自专栏mathor

LeetCode329. 矩阵中的最长递增路径

 dfs,主函数中枚举起点,然后dfs函数中枚举四个方向进行移动,但是光dfs还不够,因为我们发现存在很多冗余,所以这是一道dfs+dp的问题,resul...

761
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版5.7节C风格数据结构内存布局之结构体数组

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

591
来自专栏人工智能头条

TensorFlow架构与设计:变量初始化

874

扫码关注云+社区