谷歌开源深度学习框架 TensorFlow 近日发布了一个完整的1.0版本——TensorFlow 1.0.0-rc0。
Version 1.0 不仅改进了 TensorFlow 库中的机器学习功能,而且对 Python 和 Java 用户开放了 TensorFlow 开发,并且提升了 debugging。新版本中,一个对 TensorFlow 的计算进行了优化的新编译器,为一系列能够在智能手机级别的硬件上运行机器学习应用程序打开了大门。
鉴于 Python 是开发和运行机器学习应用最大的平台之一,TensorFlow 1.0 比较正确的做法是专注于提升与 Python 的交互。TensorFlow Python API 已经得到升级,进而,TensorFlow所使用的语法和 metaphors 能更好地适配 Python,在二者之间提供更好的一致性。
坏消息是,这些改变肯定会破坏已有的 Python 应用。Tensorflow 的开发者已经发布了一个script,用于将旧的 TensorFlow API scripts 升级到新的格式,但是,这一script并不是万能的,你可能仍需要手动调整scripts。
TensorFlow 现在可以在与 Python 3 兼容的 Docker 镜像中使用,对于所有Python用户,TensorFlow现在可以通过 Python 的本地软件包管理器 pip 来安装。最后这一点在提高TensorFlow的通用性上迈出了一大步,特别是对于那些使用股票 Python 分布,而不是专门针对数据科学(如Anaconda)的应用。
Java是机器学习的另一个主要语言平台,但此前,TensorFlow 并没有Java绑定。TensorFlow 1.0版本的框架引入了一个Java API,但它远远不够完整,并且随时可以改变,你需要能够在Linux 或 MacOS 上从源代码构建 TensorFlow。 (考虑这些深入的发现,TensorFlow的 Windows 端口仍然是一个二等公民。)
用 XLA走向移动端
也许 TensorFlow 1.0中新增的一个最大功能不是语言支持功能或新的算法,而是用于TensorFlow计算中的线性代数的实验编译器——加速线性代数(XLA)。它通过生成可以在CPU或GPU上运行的机器代码来加速某些数学运算。现在,XLA只支持Nvidia GPU,但这与GPU支持机器学习应用程序的一般性质是一致的。
XLA 还提高了TensorFlow的可移植性,使现有的TensorFlow程序可以以未经修改的方式,通过创建后端从而在新的硬件平台上运行。这些新功能部分要得益于IBM将TensorFlow支持添加到其用于机器学习的PowerAI硬件解决方案(由混合GPU和Power8 CPU支持)这件事。
TensorFlow的工程师也减少了应用程序的总体内存使用和空间占用。这些优化整体上产生了回报,但对于移动端来说,这是一个特别大的优势。以前的 TensorFlow 版本增加了对Android,iOS 和 Raspberry Pi 硬件平台的支持,允许它在这些设备上执行图像分类等操作。
机器学习的讨论通常涉及高端硬件的驱动力:定制CPU,GPU阵列,FPGA和云环境提供的规模。但是理论上,创建在普通的智能手机上工作、并且不需要云端或后端每时每刻的支持的机器学习模型,可以带来新的应用程序。即使这些目标没有完全实现,考虑到这项工作将为TensorFlow带来的好处,也是应该值得的努力。
TensorFlow 1.0 重大功能及改善
- XLA(实验版):初始版本的XLA,针对TensorFlow图(graph)的专用编译器,面向CPU和GPU。
- TensorFlow Debugger(tfdbg):命令行界面和API。
- 添加了新的python 3 docker图像。
- 使pip包兼容pypi。TensorFlow现在可以通过 [pip install tensorflow] 命令安装。
- 更改了几个python API的调用方式,使其更类似 NumPy。
- 新的(实验版)Java API。
- Android:全新人物检测+跟踪演示实现——“Scalable Object Detection using DNN”(带有额外的YOLO对象检测器支持)。
- Android:全新基于摄像头的图像风格转换演示,使用了神经网络艺术风格转换技术。
重大 API 变动
为了帮助您升级现有的TensorFlow Python代码以匹配以下API更改,我们准备了一个转换脚本:
- TensorFlow / models已经被移动到一个单独的github库。
- 除法和模运算符(/,//,%)现在匹配Python(flooring)语义。这也适用于 [tf.div] 和 [tf.mod]。要获取基于强制整数截断的行为,可以使用 [tf.truncatediv] 和 [tf.truncatemod]。
- 现在推荐使用 [tf.divide()] 作为除法函数。[tf.div()] 将保留,但它的语义不会回应 Python 3 或 [from future] 机制。
- tf.reverse() 现在取轴的索引要反转。例如 [tf.reverse(a,[True,False,True])] 现在必须写为 [tf.reverse(a,[0,2])]。 [tf.reverse_v2()] 将保持到 TensorFlow 1.0 最终版。
- [tf.mul,tf.sub ] 和 [tf.neg] 不再使用,改为 [tf.multiply],[tf.subtract] 和 [tf.negative]。
- [tf.pack] 和 [tf.unpack] 弃用,改为 [tf.stack] 和 [tf.unstack]。
- [TensorArray.pack] 和 [TensorArray.unpack] 在弃用过程中,将来计划启用 [TensorArray.stack] 和 [TensorArray.unstack]。
- 以下Python函数的参数在引用特定域时,全部改为使用 [axis]。目前仍将保持旧的关键字参数的兼容性,但计划在 1.0 最终版完成前删除。
- tf.listdiff已重命名为tf.setdiff1d以匹配NumPy命名。
- tf.inv已被重命名为tf.reciprocal(组件的倒数),以避免与np.inv的混淆,后者是矩阵求逆。
- tf.round现在使用banker的舍入(round to even)语义来匹配NumPy。
- tf.split现在以相反的顺序并使用不同的关键字接受参数。我们现在将NumPy order 匹配为tf.split(value,num_or_size_splits,axis)。
- tf.sparse_split现在采用相反顺序的参数,并使用不同的关键字。我们现在将NumPy order 匹配为tf.sparse_split(sp_input,num_split,axis)。注意:我们暂时要求 tf.sparse_split 需要关键字参数。
- tf.concat现在以相反的顺序并使用不同的关键字接受参数。特别地,我们现在将NumPy order匹配为tf.concat(values,axis,name)。
- 默认情况下,tf.image.decode_jpeg使用更快的DCT方法,牺牲一点保真度来提高速度。通过指定属性dct_method =’INTEGER_ACCURATE’,可以恢复到旧版行为。
- tf.complex_abs已从Python界面中删除。 tf.abs支持复杂张量,现在应该使用 tf.abs。
- Template.var_scope属性重命名为.variable_scope
- SyncReplicasOptimizer已删除,SyncReplicasOptimizerV2重命名为SyncReplicasOptimizer。
- tf.zeros_initializer()和tf.ones_initializer()现在返回一个必须用initializer参数调用的可调用值,在代码中用tf.zeros_initializer()替换tf.zeros_initializer。
- SparseTensor.shape已重命名为SparseTensor.dense_shape。与SparseTensorValue.shape相同。
- 分别替换tf.scalar_summary,tf.histogram_summary,tf.audio_summary,tf.image_summary与tf.summary.scalar,tf.summary.histogram,tf.summary.audio,tf.summary.image。新的摘要ops以名字而不是标签作为它们的第一个参数,意味着摘要ops现在尊重TensorFlow名称范围。
- 使用tf.summary.FileWriter和tf.summary.FileWriterCache替换tf.train.SummaryWriter和tf.train.SummaryWriterCache。
- 从公共API中删除RegisterShape。使用C++形状函数注册。
- Python API 中的 _ref dtypes 已经弃用。
- 在C++ API(in tensorflow/cc)中,Input,Output等已经从tensorflow::ops命名空间移动到tensorflow。
- 将{softmax,sparse_softmax,sigmoid} _cross_entropy_with_logits的arg order更改为(labels,predictions),并强制使用已命名的args。
Bug 修改及其他变动
- 新的运算 op:parallel_stack。
- 为RecordReader/RecordWriter 增加了 tf io 压缩选项常量。
- 添加了 sparse_column_with_vocabulary_file,指定将字符串特征转换为ID的特征栏(feature column)。
- 添加了index_to_string_table,返回一个将索引映射到字符串的查找表。
- 添加string_to_index_table,返回一个将字符串与索引匹配的查找表。
- 添加ParallelForWithWorkerId函数。
- 添加string_to_index_table,返回一个将字符串与索引匹配的查找表。
- 支持从contrib / session_bundle中的v2中的检查点文件恢复会话。
- 添加了tf.contrib.image.rotate函数,进行任意大小角度旋转。
- 添加了tf.contrib.framework.filter_variables函数,过滤基于正则表达式的变量列表。
- make_template()可以添加 custom_getter_ param。
- 添加了关于如何处理recursive_create_dir现有目录的注释。
- 添加了QR因式分解的操作。
- Python API中的分割和mod现在使用flooring(Python)语义。
- Android:预构建的libs现在每晚构建。
- Android: TensorFlow 推理库 cmake/gradle build 现在归在 contrib/android/cmake下面
- Android:更强大的会话初始化(Session initialization)代码。
- Android:当调试模式激活时,TF stats现在直接显示在demo和日志中
- Android:全新/更好的 README.md 文档
- saved_model可用作tf.saved_model。
- Empty op 现在是有状态的。
- 提高CPU上ASSIGN运算的scatter_update的速度。
- 更改reduce_join,使其处理reduction_indices的方式与其他reduce_ops相同。
- 将TensorForestEstimator移动到contrib/tensor_forest。
- 默认情况下启用编译器优化,并允许在configure中进行配置。
- 使指标权重 broadcasting 更加严格。
- 添加新的类似队列的StagingArea和新运算 ops:stages 和 unstage。
登录后发表你的伟大言论!
立即登录 注册