将来的程序员分为两种, 会机器学习和不会的git
原博地址laboo.top/2018/11/21/…程序员
digit-recognizergithub
github-laziji.github.io/digit-recog… 演示开始时须要加载大概100M
的训练数据, 稍等片刻网络
调整训练集的大小, 观察测试结果的准确性机器学习
数据来源与 www.kaggle.com 中的一道题目 digit-recognizer
题目给出42000
条训练数据(包含图片和标签)以及28000
条测试数据(只包含图片) 要求给这些测试数据打上标签[0,1,2,3....,9] 要尽量的准确async
网站中还有许多其余的机器学习的题目以及数据, 是个很好的练手的地方ide
这里咱们使用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];
}
复制代码
欢迎关注个人博客公众号
![]()