TensorFlow.js 卷积神经网络手写数字识别 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
laziji

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

  •  1
     
  •   laziji Nov 21, 2018 1663 views
    This topic created in 2713 days ago, the information mentioned may be changed or developed.

    原博地址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]; } 

    欢迎关注我的博客公众号 2018_11_16_0048241709.png

    No Comments Yet
    About     Help     Advertise     Blog     API     FAQ     Solana     1104 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 23:36 PVG 07:36 LAX 16:36 JFK 19:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86