分析开源机器学习框架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 模块:

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

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

<video width=400 height=300></video>
<p></p>
<img width=400 height=300 />

3. 我们通过 JavaScript ,将对应的 HTML 元素进行初始化:videoimagestatus 三个变量分别用来对应 <video><img><p> 三个 HTML 元素,canvas 和 ctx 用来做从摄像头获取视频流数据的中转存储。model 将用来存储我们从网络上加载的 MobileNet:

    const video = document.querySelector('video')
    const image = document.querySelector('img')
    const status = document.querySelector("p")

    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')

    let model

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

async function main () {
        status.innerText = "Model loading..."
        model = await mobilenet.load()
        status.innerText = "Model is loaded!"

        const stream = await navigator.mediaDevices.getUserMedia({ video: true })
        video.srcObject = stream
        await video.play()
        
        canvas.width = video.videoWidth
        canvas.height = video.videoHeight

        refresh()
    }

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

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

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

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>tensorflow demo</title>
    <script src="https://unpkg.com/@tensorflow/tfjs"></script>
    <script src="https://unpkg.com/@tensorflow-models/mobilenet"> </script>
</head>

<body>
	<div>
		<video width=400 height=300></video>
		<p></p>
		<img width=400 height=300 />
	</div>

<script>
    const video = document.querySelector('video')
    const image = document.querySelector('img')
    const status = document.querySelector("p")

    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')

    let model

    main()

    async function main () {
        status.innerText = "Model loading..."
        model = await mobilenet.load()
        status.innerText = "Model is loaded!"

        const stream = await navigator.mediaDevices.getUserMedia({ video: true })
        video.srcObject = stream
        await video.play()
        
        canvas.width = video.videoWidth
        canvas.height = video.videoHeight

        refresh()
    }

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

</script>

</body>
</html>

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

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

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>tensorflow demo</title>

    <script src="http://unpkg.com/@tensorflow/tfjs/dist/tf.min.js"></script>

</head>
<body>
	<div>
	    <p id="result"></p>
	</div>

<script>
window.onload = function(){
    const xsRaw = tf.tensor([2013, 2014, 2015, 2016, 2017])
    const ysRaw = tf.tensor([12000, 14000, 15000, 16500, 17500])

    // 归一化
    const xs = xsRaw.sub(xsRaw.min())
                    .div(xsRaw.max().sub(xsRaw.min()))
    const ys = ysRaw.sub(ysRaw.min())
                    .div(ysRaw.max().sub(ysRaw.min()))

    const a = tf.scalar(Math.random()).variable()
    const b = tf.scalar(Math.random()).variable()

    // y = a * x + b.
    const f = (x) => a.mul(x).add(b)
    const loss = (pred, label) => pred.sub(label).square().mean()

    const learningRate = 1e-3
    const optimizer = tf.train.sgd(learningRate)

    // 训练模型
    for (let i = 0; i < 10000; i++) {
        optimizer.minimize(() => loss(f(xs), ys))
    }

    // 预测
    console.log(`a: ${a.dataSync()}, b: ${b.dataSync()}`)
	let result= document.getElementById('result')
	let str = `a: ${a.dataSync()}`+` b: ${b.dataSync()}`
    result.innerHTML = '<span>'+str+'</span>'
    const preds = f(xs).dataSync()
    const trues = ys.arraySync()
    preds.forEach((pred, i) => {
        console.log(`x: ${i}, pred: ${pred.toFixed(2)}, true: ${trues[i].toFixed(2)}`)
    })
}
</script>
</body>
</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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432242.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发系列(十六)·事件传参·data-*自定义数据

事件传参&#xff1a;在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参。 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成业务逻辑的开发。 在组件上通过data-"的方式定义需要传递的数据,其…

大屏 超宽屏自适应最优解决方案(transform:scale)

问题引入&#xff1a; 可视化数据大屏需要适配各种大屏尺寸 1080P&#xff1a;1920*1080 2K&#xff1a;2560*1440 左右 4K&#xff1a;3840*2160 左右 8K&#xff1a;7680*4320 左右 ① 大屏使用rem 耗时 而且对浏览器最小字体不支持&#xff0c; ② 使用transform:scale可以…

【unity】shader优化总结-转载

分为三个部分&#xff1a;Unity官方文档&#xff0c;GDC&#xff0c;个人经验。 Unity Manual 1.计算量优化。着色器进行的计算和处理越多&#xff0c;对性能的影响越大。针对不影响最终效果但依然进行计算的无效代码&#xff0c;进行移除操作。计算的频率也会影响游戏的性能…

《操作系统真相还原》读书笔记四:安装nasm

下载链接&#xff1a;https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/ 下载-解压-安装 tar zxvf nasm-2.13.03.tar.gz ./configure --prefix/home/truthos/nasm/toolchain/make && makeinstall执行make install export PATH/home/truthos/nasm/toolchain/bin:…

用自适应K-Means的差分进化算法解决有容量的电动汽车(EV)路由问题(2023)

Solving the Capacitated Electric Vehicle (EV) Routing Problem by The Differential Evolutionary Algorithm with Adaptive K-Means 摘要 本文旨在解决限制电能和工作量的路由问题&#xff0c;称为电容式电动汽车路由问题&#xff08;CEVRP&#xff09;。这个问题的目的是…

《 前端挑战与未来:如何看待“前端已死”》

在技术领域,时常会有一些激进的言论引发热议,比如近年来不少人声称“前端已死”。这样的言论引发了广泛的讨论和反思。本文将从几个方向探讨这个话题:为什么会出现“前端已死”的言论、如何看待这种说法、前端技术的未来发展趋势以及前端人如何应对这场职位突围战。 为什么会…

代码训练LeetCode(1)合并有序数组详解

代码训练(1)LeetCode之合并两个有序数组 Author: Once Day Date: 2024年3月5日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) …

【BUG】Windows状态栏总卡死解决办法

屋漏偏逢连夜雨&#xff0c;正在赶deadline呢&#xff0c;Windows状态老卡死&#xff0c;一时间崩溃。 解决办法&#xff1a; 右键状态栏新闻和咨询关掉 这个烧笔新闻与资讯我真服了

Ubantu 18.04 如何映射IP到公网,外网可以访问

介绍一种简单的方式&#xff0c;就是通过路由侠 inux 系统安装路由侠&#xff0c;可通过两种方式进行&#xff0c;一种是通过直接脚本安装&#xff0c;一种是通过 Docker 安装。 windows下载地址&#xff1a;路由侠-局域网变公网 方式一&#xff1a;通过脚本安装 1、获取安…

赵珊珊Go语言汇编视频课程

本课程由赵珊珊老师倾情打造&#xff0c;旨在深入解析Go语言与汇编语言结合的高级主题。学员将系统学习Go语言底层实现原理&#xff0c;掌握汇编代码优化技巧&#xff0c;为高性能、高并发应用开发奠定坚实基础&#xff0c;助力学员在软件工程领域取得更大成功。 课程大小&…

Ajax+Axios+前后端分离+YApi+Vue-ElementUI组件+Vue路由+nginx【全详解】

目录 一.Ajax技术 二. Axios 三.前后台分离开发介绍 四. YAPI 五.前端工程化 六.vue工程的目录结构 七.Vue项目核心文件 八.Vue组件库ElementUI AboutView.vue最终代码 AboutView.vue最终代码 九.Vue路由 十.案例 十一.nginx介绍 一.Ajax技术 1.Ajax概述 Ajax: 全…

excel 动态列导出

excel动态列&#xff0c;只好用poi来写了&#xff0c;也并不复杂&#xff0c;一样就这个件事情抽像为几步&#xff0c;就是套路了&#xff0c;开发效率就上去了。 1 准备空模板 导出操作与excel模板的导出一样&#xff0c;可以参考excel导出标准化 2 自定义SheetWriteHandler …

Redis面试问题纯享版

基础内容 1、简单介绍以下你了解的Redis 2、对比一下Redis和Memcache的异同&#xff1f; 3、为什么MySQL选用Redis作为缓存&#xff1f; 4、详细聊聊你对Redis各种数据类型的了解&#xff1f; 5、Redis中五种基本数据类型的底层数据结构是什么样的&#xff1f; Redis线程模型…

图书推荐|Word文稿之美

让你的文档从平凡到出众&#xff01; 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧&#xff0c;再到快速修正错误和保护文件&#xff0c;全面系统地讲解数字排版的技术和能力&…

【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee

目录 1. 编译器 gcc 1.1 背景知识 1.2 gcc如何完成 2.1 Makefile背景 2.2 Makefile原理 2.3 Makefile常用符号 3. 模拟倒计时 4. 模拟进度条 5. 使用 git 命令行 5.1 安装 git 5.2 创建项目下载到本地 5.3 推送本地代码到远端仓库 1. 编译器 gcc 1.1 背景知识 预处…

stm32学习笔记:I2C通信外设原理(未完)

软件实现和硬件实现 串口通信为异步时序&#xff0c;用软件实现很麻烦&#xff0c;基本上用硬件实现 而I2C协议通信为同步时序&#xff0c;软件实现简单且灵活&#xff0c;硬件实现比较麻烦&#xff0c;故软件比较常用 但I2C硬件实现功能比较大&#xff0c;执行效率高&#xff…

Electron-builder打包安装包——编译篇

突然有一天想打包个桌面程序&#xff0c;没有打包过&#xff0c;经过九牛二虎之力终于打包出来&#xff0c;在此感谢那些热于分享的前辈&#xff01; 本篇只讲打包运行和出现的问题 一、准备工作&#xff1a;提前下载相关资源包&#xff0c;否则在国内环境下可能因为网络问题…

python+django_vue旅游酒店预订出行订票系统pycharm项目lw

a.由于对管理信息方面的内容了解尚浅且没有足够的经验&#xff0c;因而很难对数据庞大的线上旅行信息管理系统建立完善的数据库。 b.线上旅行信息管理系统拥有很大的信息量&#xff0c;其中包括数据库的前期开发和后期更新&#xff0c;因此对数据库的安全性&#xff0c;一致性和…

【Java】CAP理论以及它的实际应用案例

目录 简介 不是所谓的“3 选 2” CAP 实际应用案例 总结 CAP 理论/定理起源于 2000年&#xff0c;由加州大学伯克利分校的Eric Brewer教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP定理又被称作 布鲁尔定理&#xff08;Brewer’s the…

html标签之表格标签,程序员必看

突破困境&#xff1a; 1. 提升学历 前端找工作&#xff0c;学历重要吗&#xff1f; 重要。谁要是告诉你不重要那一定是在骗你。现实情况是大专吃紧&#xff0c;本科够用&#xff0c;硕士占优&#xff0c;大专以下找到工作靠运气和 戳这里领取完整开源项目&#xff1a;【一线大…