• 分析开源机器学习框架TensorFlow


    TensorFlow是一个开源的机器学习框架,由Google开发和维护。它提供了一个灵活的编程环境,可用于构建和训练各种机器学习模型。TensorFlow的基本概念和使用场景如下:

    1. 张量(Tensor):在TensorFlow中,所有的数据都以张量的形式表示。张量是一个多维数组,可以是标量(0维张量)、向量(1维张量)、矩阵(2维张量)或更高维度的数组。Tensor是用于描述向量、标量和其它Tensor之间线性关系的集合对象。线性关系的简单例子包括点乘、叉乘和线性映射。向量和标量本身也是Tensor。
      Tensor和多维矩阵的区别:
      多维矩阵是一种数据结构,可以在特定坐标系下表示Tensor。
      Tensor是一类多重线性函数,处理一系列线性可分的向量变量。在预定义好Tensor的情况下,数据传入时就会开始实际运算。

    2. 计算图(Computation Graph):TensorFlow使用计算图来表示机器学习模型的计算过程。计算图由一系列的操作(Operations)和张量组成。操作表示对张量的计算,而张量则表示操作之间的数据流动。一个运算图(computational graph)是用图节点描述的一系列TensorFlow操作。每个节点输入0或多个Tensor,输出1个Tensor。一类节点被称为常量节点,它没有输入,只输出它存储的常量。上述运算中的at和bt在传至节点前必须被赋值,如果不赋值会出现TypeError。目前的graph包括at和bt两个Tensor以及mult运算。为了处理mult运算,运算图需要开启一个session。除了常量constant,还可以用变量variables和占位符Placeholders来给图传值。变量存储于内存缓冲区中,它们必须被显性初始化并可以在训练中和训练后保存到硬盘中。一般在调用模型前用一个函数实现所有变量的初始化。占位符描述的量一般不会再创建运算图时被赋值,而是在运算过程中得到其值。

       

    3. 变量(Variable):变量是在模型训练过程中需要优化的参数,例如神经网络的权重和偏差。在TensorFlow中,变量可以在计算图中进行定义和初始化,并且在训练过程中不断更新。

    4. 会话(Session):TensorFlow需要在会话中执行计算图。会话负责分配计算资源,运行操作,并且存储变量的值。通过会话,可以有效地管理计算资源和模型的状态。

    5. 模型保存和恢复:TensorFlow提供了保存和恢复模型的功能,可以将训练好的模型保存到磁盘上,并在需要的时候重新加载模型。这样可以避免重新训练模型,并且方便模型的部署和分享。

    TensorFlow的使用场景非常广泛,包括但不限于以下方面:

    1. 机器学习模型的训练和推断:TensorFlow可以用于构建和训练各种机器学习模型,例如神经网络、决策树、支持向量机等。通过定义计算图和调整模型参数,可以进行模型的训练和推断。





    2. 自然语言处理(NLP):TensorFlow提供了一些高级的API和工具,用于处理自然语言处理任务,例如文本分类、情感分析、机器翻译等。可以使用TensorFlow搭建文本处理模型,并利用大量的数据进行训练。

    3. 图像处理和计算机视觉:TensorFlow可以用于图像处理和计算机视觉任务,例如图像分类、目标检测、图像生成等。通过使用预训练的模型或者自定义模型,可以实现图像相关的各种任务。

    4. 强化学习:TensorFlow可以用于强化学习任务,例如智能游戏、机器人控制等。通过定义奖励和动作空间,可以使用TensorFlow构建强化学习模型,并进行训练和优化。

    总之,TensorFlow是一个功能强大的机器学习框架,可以帮助开发者构建和训练各种类型的机器学习模型,并在各个领域解决各种复杂的问题。

    小试牛刀

    使用 JavaScript 开发机器学习模型,并直接在浏览器或 Node.js 中使用机器学习模型。

    TensorFlow.js 提供了一系列预训练好的模型,方便大家快速地给自己的程序引入人工智能能力。
    模型库中模型分类包括图像识别、语音识别、人体姿态识别、物体识别、文字分类等。
    由于这些 API 默认模型文件都存储在谷歌云上,直接使用会导致中国用户无法直接读取。在程序内使用模型 API 时要提供 modelUrl 的参数,可以指向谷歌中国的镜像服务器。

    模型的 url path 是一致的。以 posenet 模型为例:

    谷歌云地址
    https://storage.googleapis.com/tfjs-models/savedmodel/posenet/mobilenet/float/050/model-stride16.json
    中国镜像地址
    https://www.gstaticcnapps.cn/tfjs-models/savedmodel/posenet/mobilenet/float/050/model-stride16.json

    在浏览器中使用 MobileNet 进行摄像头物体识别

    这里我们将通过一个简单的 HTML 页面,来调用 TensorFlow.js 和与训练好的 MobileNet ,在用户的浏览器中,通过摄像头来识别图像中的物体是什么。

    1. 我们建立一个 HTML 文件,在头信息中,通过将 NPM 模块转换为在线可以引用的免费服务 unpkg.com,来加载 @tensorflow/tfjs 和 @tensorflow-models/mobilenet 两个 TFJS 模块:

    1. <head>
    2. <script src="https://unpkg.com/@tensorflow/tfjs">script>
    3. <script src="https://unpkg.com/@tensorflow-models/mobilenet"> script>
    4. head>

    2. 我们声明三个 HTML 元素:用来显示视频的 ,用来显示我们截取特定帧的 ,和用来显示检测文字结果的 

    1. <video width=400 height=300>video>
    2. <p>p>
    3. <img width=400 height=300 />

    3. 我们通过 JavaScript ,将对应的 HTML 元素进行初始化:videoimagestatus 三个变量分别用来对应 

     三个 HTML 元素,canvas 和 ctx 用来做从摄像头获取视频流数据的中转存储。model 将用来存储我们从网络上加载的 MobileNet:

    1. const video = document.querySelector('video')
    2. const image = document.querySelector('img')
    3. const status = document.querySelector("p")
    4. const canvas = document.createElement('canvas')
    5. const ctx = canvas.getContext('2d')
    6. let model

    4. main() 用来初始化整个系统,完成加载 MobileNet 模型,将用户摄像头的数据绑定  这个 HTML 元素上,最后触发 refresh() 函数,进行定期刷新操作:

    1. async function main () {
    2. status.innerText = "Model loading..."
    3. model = await mobilenet.load()
    4. status.innerText = "Model is loaded!"
    5. const stream = await navigator.mediaDevices.getUserMedia({ video: true })
    6. video.srcObject = stream
    7. await video.play()
    8. canvas.width = video.videoWidth
    9. canvas.height = video.videoHeight
    10. refresh()
    11. }

    5. refresh() 函数,用来从视频中取出当前一帧图像,然后通过 MobileNet 模型进行分类,并将分类结果,显示在网页上。然后,通过 setTimeout,重复执行自己,实现持续对视频图像进行处理的功能:

    1. async function refresh(){
    2. ctx.drawImage(video, 0,0)
    3. image.src = canvas.toDataURL('image/png')
    4. await model.load()
    5. const predictions = await model.classify(image)
    6. const className = predictions[0].className
    7. const percentage = Math.floor(100 * predictions[0].probability)
    8. status.innerHTML = percentage + '%' + ' ' + className
    9. setTimeout(refresh, 100)
    10. }

    整体功能,只需要一个文件,几十行 HTML/JavaScript 即可实现。可以直接在浏览器中运行,完整的 HTML 代码如下:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content=" -width, initial-scale=1.0">
    7. <title>tensorflow demotitle>
    8. <script src="https://unpkg.com/@tensorflow/tfjs">script>
    9. <script src="https://unpkg.com/@tensorflow-models/mobilenet"> script>
    10. head>
    11. <body>
    12. <div>
    13. <video width=400 height=300>video>
    14. <p>p>
    15. <img width=400 height=300 />
    16. div>
    17. <script>
    18. const video = document.querySelector('video')
    19. const image = document.querySelector('img')
    20. const status = document.querySelector("p")
    21. const canvas = document.createElement('canvas')
    22. const ctx = canvas.getContext('2d')
    23. let model
    24. main()
    25. async function main () {
    26. status.innerText = "Model loading..."
    27. model = await mobilenet.load()
    28. status.innerText = "Model is loaded!"
    29. const stream = await navigator.mediaDevices.getUserMedia({ video: true })
    30. video.srcObject = stream
    31. await video.play()
    32. canvas.width = video.videoWidth
    33. canvas.height = video.videoHeight
    34. refresh()
    35. }
    36. async function refresh(){
    37. ctx.drawImage(video, 0,0)
    38. image.src = canvas.toDataURL('image/png')
    39. await model.load()
    40. const predictions = await model.classify(image)
    41. const className = predictions[0].className
    42. const percentage = Math.floor(100 * predictions[0].probability)
    43. status.innerHTML = percentage + '%' + ' ' + className
    44. setTimeout(refresh, 100)
    45. }
    46. script>
    47. body>
    48. html>

    TensorFlow.js 中的 sub() 系列数学计算函数

    TensorFlow.js 支持 tf.sub(a, b) 和 a.sub(b) 两种方法的数学函数调用。其效果是等价的,读者可以根据自己的喜好来选择。

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>tensorflow demotitle>
    8. <script src="http://unpkg.com/@tensorflow/tfjs/dist/tf.min.js">script>
    9. head>
    10. <body>
    11. <div>
    12. <p id="result">p>
    13. div>
    14. <script>
    15. window.onload = function(){
    16. const xsRaw = tf.tensor([2013, 2014, 2015, 2016, 2017])
    17. const ysRaw = tf.tensor([12000, 14000, 15000, 16500, 17500])
    18. // 归一化
    19. const xs = xsRaw.sub(xsRaw.min())
    20. .div(xsRaw.max().sub(xsRaw.min()))
    21. const ys = ysRaw.sub(ysRaw.min())
    22. .div(ysRaw.max().sub(ysRaw.min()))
    23. const a = tf.scalar(Math.random()).variable()
    24. const b = tf.scalar(Math.random()).variable()
    25. // y = a * x + b.
    26. const f = (x) => a.mul(x).add(b)
    27. const loss = (pred, label) => pred.sub(label).square().mean()
    28. const learningRate = 1e-3
    29. const optimizer = tf.train.sgd(learningRate)
    30. // 训练模型
    31. for (let i = 0; i < 10000; i++) {
    32. optimizer.minimize(() => loss(f(xs), ys))
    33. }
    34. // 预测
    35. console.log(`a: ${a.dataSync()}, b: ${b.dataSync()}`)
    36. let result= document.getElementById('result')
    37. let str = `a: ${a.dataSync()}`+` b: ${b.dataSync()}`
    38. result.innerHTML = ''+str+''
    39. const preds = f(xs).dataSync()
    40. const trues = ys.arraySync()
    41. preds.forEach((pred, i) => {
    42. console.log(`x: ${i}, pred: ${pred.toFixed(2)}, true: ${trues[i].toFixed(2)}`)
    43. })
    44. }
    45. script>
    46. body>
    47. html>

    更多demo可以访问:TensorFlow.js演示 https://tensorflow.google.cn/js/demos?hl=zh-cn

    参见:

    关于TensorFlow | TensorFlow中文官网

    TensorFlow.js演示 | TensorFlow中文官网

    来自 GDE 李锡涵的简单粗暴 TensorFlow 2 手册

    TensorFlow.js sub API

    Tensorflow in Deep Learning - Easy TensorFlow

  • 相关阅读:
    netfilter编程实例——一个简单的防火墙
    多线程之基础篇(一)
    【AI视野·今日Robot 机器人论文速览 第八十四期】Thu, 7 Mar 2024
    windows系统下mysql的主从复制
    文件上传绕过
    DHT11 数字湿温度传感器的原理和应用范例
    Android一键锁屏,去除锁屏密码
    springboot+vue
    HK32F030MF4P6 TM1650驱动
    【达摩院OpenVI】几行代码,尽享丝滑视频观感
  • 原文地址:https://blog.csdn.net/david_232656/article/details/136483042