从 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 关键字。
  • 从 Numpy+Pytorch 到 TensorFlow JS:总结和常用平替整理
  • 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])

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293395.html

(0)
上一篇 2022年11月23日
下一篇 2022年11月23日

相关推荐

发表回复

登录后才能评论