资讯专栏INFORMATION COLUMN

TensorFlow.js 卷积神经网络手写数字识别

zzir / 1659人阅读

摘要:原博地址源码演示开始时需要加载大概的训练数据稍等片刻调整训练集的大小观察测试结果的准确性数据来源数据来源与中的一道题目题目给出条训练数据包含图片和标签以及条测试数据只包含图片要求给这些测试数据打上标签要尽可能的准确网站中还有许多其

原博地址https://laboo.top/2018/11/21/tfjs-dr/

源码

digit-recognizer

demo

https://github-laziji.github.io/digit-recognizer/
演示开始时需要加载大概100M的训练数据, 稍等片刻

调整训练集的大小, 观察测试结果的准确性

数据来源

数据来源与 https://www.kaggle.com 中的一道题目 digit-recognizer
题目给出42000条训练数据(包含图片和标签)以及28000条测试数据(只包含图片)
要求给这些测试数据打上标签[0,1,2,3....,9] 要尽可能的准确

网站中还有许多其他的机器学习的题目以及数据, 是个很好的练手的地方

实现

这里我们使用TensorFlow.js来实现这个项目

创建模型

卷积神经网络的第一层有两种作用, 它既是输入层也是执行层, 接收IMAGE_H * IMAGE_W大小的黑白像素
最后一层是输出层, 有10个输出单元, 代表着0-9这十个值的概率分布, 例如 Label=2 , 输出为[0.02,0.01,0.9,...,0.01]

function createConvModel() {
  const model = tf.sequential();

  model.add(tf.layers.conv2d({
    inputShape: [IMAGE_H, IMAGE_W, 1],
    kernelSize: 3,
    filters: 16,
    activation: "relu"
  }));

  model.add(tf.layers.maxPooling2d({ poolSize: 2, strides: 2 }));
  model.add(tf.layers.conv2d({ kernelSize: 3, filters: 32, activation: "relu" }));
  model.add(tf.layers.maxPooling2d({ poolSize: 2, strides: 2 }));
  model.add(tf.layers.conv2d({ kernelSize: 3, filters: 32, activation: "relu" }));
  model.add(tf.layers.flatten({}));

  model.add(tf.layers.dense({ units: 64, activation: "relu" }));
  model.add(tf.layers.dense({ units: 10, activation: "softmax" }));

  return model;
}
训练模型

我们选择适当的优化器和损失函数, 来编译模型

async function train() {

  ui.trainLog("Create model...");
  model = createConvModel();
  
  ui.trainLog("Compile model...");
  const optimizer = "rmsprop";
  model.compile({
    optimizer,
    loss: "categoricalCrossentropy",
    metrics: ["accuracy"],
  });
  const trainData = Data.getTrainData(ui.getTrainNum());
  
  ui.trainLog("Training model...");
  await model.fit(trainData.xs, trainData.labels, {});

  ui.trainLog("Completed!");
  ui.trainCompleted();
}
测试

这里测试一组测试数据, 返回对应的标签, 即十个输出单元中概率最高的下标

function testOne(xs){
  if(!model){
    ui.viewLog("Need to train the model first");
    return;
  }
  ui.viewLog("Testing...");
  let output = model.predict(xs);
  ui.viewLog("Completed!");
  output.print();
  const axis = 1;
  const predictions = output.argMax(axis).dataSync();
  return predictions[0];
}
欢迎关注我的博客公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108790.html

相关文章

  • 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    摘要:人工神经网络,借鉴生物神经网络工作原理数学模型。人工神经网络模型,多层神经元结构建立,每一层抽象一种思维过程,经多层思考,得出结论。词向量作神经网络输入层,通过前馈网络和卷积网络完成。训练神经概率语言模型。 人工神经网络,借鉴生物神经网络工作原理数学模型。 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息。信息检索领域,模型训练合理排序模型,输入特征,文档质量...

    wangshijun 评论0 收藏0
  • 计算机如何高效识别图像?

    摘要:机器学习专家智能机器如何思考作者如是说。此神经网络可以用一个神经元来完成这项任务。与此同时,整个网络个神经元共有个偏置。它将降低和神经元除了神经元的输入方的权重,使输出神经元的值降低。令下次遇到这个图像时,此神经元会产生更大的输出值。 原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译...

    Cobub 评论0 收藏0
  • 计算机如何高效识别图像?

    摘要:机器学习专家智能机器如何思考作者如是说。此神经网络可以用一个神经元来完成这项任务。与此同时,整个网络个神经元共有个偏置。它将降低和神经元除了神经元的输入方的权重,使输出神经元的值降低。令下次遇到这个图像时,此神经元会产生更大的输出值。 原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译...

    nanchen2251 评论0 收藏0
  • 计算机如何高效识别图像?

    摘要:机器学习专家智能机器如何思考作者如是说。此神经网络可以用一个神经元来完成这项任务。与此同时,整个网络个神经元共有个偏置。它将降低和神经元除了神经元的输入方的权重,使输出神经元的值降低。令下次遇到这个图像时,此神经元会产生更大的输出值。 原文 How computers got shockingly good at recognizing images作者 Timothy B. Lee译...

    ISherry 评论0 收藏0
  • 机器学习研究人员需要了解的8个神经网络架构(上)

    摘要:神经网络是一组特定的算法,对机器学习领域发生了革命性的变化。在这篇博客文章中,我想分享我认为机器学习研究人员应该熟悉的课程中的个神经网络架构,以推进他们的工作。卷积神经网络机器学习研究一直以来都集中在对象检测问题上。 摘要: 本文简要讲述了8种机器学习架构,希望可以给大家带来帮助 showImg(https://segmentfault.com/img/bV8Hby?w=1000&h=...

    DevTalking 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<