带你入门机器学习 - 卷积神经网络识别手写数字

本文探讨了未来程序员的技能趋势,特别强调了机器学习的重要性。通过一个数字识别项目的实例,展示了如何使用TensorFlow.js实现卷积神经网络,从数据准备到模型训练和测试的全过程。该项目的目标是在Kaggle的digit-recognizer竞赛中,对28000张手写数字图片进行准确分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

未来的程序员分为两种, 会机器学习和不会的

原博地址laboo.top/2018/11/21/…

源码

digit-recognizer

demo

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

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

数据来源

数据来源与 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];
}
复制代码

欢迎关注我的博客公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值