TensorFlow.js 卷积神经网络手写数字识别
原博地址https://laboo.top/2018/11/21/tfjs-dr/
源码
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]; }
欢迎关注我的博客公众号
相关推荐
demm 2020-09-18
walegahaha 2020-08-15
georgesale 2020-08-14
wenxuegeng 2020-06-08
hnyzyty 2020-06-05
wenxuegeng 2020-05-04
wenxuegeng 2020-02-19
sunxinyu 2020-09-17
cherry0 2020-08-15
fengzhimohan 2020-07-23
wenxuegeng 2020-06-14
cherry0 2020-06-06
hnyzyty 2020-06-03
wenxuegeng 2020-06-03
walegahaha 2020-06-03
cherry0 2020-06-03
zhaorui0 2020-06-01
kuankeTech 2020-06-01
hnyzyty 2020-05-12
georgesale 2020-05-10
hnyzyty 2020-05-08
hnyzyty 2020-05-05
walegahaha 2020-05-05
玉来愈宏的随笔 2020-05-02
liqing 2020-04-19