TensorFlow.js入门(一)一维向量的学习

简介: TensorFlow的介绍  TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。

TensorFlow的介绍

  TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。
  TensorFlow是一个著名的开源的人工智能系统,被广泛应用于语音识别或图像识别等多项机器学习和深度学习领域。它目前支持的程序语言有: Java, Python, Go, Lua, R, JavaScript, 其中2018年3 月 31 日 ,TensorFlow 宣布增加支持 JavaScript,并推出开源库 TensorFlow.js 。
  我们将会介绍在前端开发中TensorFlow的相关内容,即TensorFlow.js的学习与应用。

Tensorflow中的一维向量及其运算

  tensor 是 TensorFlow.js 的数据中心单元:由一组数值组成的一维或多维数组。在 TensorFlow.js中,一维向量的构造函数主要为:tf.tensor()和tf.tensor1d(),具体的API文档可以参考:https://js.tensorflow.org/api/0.12.0/
  可以用set()和get()函数分别获取和设置向量中的元素值。
  一维向量的运算函数有很多,说明如下:

  • tf.add() 两个向量的对应元素的和
  • tf.sub() 两个向量的对应元素的差
  • tf.mul() 两个向量的对应元素的乘积
  • tf.div() 两个向量的对应元素的商
  • tf.maximum() 两个向量的对应元素的最大值
  • tf.minimum() 两个向量的对应元素的最小值
  • tf.pow() 两个向量的对应元素的幂

以上只是一部分,还有更多的函数如: tf.abs(), tf.sin(), tf.cos(), tf.tan(), tf.tan()等。

简单例子

  在网页中引入TensorFlow.js需要添加“script”标签,如下:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script>

  我们通过一个小小的例子,来说明在TensorFlow.js中一维向量的使用方法,其完整的HTML代码如下:

<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script>
    <!-- Place your code in the script tag below.-->
    <script>
        function show(){
            var a = [1,2,3,4,5];
            var b = [2,3,4,5,6];
            const vector1 = tf.tensor(a);
            const vector2 = tf.tensor(b);
            const res = vector2.add(vector1);
            document.getElementById("first_element").innerHTML = "第一个元素为" + res.get(0)+ ".";
            document.getElementById("whole_array").innerHTML = "向量:"+res;
        }   
    </script>

  </head>

  <body>
  <p id="first_element"></p>
  <p id="whole_array"></p>
  <button onclick="show()" id="show" value="show">show</button>
  </body>

</html>

显示的网页如下图:



实战

  在刚才的例子中,我们仅仅只给出了一个简单的例子,那么,如果要实现稍微复杂一点的功能呢,比如下面的网页:




  我们可以用TensorFlow.js来实现这些向量运算。该网页的完整的HTML代码如下:

<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script src="tf_result.js"></script>
  </head>

<body>
    <center>
    <h2>TensorFlow向量(一维)学习</h2>
    <br><br>
    <div style="width:600px">

        <div>
            <label class="col-sm-2 control-label">向量运算</label>
            <div class="col-sm-10">
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="add" checked="checked"></label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline"  value="sub"></label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="mul"></label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="div"></label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="max"> max
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="min"> min
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="abs"> abs
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="sin"> sin
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="cos"> cos
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="tan"> tan
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="exp"> exp
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="log"> log
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="sqrt"> sqrt
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="square"> square
                </label>
                <label class="radio-inline">
                <input type="radio" name="optionsRadiosinline" value="cubic"> cubic
                </label>
                <br><br>
            </div>
        </div>

        <div>
            <label for="vector1" class="col-sm-2 control-label">向量1</label>
            <div class="col-sm-10">
            <input type="text" class="form-control" id="vector1" placeholder="向量1">
            <br>
            </div>

        </div>

        <div>
            <label for="vector2" class="col-sm-2 control-label">向量2</label>
            <div class="col-sm-10">
            <input type="text" class="form-control" id="vector2" placeholder="向量2">
            <br>
            </div>
        </div>

        <div >
            <div class="col-sm-offset-2 col-sm-10">
            <button class="btn btn-default" id="result">显示结果</button>
            <button class="btn btn-default" id="clc">清空</button>
            </div>
        </div>

    </div>

    <table class="table" style="width:600px">
        <caption id="tf">运行结果</caption>
        <tbody>
            <tr class="success" id="table">
            </tr>
        </tbody>
    </table>

    </center>
</body>
</html>

在其中我们用到了tf_result.js,其完整的JavaScript代码如下:

$(document).ready(function(){

    var flag; 
    /*
    flag = 1表示一元运算
    flag = 2表示二元运算
    */

    // 清空两个输入框的输入
    $("#clc").click(function(){
        $("#vector1").val("");
        $("#vector2").val("");
    });

    // 是否允许"向量2"输入框有输入
    $("#vector1").click(function(){
        var op = $("input[name='optionsRadiosinline']:checked").val();
        var ops = ["add", "sub", "mul", "div", "max", "min"];
        if (ops.indexOf(op) == -1)
            flag = 1;
        else
            flag = 2;

        //文本框"向量2"禁用
        if(flag == 1){
            $("#vector2").val("");
            $("input[type='text']").each(function () {
            $("#vector2").attr("disabled", true);
            });

        }
        //文本框"向量2"启用
        if(flag == 2){
            $("input[type='text']").each(function () {
            $("#vector2").attr("disabled", false);
            });
        }
    });

    // 利用tensorflow.js的运算函数,输出计算结果
    $("#result").click(function(){

        if(flag == 1){
            var vector1 = $("#vector1").val().split(',').map(Number);
        }
        if(flag == 2){
            var vector1 = $("#vector1").val().toString().split(',').map(Number);
            var vector2 = $("#vector2").val().toString().split(',').map(Number);
            if(vector1.length != vector2.length)
                alert("输入的两个向量长度不一样");
        }

        // 利用tensorflow.js的运算函数
        if( flag == 1 || ((flag == 2) && (vector1.length == vector2.length))){
            var op = $("input[name='optionsRadiosinline']:checked").val();
            const pow2 = tf.tensor(2).toInt(); // 计算平方
            const pow3 = tf.tensor(3).toInt(); // 计算三次方

            switch (op) // JavaScript的switch结构
            {
                case "add":  // 加法
                    res = tf.tensor(vector1).add(tf.tensor(vector2));
                    break;
                case "sub":  // 减法
                    res = tf.tensor(vector1).sub(tf.tensor(vector2));
                    break;
                case "mul":  // 乘法
                    res = tf.tensor(vector1).mul(tf.tensor(vector2));
                    break;
                case "div":  // 除法
                    res = tf.tensor(vector1).div(tf.tensor(vector2));
                    break;
                case "max":  // 两个向量中的最大值,element-wise
                    res = tf.tensor(vector1).maximum(tf.tensor(vector2));
                    break;
                case "min":  // 两个向量中的最小值,element-wise
                    res = tf.tensor(vector1).minimum(tf.tensor(vector2));
                    break;
                case "abs":  // 绝对值
                    res = tf.tensor(vector1).abs();
                    break;
                case "sin":  // 正弦函数
                    res = tf.tensor(vector1).sin();
                    break;
                case "cos":  // 余弦函数
                    res = tf.tensor(vector1).cos();
                    break;
                case "tan":  // 正切函数
                    res = tf.tensor(vector1).tan();
                    break;
                case "exp":  // 指数函数,以e为底
                    res = tf.tensor(vector1).exp();
                    break;
                case "log":  // 对数函数,以e为底
                    res = tf.tensor(vector1).log();
                    break;
                case "sqrt":  // 平方根
                    res = tf.tensor(vector1).sqrt();
                    break;
                case "square":  // 平方
                    res = tf.tensor(vector1).pow(pow2);
                    break;
                case "cubic":  // 三次方
                    res = tf.tensor(vector1).pow(pow3);
                    break;
                default:
                    res = tf.tensor([]);
            }


            $("#table").html(""); // 清空原有表格中的数据
            // 输入计算结果
            for(var i=0; i< res.shape; i++){
                $("tr").append("<td>"+res.get(i)+"</td>;");
            }
        }

    });

});

  运行刚才的网页,效果如下:




  怎么样,是不是觉得TensorFlow.js也酷酷的呢?结合TensorFlow.js以及前端网页方面的知识,我们可以给出许多酷炫的TensorFlow的应用,以后我们会慢慢讲到。本次项目的Github地址为:https://github.com/percent4/tensorflow_js_learning

注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
30天前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
232 2
|
10天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
10天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
17 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
19天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
50 10
|
1月前
|
JavaScript
js学习--制作猜数字
js学习--制作猜数字
37 4
js学习--制作猜数字
|
1月前
|
JavaScript
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
这篇文章介绍了如何将webpack的配置文件分离成开发环境和生产环境的配置文件,以提高打包效率。
46 1
webpack学习五:webpack的配置文件webpack.config.js分离,分离成开发环境配置文件和生产环境配置文件
|
16天前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
30天前
|
人工智能 前端开发 JavaScript
前端大模型入门(二):掌握langchain的核心Runnable接口
Langchain.js 是 Langchain 框架的 JavaScript 版本,专为前端和后端 JavaScript 环境设计。最新 v0.3 版本引入了强大的 Runnable 接口,支持灵活的执行方式和异步操作,方便与不同模型和逻辑集成。本文将详细介绍 Runnable 接口,并通过实现自定义 Runnable 来帮助前端人员快速上手。
|
1月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
1月前
|
JavaScript
js学习--制作选项卡
js学习--制作选项卡
37 4

热门文章

最新文章