【.com快考】虽然你可以使用TensorFlow来训练一个简单的具有少量训练数据的神经网络,但是对于一个具有大量训练数据集的深度神经网络,你确实需要使用支持CUDA的NvidiaGPU,GoogleTPU或FPGA加速。不久前,替代方案是在CPU集群上训练数周。TensorFlow2.0引入的创新之一是JavaScript实现:TensorFlow.js。我没想到这会加速训练或推理,但它确实如此,并且它通过WebGLAPI支持所有GPU(不仅仅是支持CUDA的GPU)。TensorFlow.js简介TensorFlow.js是一个用于使用JavaScript开发和训练机器学习模型并将其部署在浏览器或Node.js上的库。您可以使用现有模型、转换PythonTensorFlow模型、使用迁移学习使用您自己的数据重新训练现有模型,以及从头开始开发模型。TensorFlow.js后端TensorFlow.js支持多个后端执行,但一次只有一个后端处于活动状态。TensorFlow.jsNode.js环境支持使用已安装的Python/CTensorFlow版本作为后端,这反过来可能会使用机器上可用的硬件加速技术,例如CUDA。还有一个基于JavaScript的Node.js后端,但功能有限。在浏览器中,TensorFlow.js有几个具有不同特性的后端。WebGL后端使用面向存储的WebGL纹理和面向执行的WebGL着色器提供GPU支持,比普通CPU后端快100倍。WebGL不需要CUDA,因此它可以充分利用您拥有的任何GPU。WebAssembly(WASM)TensorFlow.js后端的浏览器版本使用XNNPACK库来优化神经网络运算符的CPU实现。WASM后端通常比JavaScriptCPU后端快得多(快10到30倍),但通常比WebGL后端慢,除了非常小的模型。您的实际情况可能会有所不同,因此请在您自己的硬件上针对您自己的模型测试WASM后端和WebGL后端。TensorFlow.js模型和层TensorFlow.js支持两个用于构建神经网络模型的API。一个是LayersAPI,它实际上与TensorFlow2中的KerasAPI相同。另一个是CoreAPI,它实际上直接操作张量。与Keras一样,TensorFlow.jsLayersAPI有两种创建模型的方法:顺序方法和函数方法。sequentialAPI是层的线性堆栈,通过层列表(如下所示)或model.add()方法实现:constmodel=tf.sequential({layers:[tf.layers.dense({inputShape:[784],units:32,activation:'relu'}),tf.layers.dense({units:10,activation:'softmax'}),]});函数式API使用tf.model()API来创建任何有向无环图(DAG)网络://通过连接它们来创建层的任意图//viatheapply()method.constinput=tf.input({shape:[784]});constdense1=tf.layers.dense({units:32,activation:'relu'}).apply(input);constdense2=tf.layers.dense({units:10,activation:'softmax'}).apply(dense1);constmodel=tf.model({inputs:input,outputs:dense2});CoreAPI可以使用不同的代码来达到相同的目的,但是层与层之间并没有简单直观的联系。下面的模型看起来是一个基本的张量运算,但它创建了与前两个公式相同的网络。注意下面model()函数中使用的relu()和softmax(),都是神经网络操作。//Theweightsandbiasesforthetwodenselayers.constw1=tf.variable(tf.randomNormal([784,32]));constb1=tf.variable(tf.randomNormal([32]));constw2=tf.variable(tf.randomNormal([32],10]));constb2=tf.variable(tf.randomNormal([10]));functionmodel(x){returnx.matMul(w1).add(b1).relu().matMul(w2).add(b2).softmax();}PrebuiltTensorFlow.js模型存储库记录了十几个预构建的TensorFlow.js模型托管在NPM(用于在Node.js中使用)和unpkg(用于浏览器中间件)上。您可以使用提供的这些模型或用于迁移学习。稍加努力,您还可以将它们用作构建其他模型的构建块。其中一些模型实时使用设备的摄像头,例如手部姿势:图1.手部姿势可以检测手掌并跟踪手部骨架手指。下面的列表描述了大多数预打包的TensorFlow.js模型,以便于索引。图像分类物体检测人体分割姿态估计文本毒性检测通用句子编码器语音命令识别KNN分类器简单人脸检测语义分割人脸标志检测手势检测自然语言问答ml5.js简介ml5.js主要开发于纽约大学一个用户-友好的开源高级TensorFlow.js界面。ml5.js提供对预训练模型的即时浏览器访问,以检测人体姿势、生成文本、与其他图像一起设计样式、创作音乐、音调检测和常见英语单词关系等。TensorFlow.js主要针对数据科学家和开发人员,而ml5.js旨在支持更广泛的公众对机器学习的理解。ml5.js中的大多数示例都依赖于TensorFlow.js模型。它们被包装到网页中,您可以按原样运行它们或编辑它们,例如使用不同的图像。图2.PoseNet可以根据浏览器中的图像或视频进行实时姿态估计。将PythonTensorFlow模型转换为JavaScriptTensorFlow.js存储库的一部分包含用于保存的TensorFlow和Keras模型的转换器。它支持三种格式:SavedModel(TensorFlow的默认格式)、HDF5(Keras的默认格式)和TensorFlowHub。您可以将此转换器与标准存储库中保存的模型、您自己训练的模型以及您在其他地方找到的模型一起使用。转换实际上有两个步骤。第一步是将现有模型转换为model.json和二进制权重文件。第二步是使用API将模型加载到TensorFlow.js中:将tf.loadGraphModel用于转换后的TensorFlow和TensorFlowHub模型,或将tf.loadLayersModel用于转换后的Keras模型。使用迁移学习TensorFlow.js以与TensorFlow相同的方式支持迁移学习。该文档提供了几个示例,用于为您自己的图像自定义MobileNet,以及为您自己的语音类自定义语音命令识别模型。从本质上讲,您在每个Codelab中所做的就是向经过训练的模型添加一个自定义分类器,然后对其进行训练。一般来说,TensorFlow能做到的,TensorFlow.js基本上都能做到。然而,由于TensorFlow.js(游戏的通用GPU)的目标环境通常比通常用于TensorFlow深度学习训练的大量Nvidia服务器GPU具有更少的GPU内存,因此您可能必须缩小模型的大小,以便运行in.transform实用程序可以为您完成这部分工作,但您需要手动取出图层,并减少训练的批量大小。原标题:HowtouseTensorFlowinyourbrowser,作者:MartinHeller
