深度学习神经网络实战:多层感知机,手写数字识别

目的

利用tensorflow.js训练模型,搭建神经网络模型,完成手写数字识别

设计

简单三层神经网络

  • 输入层
    28*28个神经原,代表每一张手写数字图片的灰度
  • 隐藏层
    100个神经原
  • 输出层
    -10个神经原,分别代表10个数字

代码

// 导入 TensorFlow.js 库
import tf from "@tensorflow/tfjs";
import * as tfjsnode from "@tensorflow/tfjs-node";
import * as tfvis from "@tensorflow/tfjs-vis";
import fs from "fs";
import plot from "nodeplotlib";
// 定义模型
const model = tf.sequential();// 添加输入层
model.add(tf.layers.dense({ units: 64, inputShape: [784], activation: "relu" })
);// 添加隐藏层
model.add(tf.layers.dense({ units: 100, activation: "relu" }));// 添加输出层
model.add(tf.layers.dense({ units: 10, activation: "softmax" }));// 编译模型
model.compile({optimizer: "sgd",loss: "categoricalCrossentropy",metrics: ["accuracy"],
});
const trainDataLen = 3000;
const testDataLen = 2000;// 加载 MNIST 数据集
import pkg from "mnist";
const { set: Dataset } = pkg;
const set = Dataset(trainDataLen, testDataLen);
const trainingSet = set.training;
const testSet = set.test;const trainXs = [];
const testXs = [];const trainLabels = [];
const testLabels = [];for (let i = 0; i < trainingSet.length; i++) {trainXs.push(trainingSet[i].input);trainLabels.push(trainingSet[i].output.indexOf(1));
}for (let i = 0; i < testSet.length; i++) {testXs.push(testSet[i].input);testLabels.push(testSet[i].output.indexOf(1));
}// 准备数据
const trainXsTensor = tf.tensor(trainXs, [trainDataLen, 784]);
const trainYsOneHot = tf.oneHot(trainLabels, 10);//记录每轮模型训练中的损失和精度,为了绘制曲线图
var accPlot = [];
var lossPlot = [];// 模型训练
model.fit(trainXsTensor, trainYsOneHot, {batchSize: 64,epochs: 100,validationSplit: 0.2,callbacks: {onEpochBegin: (epoch) => console.log(`Epoch ${epoch + 1} started...`),onEpochEnd: async (epoch, logs) => {console.log(`Epoch ${epoch + 1} completed. Loss: ${logs.loss.toFixed(3)}, Accuracy: ${logs.acc.toFixed(3)}`);//记录loss和acc,绘制曲线图accPlot.push(logs.acc.toFixed(3));lossPlot.push(logs.loss.toFixed(3));await tf.nextFrame(); // 防止阻塞},onBatchEnd: async (batch, logs) => {console.log(`Batch ${batch} completed. Loss: ${logs.loss.toFixed(3)}, Accuracy: ${logs.acc.toFixed(3)}`);await tf.nextFrame(); // 防止阻塞},},}).then((history) => {console.log("Training completed!", history);//绘制模型训练过程中的损失函数和模型精度曲线变化const epochs = Array.from({ length: lossPlot.length }, (_, i) => i + 1);plot.plot([{ x: epochs, y: lossPlot, name: "Loss" },{ x: epochs, y: accPlot, name: "Accuracy" },],{filename: "loss_acc.png",});//模型评估const testXsTensor = tf.tensor(testXs, [testDataLen, 784]);const testYsOneHot = tf.oneHot(testLabels, 10);const result = model.evaluate(testXsTensor, testYsOneHot);const testLoss = result[0].dataSync()[0];const testAccuracy = result[1].dataSync()[0];console.log(`Test loss: ${testLoss.toFixed(3)}`);console.log(`Test accuracy: ${testAccuracy.toFixed(3)}`);//保存模型model.save("file://./my-model").then(() => {console.log("Model saved!");});});

package.json

{"name": "neural_network","version": "1.0.0","description": "","type": "module","main": "mlpTest.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1",},"author": "","license": "ISC","dependencies": {"@tensorflow/tfjs": "^4.17.0","@tensorflow/tfjs-node": "^4.17.0","@tensorflow/tfjs-vis": "^1.0.0","mnist": "^1.1.0","nodeplotlib": "^0.7.7"},"devDependencies": {"@babel/core": "^7.0.0","@babel/preset-env": "^7.0.0","babel-loader": "^8.0.0","webpack": "^5.0.0","webpack-cli": "^4.0.0"}
}

模型结果

模型精度

损失函数与模型精度变化

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 的盒模型

CSS 的盒模型 在HTML里&#xff0c;每一个元素就相当于是一个矩形的 “盒子” &#xff0c;这个盒子由以下这几个部分构成&#xff1a;1.边框border&#xff0c;2.内容content&#xff0c;3.内边距padding&#xff0c;4.外边距margin 边框border 基础属性描述border-width粗…

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…

新的一年,如何优化企业库存管理?

随着社会的发展和经济的不断增长&#xff0c;库存管理成为了企业运营中非常重要的一环。库存作为企业的资产之一&#xff0c;直接影响着企业的盈利能力和竞争优势。因此&#xff0c;对企业库存进行科学的分析和管理&#xff0c;成为了确保企业持续稳定发展的必要手段之一。企业…

设计模式(十) - 工厂方式模式

前言 在此前的设计模式&#xff08;四&#xff09;简单工厂模式中我们介绍了简单工厂模式&#xff0c;在这篇文章中我们来介绍下工厂方法模式&#xff0c;它同样是创建型设计模式&#xff0c;而且又有些类似&#xff0c;文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

CentOS删除除了最近5个JAR程序外的所有指定Java程序

帮我写一个shell脚本&#xff0c;ps -eo pid,lstart,cmd --sort-start_time | grep "pgz-admin"查到的结果&#xff0c;返回的所有进程PID&#xff0c;第六个之上的&#xff0c;全部kill 当然&#xff0c;你可以创建一个简单的Shell脚本来完成这个任务。以下是一个例…

探索创造无限可能——Autodesk AutoCAD 2022(CAD 2022)系统要求

随着科技的不断进步和发展&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;已经成为现代设计行业中不可或缺的一部分。在众多CAD软件中&#xff0c;Autodesk AutoCAD 2022&#xff08;CAD 2022&#xff09;无疑是最受欢迎和广泛应用的一款软件。作为一款全球领先的CAD软…

(十八)devops持续集成开发——使用docker安装部署jenkins服务

前言 本节内容介绍如何使用docker容器来部署安装jenkins流水线服务。关于docker容器的安装本节内容不做介绍。请读者提前安装。 正文 ①使用docker查找jenkins官方镜像 ② 拉取jenkins官方镜像jenkins/jenkins&#xff0c;选择一个最新稳定版本&#xff0c;避免一些插件不兼…

日更【系统架构设计师知识总结2】指令系统(结合真题)

【原创精华】结合老师的讲授、耗费三个小时的精华总结对正在备考的你一定有用&#xff01;&#xff01;自己一点点手打、总结的脑图&#xff0c;把散落在课本以及老师讲授的知识点合并汇总&#xff0c;反复提炼语言&#xff0c;形成知识框架。希望能给同样在学习的伙伴一点帮助…

如何理解介电常数与耗散因子

目录 电介质的极化过程 介电常数的定义 介电常数的物理意义 耗散因子的定义 耗散因子的物理意义 实际应用 结语 电介质的极化过程 电偶极子被定义为一对极性相反但相距很近的等量电荷,与每个偶极子相关联的一个矢量成为偶极矩,如果为每个电荷的带电量,为从负电荷到正电…

OpenHarmony开发之Stage模型卡片服务详解~

介绍 本示例展示了Stage模型卡片提供方的创建与使用。 用到了卡片扩展模块接口&#xff0c;ohos.app.form.FormExtensionAbility。 卡片信息和状态等相关类型和枚举接口&#xff0c;ohos.app.form.formInfo 。 卡片提供方相关接口的能力接口&#xff0c;ohos.app.form.form…

力扣● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

● 1049. 最后一块石头的重量 II 题目要把石头分成两堆&#xff0c;这两堆的重量差值最小。相撞之后剩下的石头重量就最小。其实就是要尽量把石头分为差不多重量的两堆&#xff0c;和昨天的● 416. 分割等和子集相似&#xff0c;这样就转换成了01背包问题。 和416题一样&…

【Git教程】(五)分支 —— 并行式开发,分支相关操作(创建、切换、删除)~

Git教程 分支 1️⃣ 并行式开发2️⃣ 修复旧版本中的 bug3️⃣ 分支4️⃣ 当前活跃分支5️⃣ 重置分支指针6️⃣ 删除分支7️⃣ 清理提交对象&#x1f33e; 总结 对于版本提交为什么不能依次进行&#xff0c;以便形成一条直线型的提交历史记录&#xff0c;我们认为有 以下两个…

unity37——巧妙运用URP管线基础shader/Lit材质,给头发做出还不错的发丝效果.(应急用,在没时间单独写shader的情况下)

上面两个都是用基础Lit材质调整出来的。不管是&#xff0c;高模&#xff0c;还是低模。虽然没有单的的hair shader那么多可以做效果的滑块去调整效果&#xff0c;但是贵在简单、省事、建模容易、而且还省面。 下面上干货&#xff1a; 1。正常我们游戏里的头发&#xff0c;按照…

49.仿简道云公式函数实战-文本函数-Ip

1. Ip函数 获取当前用户的ip地址 注意是Ipv4的地址 2. 函数用法 IP() 3. 函数示例 获取当前用户的ip地址IP() 4. 代码实战 首先我们在function包下创建text包&#xff0c;在text包下创建IpFunction类&#xff0c;代码如下&#xff1a; package com.ql.util.express.sel…

弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙

作者&#xff1a;潘伟龙&#xff08;豁朗&#xff09; 背景 日志服务 SLS 是云原生观测与分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务&#xff0c;基于日志服务的便捷的数据接入能力&#xff0c;可以将系统日志、业务日志等接入 …

第十四届校模拟赛第一期(一)

“须知少时凌云志&#xff0c;自许人间第一流” 鄙人11月八号有幸参加学校校选拔赛&#xff0c;题型为5道填空题&#xff0c;5道编程题&#xff0c;总时间为4小时。奈何能力有限&#xff0c;只完成了5道填空和3道编程大题&#xff0c;现进行自省自纠&#xff0c;分享学习&#…

四 . 分支和循环——Java基础篇

四 . 分支和循环 1 . switch的基本语法 if 和 swicth 的对比: if既可以用于范围校验, 也可以用于等值校验swicth对于if效率更高,只能用于等值校验 语法格式: switch(表达式){case 常量值1:语句块1;//break;case 常量值2:语句块2;//break; // ...[default:语句块n1;break;] }…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

Wireshark TS | Linux 系统对时问题

问题描述 节前业务运维同事提交了一个 case &#xff0c;说是部署在新业务区域的 Linux 服务器和老业务区域的 Linux 服务器无法对时&#xff0c;脚本里使用的是 clockdiff 命令&#xff0c;无法正常返回结果&#xff0c;而在老业务区域两台服务器之间执行命令就正常&#xff…

【笔记】深度学习入门:基于Python的理论与实现(三)

误差反向传播法 一 个能够高效计算权重参数的梯度的方法 计算图 正向传播 太郎在超市买了 2 个 100 日元一个的苹果&#xff0c;消费税是 10%&#xff0c;请计 算支付金额。 反向传播&#xff08;导数&#xff09; 如果苹果的价格增加某个微小值&#xff0c; 则最终的支付金额…