2. 添加网络
根据上图添加神经网络:(train.js)
(1)添加卷积层,大小为28*28,其中卷积核大小为5,使用的激活函数为relu;(2)添加池化层,尺寸为2*2;
(2)添加卷积层,卷积核个数为5,激活函数为relu;
(3)添加池化层;
(4)为了提高准确路,在此处添加dropout,并且rate=0.5;
(5)降维后添加全连接层,激活函数为relu;
(6)使用adam()优化器并设置rate=0.002,损失函数为softmaxCrossEntrop;至此完成了网络的配置。
// 初始化模型
const model = tf.sequential();
// Convolutional layer 二维卷积层
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1], // 1:颜色黑白
kernelSize: 5, // 卷积核大小为5
filters: 16, // 卷积核数量为16
strides: 1, // 步长为1
activation: ‘relu’, // 激活函数为relu
kernelInitializer: ‘varianceScaling’ // 初始化卷积核
}));
// 经过这层变化[28,28,1]–>[14,14,16]
// Pooling layer 二维池化层
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2], // 尺寸
strides: [2, 2] // 步长
}));
// Convolutional layer 二维卷积层
model.add(tf.layers.conv2d({
kernelSize: 5, // 卷积核
filters: 32,
strides: 1,
activation: ‘relu’,
kernelInitializer: ‘varianceScaling’
}));
// Pooling layer 池化层
model.add(tf.layers.maxPooling2d({
poolSize: [2, 2],
strides: [2, 2]
}));
// 添加dropout rate = 0.5随机去掉一半
model.add(tf.layers.dropout({
rate: 0.5
}));
// Flatten layer 降维
model.add(tf.layers.flatten());
// Dense layer
model.add(tf.layers.dense({//全连接层
units: 128,
activation: ‘relu’
}));
model.add(tf.layers.dense({
units: 10, // 对应0-10数字
}));
const OPT = tf.train.adam(0.002) // 优化器
const config = {
optimizer: OPT,
loss: tf.losses.softmaxCrossEntropy, // 损失函数
}
model.compile(config); //模型设置好配置
3. 加载数据
由于训练集数量比较大,这里选取了前60000个数据进行训练(train.js)
console.log(“载入数据”)
inputs = tf.tensor2d(mnist.train_images.slice(0, 60000));
outputs_org = tf.tensor1d(mnist.train_labels.slice(0, 60000));// 标签Y
outputs = tf.oneHot((outputs_org), 10);//全部对应到0-9 [0,0,0,0,0,0,0,1]
console.log(“重组数据”) // 归一化除以255 变成0-1
inputs = tf.div(inputs, tf.scalar(255.0));
inputs = inputs.reshape([60000, 28, 28, 1]); // 格式化28* 28* 1
4. 训练模型
这里使用15个epoh迭代,并且实时输出每一轮结果的loss.(train.js)
async function train() {
for (let i = 1; i < 15; i++) {
const h = await model.fit(inputs, outputs, {
atchSize: 200,
epochs: 1
);
console.log("Loss after Epoch " + i + " : " + h.history.loss[0]);
}
const saveResults = await model.save(‘indexeddb://my-model-6’);
console.log(“模型已经保存”);
select(‘#modelStatus’).html(‘模型已经训练完成并保存’);
}
5. 其中需要对模型进行保存和重加载
// 保存训练模型到浏览器数据库my-model-5
const saveResults = await model.save(‘indexeddb://my-model’);
// 加载已经保存的my-model模型,不需要重新训练
const model = await tf.loadLayersModel(‘indexeddb://my-model’);
6. 测试训练准确率
首先加载测试数据,这里选择前10000个,之后进行训练(load.js)
console.log(“加载测试数据。。”)
inputs_test = tf.tensor2d(mnist.test_images.slice(0, 10000));
inputs_test = tf.div(inputs_test,tf.scalar(255.0));
inputs_test = inputs_test.reshape([10000, 28, 28, 1]);
outputs_test = tf.tensor1d(mnist.test_labels.slice(0, 10000));
print(outputs_test.shape);
console.log(“测试数据加载完成”)
async function test() {
const model = await tf.loadLayersModel(‘indexeddb://my-model’);
console.log(‘加载已经保存的模型’);
output_tem = model.predict(inputs_test);
label = tf.argMax(output_tem, 1);
// 打印测试准确率
tf.div(tf.sum(outputs_test.equal(label)), mnist.test_labels.length).print();
result = tf.div(tf.sum(outputs_test.equal(label)), mnist.test_labels.length);
select(‘#modelStatus’).html(‘模型已经加载完成:’ + result);
}
7. 手写体识别可视化
实时鼠标在区域画数字,会进行预测,点击空格键删除。(recognition.js)
(参考链接:https://github.com/CodingTrain/Toy-Neural-Network-JS/blob/master/examples/mnist)
let img = user_digit.get();
if(!user_has_drawing) {
return img;
}
let inputs = [];
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。
因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
图片转存中…(img-O4ySSkOq-1712577687350)]
[外链图片转存中…(img-BCiCrekr-1712577687351)]
[外链图片转存中…(img-G9KtLcSV-1712577687351)]
既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!
由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频
如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-dC5CNvOL-1712577687352)]