从 Numpy+Pytorch 到 TensorFlow JS:总结和常用平替整理
作者:互联网
如何拥有较为平滑的移植体验?
- 保持两种语言,和两个框架的API文档处于打开状态,并随时查阅:Python,JavaScript;Pytorch,TensorFlow JS(用浏览器 F3 搜索关键词)。
可选阅读,《动手学深度学习》,掌握解决常见学习问题时,Pytorch 和 TensorFlow 的实现方法。
精读 TensorFlow JS 的官方教程,和指南。
精读 TensorFlow JS 的官方文档:与 Python tf.keras 的区别。
深入了解 JavaScript 特色对象:生成器 Generator,Promise,async await。 - 多用谷歌。
一些碎碎念
- JavaScript 不存在像 numpy 之于 python 一样著名且好用的数据处理库,所以请放弃对 JavaScript 原生类型 Array 进行操作的尝试,转而寻找基于 TensorFlow JS API 的解决方法。
- JavaScript 作为一门前端语言,一大特色是包含了大量异步编程(即代码不是顺序执行的,浏览器自有一套标准去调整代码的执行顺序),这是为了保证前端页面不被卡死,所必备的性质。也因此,TensorFlow JS的函数中,许多输入输出传递的都不是数据,而是Promise对象。很多功能支持异步,但如果没有完全搞懂异步编程,不妨多用同步的思路:用 tf.Tensor.arraySync() 把 Tensor 的值取出,具体来说是将 Tensor 对象以同步的方式(即立即执行)拷贝生成出一个新的 array 对象。
- Promise 对象是ES6新增的对象,一般与then一起使用,但掌握 async & await 就够了,这是更简洁的写法。
- 多关注 API 文档中对象方法的返回类型,返回 Promise 对象则与异步编程相关,如果要获取Promise对象储存的值,需要在有 async function 包裹的代码中前置 await 关键字。
- Pytorch 中的张量可以通过索引访问其元素,而 TensorFlow JS 则不能,需要转换为 array 进行访问。
常用平替整理
将张量转换为数组
- Python, Pytorch:
tensor = torch.tensor([1,2,3]) np_array = tensor.numpy()
- JS, tfjs:
// 方式一:arraySync() let tensor = tf.tensor1d([1,2,3]); let array = tensor.arraySync(); console.log(array); // [1,2,3] // 方式二:在async函数体内操作 async function fun() { let tensor = tf.tensor1d([1,2,3]); let array = await tensor.array(); console.log(array); // [1,2,3] } fun(); // 注意,下面的写法是不行的,因为async函数的返回值是Promise对象 array = async function (){ return await tensor.array(); }(); console.log(array); // Promise object // 方式三:用then取出async函数返回Promise对象中的值 let a (async function() { let array = await tensor.array(); return array })().then(data => {a = data;}) console.log(a); // [1,2,3]
访问张量中的元素
- Python,Pytorch:
tensor = torch.tensor([1,2,3]) print(tensor[0]) print(tensor[-1])
标签:Numpy,Pytorch,TensorFlow,语言,框架,JavaScript,浏览器,关键词 来源: