”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 连接机器学习与 TensorFlow:从 Python 到 JavaScript

连接机器学习与 TensorFlow:从 Python 到 JavaScript

发布于2024-11-01
浏览:740

Bridging Machine Learning with TensorFlow: From Python to JavaScript

使用 TensorFlow 将机器学习带入生活

作为一名 JavaScript 开发人员,深入研究机器学习并不像看起来那么令人畏惧。虽然在技术上可以使用 Node.js 包处理所有事情,但 Python ML 生态系统太丰富且完善,不容忽视。另外,Python 的使用起来非常方便。因此,使用 Python 来处理后端的繁重工作是有意义的。准备好模型后,您可以将其导出为前端友好的格式并将其加载到客户端上以运行预测。

生成模型

在这篇文章中,我们将建立一个模型,根据 Twitter 粉丝数量来预测艺术家的受欢迎程度。

第一步是获取数据集。对于此项目,我们将使用如下所示的 arts.csv 文件:

twitter_followers,popularity,handle
111024636,94,justinbieber
107920365,91,rihanna
106599902,89,katyperry
95307659,97,taylorswift13
66325495,87,selenagomez
66325135,71,selenagomez
60943147,83,jtimberlake
54815915,82,britneyspears
53569307,85,shakira

正如您所看到的,这里有两个关键值:twitter_followers 和受欢迎度。这很好地为我们建立了序列模型,其中 x 将是 twitter_followers,y 将是流行度。

序列模型是构建模型最简单的选项之一。虽然选择最终取决于具体的用例,但我现在保持简单并坚持使用这种方法。

构建后端

当您构建模型时,您需要解决一些基本任务:

  • 清理或标准化数据
  • 将数据分为训练(80%)和测试(20%)
  • 选择模型以及优化器和损失函数等设置
  • 训练模型(拟合)
  • 评估模型
  • 保存模型

下面的代码让您对这些任务有一个很好的概述,尽管它不是完整的图片。你可以在Github上查看完整代码。

Python:TensorFlow 入门

def get_model(x, y):
    x_normalized = layers.Normalization(
        axis=None,
    )
    x_normalized.adapt(np.array(x))

    model = tensorflow.keras.Sequential([x_normalized, layers.Dense(units=1)])

    model.compile(
        optimizer=tensorflow.keras.optimizers.Adam(learning_rate=0.1),
        loss="mean_squared_error",
    )

    model.fit(
        x,
        y,
        epochs=2,
        verbose=0,
        validation_split=0.2,
    )

    return model

def main:
  train_features, test_features, train_labels, test_labels = split_data(dataset)

  model = get_model(
      train_features["twitter_followers"],
      train_labels,
  )

  test_loss = model.evaluate(
      test_features["twitter_followers"], test_labels, verbose=2
  )

  model.export("./saved_model")

如您所见,Python 代码非常简单。有一个主要函数处理数据的分割、获取模型、评估它,最后保存它。

简而言之,这些是创建模型的基本步骤。但让我们面对现实吧:建立一个真正有效的模型既是一门艺术,也是一门科学。我的目标只是展示 Python 入门是多么容易。然而,要创建一个性能良好的模型,需要做很多工作,比如拥有可靠的数据集、清理和规范化数据、选择正确的模型和设置,以及拥有训练它的计算能力。所有这些任务都需要大量的时间和精力投入!

在前端使用模型

现在我们已经训练并保存了模型,是时候将其引入前端了。在这一步中,我们将以网络友好的格式加载模型,以便我们可以直接在浏览器中运行预测。无论您使用 TensorFlow.js 还是其他库,将机器学习集成到您的 Web 应用程序中都会打开一个充满可能性的世界。让我们深入探讨如何做到这一点!

TensorFlow 提供了一个名为 tensorflowjs_converter 的 npm 包,可帮助将保存的模型转换为 JSON 和二进制文件。

tensorflowjs_converter --input_format=tf_saved_model model/saved_model out/public
  • tf_saved_model:这是用于保存模型的格式。
  • model/saved_model:这是执行Python代码时保存模型的目录。
  • out/public:这是保存前端友好文件的输出目录。文件夹结构将如下所示:
ls -la out/public

group1-shard1of1.bin
model.json

此设置可以轻松访问 Web 应用程序所需的文件。

JavaScript:使用 TensorFlowJS

完整代码可以在Github上查看。

const model = await tensorflow.loadGraphModel("model.json");

const getPopularity = (followers) => {
  const followers = 1_000;
  const normalized = followers;
  const x = tensorflow.tensor(normalized).reshape([-1, 1]);

  const result = model.predict(x);
  const values = result.arraySync();

  const y = values[0][0].toFixed(2) * 100;
  const popularity = y;

  return popularity;
};

如前所述,该模型旨在根据 Twitter 关注者数量“预测受欢迎程度”。虽然它看起来像是一个简单的示例,但它有效地演示了如何在后端生成模型并在前端使用它。

稍微看一下getPopularity是如何处理输入的,但关键一行是model.predict(x),它使用模型根据输入x预测一个值(y)。

前往演示页面并尝试一些 Twitter 手柄。这是一种有趣的方式来了解模型如何根据关注者数量预测受欢迎程度。

结论

TensorFlow 是一个很棒的库,为后端和前端开发提供工具。任何 JavaScript 开发人员都可以深入使用 Python 或类似语言创建模型,然后轻松将该模型导入前端以运行预测。

虽然机器学习是一个广阔的领域,需要大量知识,但 TensorFlow 等工具有助于弥合软件和机器学习开发人员之间的差距。对于那些希望将 ML 融入到他们的项目中的人来说,这让旅程变得更加顺利!

版本声明 本文转载于:https://dev.to/garciadiazjaime/bridging-machine-learning-with-tensorflow-from-python-to-javascript-25hp?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-05-17
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确预期操作结果的火灾和...
    编程 发布于2025-05-17
  • Java的Map.Entry和SimpleEntry如何简化键值对管理?
    Java的Map.Entry和SimpleEntry如何简化键值对管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    编程 发布于2025-05-17
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-05-17
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-05-17
  • 为什么我会收到MySQL错误#1089:错误的前缀密钥?
    为什么我会收到MySQL错误#1089:错误的前缀密钥?
    mySQL错误#1089:错误的前缀键错误descript [#1089-不正确的前缀键在尝试在表中创建一个prefix键时会出现。前缀键旨在索引字符串列的特定前缀长度长度,可以更快地搜索这些前缀。了解prefix keys `这将在整个Movie_ID列上创建标准主键。主密钥对于唯一识别...
    编程 发布于2025-05-17
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-17
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-17
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-05-17
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-05-17
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-05-17
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-05-17
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-05-17
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-17
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-17

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3