0

0

HTML机器学习怎么做?TensorFlow.js的3种入门示例

月夜之吻

月夜之吻

发布时间:2025-07-19 20:18:02

|

719人浏览过

|

来源于php中文网

原创

在html中实现机器学习主要通过tensorflow.js库实现,具有即时性、隐私保护、减轻服务器负担和离线可用等优势。1. 引入tensorflow.js和相关模型库,通过<script>标签加载cdn链接;2. 使用javascript操作tf全局对象,加载预训练模型(如mobilenet)进行图像识别;3. 可在浏览器中定义神经网络结构并调用model.fit()方法训练模型;4. 数据保留在本地,提升隐私安全并减少传输延迟;5. 浏览器端计算降低服务器压力,提高可扩展性;6. 支持离线使用,适用于网络不稳定场景;7. 示例包括图像识别、线性回归训练和文本语义相似度计算,展示了tensorflow.js在浏览器中处理图像、数值和文本数据的能力。

HTML机器学习怎么做?TensorFlow.js的3种入门示例

HTML里做机器学习,主要是通过TensorFlow.js这个库来实现的。它让JavaScript代码可以直接在浏览器端运行机器学习模型,无论是预训练好的模型,还是自己从头训练一个简单的模型,都能搞定。这就像是把过去服务器端才能做的一些复杂计算,直接搬到了用户设备上,感觉挺神奇的。

HTML机器学习怎么做?TensorFlow.js的3种入门示例

在HTML里搞机器学习,核心就是引入TensorFlow.js库,然后用JavaScript去操作它。具体来说,你需要先在HTML文件里通过<script>标签引入TensorFlow.js的CDN链接。接着,在你的JavaScript代码里,就可以使用tf这个全局对象了。你可以用它来加载一个已经训练好的模型,比如一个图像识别模型,然后把用户上传的图片数据喂给它,立刻就能得到识别结果。或者,你也可以定义一个简单的神经网络结构,准备一些数据,然后在浏览器里直接调用model.fit()方法来训练这个模型。整个过程,数据都不需要离开用户的浏览器,对于隐私敏感的应用场景来说,这一点特别重要。

为什么要在HTML里做机器学习?它有什么优势?

我个人觉得,在浏览器里跑机器学习模型,最大的魅力在于它的即时性和隐私保护。想象一下,用户上传一张照片,或者通过摄像头捕捉画面,图像识别的结果几乎是瞬间就能出来,这体验感是服务器端处理很难比拟的。因为数据不用上传到云端,省去了网络传输的时间,响应速度自然快。而且,数据始终留在用户本地,对于一些涉及个人隐私的应用,比如面部识别、手势控制或者一些医疗辅助工具,这种本地化处理方式能大大增强用户的信任感。

立即学习前端免费学习笔记(深入)”;

HTML机器学习怎么做?TensorFlow.js的3种入门示例

另外,它还能显著减轻服务器的负担。如果你的应用有大量的用户同时进行ML推理,把计算任务分摊到每个用户的浏览器上,服务器就不需要承担那么大的计算压力了。这对于降低运营成本,提高服务的可伸缩性,都挺有帮助的。有时候,甚至在没有网络连接的情况下,一些预加载的模型也能继续工作,这对于离线应用场景来说,是个不小的优势。当然,浏览器端的计算能力毕竟有限,对于超大型模型或者需要大量数据训练的场景,可能还是服务器更合适,但这并不妨碍它在很多轻量级应用中大放异彩。

第一个示例:即插即用的图像识别

我们来玩一个最常见的,也是最能直观感受到机器学习威力的例子:图像识别。这里我们用一个预训练好的模型,MobileNet。它已经在大量图片上训练过了,能够识别出上千种不同的物体。

HTML机器学习怎么做?TensorFlow.js的3种入门示例

首先,在HTML里你需要一个<img>标签来显示图片,以及一个<input type="file">来让用户选择图片,或者一个<video>标签来连接摄像头。

Tome
Tome

先进的AI智能PPT制作工具

下载
<!DOCTYPE html>
<html>
<head>
    <title>图像识别示例</title>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/mobilenet"></script>
</head>
<body>
    <input type="file" id="imageUpload">
    <img id="previewImage" style="max-width: 400px; display: block; margin-top: 10px;">
    <p id="predictionResult"></p>

    <script>
        const imageUpload = document.getElementById('imageUpload');
        const previewImage = document.getElementById('previewImage');
        const predictionResult = document.getElementById('predictionResult');
        let model;

        // 异步加载模型
        async function loadMyModel() {
            console.log('正在加载MobileNet模型...');
            model = await mobilenet.load();
            console.log('模型加载完成!');
            predictionResult.innerText = '请选择一张图片进行识别。';
        }

        // 处理图片上传
        imageUpload.addEventListener('change', async (event) => {
            const file = event.target.files[0];
            if (!file) return;

            const reader = new FileReader();
            reader.onload = async (e) => {
                previewImage.src = e.target.result;
                predictionResult.innerText = '正在识别...';

                // 等待图片加载完成,确保其在DOM中可用
                previewImage.onload = async () => {
                    if (model) {
                        const predictions = await model.classify(previewImage);
                        // predictions 是一个数组,包含多个预测结果和置信度
                        if (predictions.length > 0) {
                            predictionResult.innerText = `识别结果:${predictions[0].className} (置信度: ${Math.round(predictions[0].probability * 100)}%)`;
                        } else {
                            predictionResult.innerText = '未能识别出任何物体。';
                        }
                    } else {
                        predictionResult.innerText = '模型尚未加载完成,请稍候。';
                    }
                };
            };
            reader.readAsDataURL(file);
        });

        loadMyModel(); // 页面加载时就去加载模型
    </script>
</body>
</html>

这段代码的核心逻辑是:当页面加载时,异步加载MobileNet模型。用户选择图片后,FileReader会把图片转换成Data URL显示在<img>标签里。一旦图片加载到<img>标签中,我们就可以用model.classify(previewImage)来对这张图片进行识别。mobilenet.classify函数会自动处理图片的预处理(比如缩放、归一化),然后返回一个包含分类结果和置信度的数组。你会发现,整个过程相当流畅,几乎没有延迟。

第二个示例:浏览器里训练一个简单模型

光用预训练模型还不够过瘾,我们试试在浏览器里自己训练一个最简单的模型:线性回归。这就像是给定一些点的坐标,让模型学会预测下一个点的Y值。

<!DOCTYPE html>
<html>
<head>
    <title>简单线性回归训练</title>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
</head>
<body>
    <p>训练状态: <span id="status">准备中...</span></p>
    <p>损失值: <span id="lossValue">N/A</span></p>
    <button id="trainButton">开始训练</button>

    <script>
        const statusSpan = document.getElementById('status');
        const lossValueSpan = document.getElementById('lossValue');
        const trainButton = document.getElementById('trainButton');

        async function trainModel() {
            statusSpan.innerText = '正在生成数据...';
            // 准备一些训练数据
            // 我们希望模型学习到 y = 2x + 1 这样的关系
            const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]); // 输入特征
            const ys = tf.tensor2d([3, 5, 7, 9], [4, 1]); // 对应的标签

            statusSpan.innerText = '正在创建模型...';
            // 创建一个简单的线性模型
            const model = tf.sequential();
            model.add(tf.layers.dense({ units: 1, inputShape: [1] })); // 一个输入,一个输出的密集层

            statusSpan.innerText = '正在编译模型...';
            // 编译模型:指定优化器和损失函数
            model.compile({
                optimizer: tf.train.sgd(0.01), // 使用随机梯度下降优化器,学习率0.01
                loss: 'meanSquaredError' // 使用均方误差作为损失函数
            });

            statusSpan.innerText = '开始训练模型...';
            // 训练模型
            await model.fit(xs, ys, {
                epochs: 500, // 训练500个周期
                callbacks: {
                    onEpochEnd: (epoch, logs) => {
                        lossValueSpan.innerText = logs.loss.toFixed(6);
                        statusSpan.innerText = `训练中... Epoch ${epoch + 1}/500`;
                    }
                }
            });

            statusSpan.innerText = '训练完成!';
            // 训练完成后,尝试用模型进行预测
            const testX = tf.tensor2d([5], [1, 1]);
            const prediction = model.predict(testX);
            const predictedValue = prediction.dataSync()[0]; // 获取预测结果
            statusSpan.innerText += ` 预测 x=5 时 y 的值为: ${predictedValue.toFixed(2)}`;

            // 清理内存
            xs.dispose();
            ys.dispose();
            testX.dispose();
            prediction.dispose();
        }

        trainButton.addEventListener('click', trainModel);
    </script>
</body>
</html>

在这个例子里,我们手动定义了一组简单的输入xs和对应的输出ys,它们之间存在一个简单的线性关系(y = 2x + 1)。然后,我们创建了一个只有一个dense层的顺序模型,这层只有一个单元,正好可以用来学习线性关系。接着,我们用model.compile配置了优化器(SGD,随机梯度下降)和损失函数(均方误差),这些都是机器学习训练的基础。最后,model.fit函数启动了训练过程。在训练过程中,onEpochEnd回调函数会更新页面的损失值,让你能实时看到模型学习得怎么样。训练结束后,我们用一个新值(x=5)来测试模型,看看它预测的y值是否接近11。这种实时反馈的训练过程,在浏览器里看真的很有趣。

第三个示例:处理文本的魔法——文本嵌入

除了图像和数值数据,TensorFlow.js在处理文本方面也相当强大。这里我们介绍一个概念:文本嵌入(Text Embedding)。简单来说,就是把文字转换成一系列数字(向量),这些数字能够捕捉到文字的语义信息。意思相近的词或句子,它们的向量在多维空间中会比较接近。这对于理解文本内容,做文本相似度分析,甚至情感分析都非常有用。我们使用@tensorflow-models/universal-sentence-encoder这个预训练模型。

<!DOCTYPE html>
<html>
<head>
    <title>文本嵌入与相似度</title>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder"></script>
</head>
<body>
    <textarea id="text1" rows="4" cols="50">我爱机器学习</textarea><br>
    <textarea id="text2" rows="4" cols="50">我喜欢人工智能</textarea><br>
    <button id="compareButton">计算相似度</button>
    <p>相似度: <span id="similarityResult">N/A</span></p>

    <script>
        const text1Input = document.getElementById('text1');
        const text2Input = document.getElementById('text2');
        const compareButton = document.getElementById('compareButton');
        const similarityResult = document.getElementById('similarityResult');
        let useModel; // Universal Sentence Encoder 模型

        async function loadUseModel() {
            console.log('正在加载Universal Sentence Encoder模型...');
            useModel = await use.load();
            console.log('模型加载完成!');
            compareButton.disabled = false; // 模型加载完成后启用按钮
        }

        // 计算两个向量的余弦相似度
        function cosineSimilarity(vecA, vecB) {
            const dotProduct = vecA.dot(vecB).dataSync()[0];
            const normA = vecA.norm().dataSync()[0];
            const normB = vecB.norm().dataSync()[0];
            return dotProduct / (normA * normB);
        }

        compareButton.addEventListener('click', async () => {
            if (!useModel) {
                similarityResult.innerText = '模型尚未加载,请稍候。';
                return;
            }

            const sentence1 = text1Input.value;
            const sentence2 = text2Input.value;

            if (!sentence1 || !sentence2) {
                similarityResult.innerText = '请输入两段文本。';
                return;
            }

            similarityResult.innerText = '正在计算...';

            // 将句子编码为嵌入向量
            const embeddings = await useModel.embed([sentence1, sentence2]);
            const embedding1 = embeddings.slice([0, 0], [1, embeddings.shape[1]]);
            const embedding2 = embeddings.slice([1, 0], [1, embeddings.shape[1]]);

            // 计算相似度
            const similarity = cosineSimilarity(embedding1, embedding2);
            similarityResult.innerText = `相似度: ${similarity.toFixed(4)}`;

            // 清理内存
            embeddings.dispose();
            embedding1.dispose();
            embedding2.dispose();
        });

        loadUseModel(); // 页面加载时加载模型
        compareButton.disabled = true; // 默认禁用按钮直到模型加载完成
    </script>
</body>
</html>

这个例子展示了如何利用预训练的Universal Sentence Encoder模型来计算两段文本的语义相似度。我们首先加载了@tensorflow-models/universal-sentence-encoder模型。当用户点击按钮时,我们获取两个文本框的内容,然后调用useModel.embed([sentence1, sentence2])来获取它们的嵌入向量。这些向量是高维的数字数组,代表了句子的语义。最后,我们通过计算这两个向量的余弦相似度来衡量它们在语义上的接近程度。余弦相似度的值通常在-1到1之间,越接近1表示越相似。你会发现,即使句子结构不同,只要表达的意思相近,相似度也会很高。这在做智能客服、内容推荐或者抄袭检测时,都有很强的应用潜力。

总的来说,TensorFlow.js打开了一扇门,让前端开发者也能直接在浏览器里玩转机器学习。它降低了门槛,也拓宽了机器学习的应用场景,挺有意思的。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

531

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

576

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

6230

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

492

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

240

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

303

2023.09.21

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5.1万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号