Skip to main content

moregeek program

matlab 使用cnn拟合回归模型预测手写数字的旋转角度-多极客编程

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。

🍎个人主页:算法工程师的学习日志

一个深度学习文档分享一下,很简单,但思路不错,在个人项目上也可以按照需求变化数据集来实现CNN回归计算

加载数据

clc
close all
clear
%% 加载数据
%% 数据集包含手写数字的合成图像,以及每幅图像旋转的对应角度(以角度为单位)。
%% 使用digitTrain4DArrayData和digitTest4DArrayData将训练和验证图像加载为4D数组。
%% 输出YTrain和YValidation是以角度为单位的旋转角度。每个训练和验证数据集包含5000张图像。
[XTrain, ~, Ytrain] = digitTrain4DArrayData;
[XValidation, ~, YValidation] = digitTest4DArrayData;
%% 随机显示20张训练图像
numTrainImages = numel(Ytrain);
figure;
idx = randperm(numTrainImages, 20);
for i = 1 : numel(idx)
subplot(4, 5, i);
imshow(XTrain(:, :, :, idx(i)))
drawnow
end

Matlab 使用CNN拟合回归模型预测手写数字的旋转角度_数据

数据归一化

当训练神经网络时,确保你的数据在网络的所有阶段都是标准化的。归一化有助于使用梯度下降来稳定和加速网络训练。如果数据规模太小,那么损失可能会变成NaN,并且在培训期间网络参数可能会出现分歧。

标准化数据的常用方法包括重新标定数据,使其范围变为[0,1]或使其均值为0,标准差为1。

标准化以下数据:

1、输入数据。在将预测器输入到网络之前对数据进行规范化。

2、层输出。使用批处理规范化层对每个卷积和完全连接层的输出进行规范化。

3、响应。如果使用批处理规范化层对网络末端的层输出进行规范化,则在开始训练时对网络的预测进行规范化。

%% 绘制响应分布:在分类问题中,输出是类概率,类概率总是归一化的。
figure;
histogram(Ytrain)
axis tight
ylabel('Counts')
xlabel('Rotation Angle')

Matlab 使用CNN拟合回归模型预测手写数字的旋转角度_旋转角度_02

创建网络层

%% 创建网络层
%% 第一层定义输入数据的大小和类型。输入的图像大小为28×28×1。创建与训练图像大小相同的图像输入层。
%% 网络的中间层定义了网络的核心架构,大部分计算和学习都在这个架构中进行。
%% 最后一层定义输出数据的大小和类型。对于回归问题,全连接层必须先于网络末端的回归层。
layers = [
imageInputLayer([28 28 1])
batchNormalizationLayer
reluLayer

averagePooling2dLayer(2, 'Stride', 2)

convolution2dLayer(3, 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer

averagePooling2dLayer(2, 'Stride', 2)

convolution2dLayer(3, 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer

convolution2dLayer(3, 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer

dropoutLayer(0.2)
fullyConnectedLayer(1)
regressionLayer];

Matlab 使用CNN拟合回归模型预测手写数字的旋转角度_2d_03

训练网络设置

使用 trainNetwork 创建网络。如果存在兼容的 GPU,此命令会使用 GPU。否则,trainNetwork 将使用 CPU。在 GPU 上进行训练需要具有 3.0 或更高计算能力的支持 CUDA® 的 NVIDIA® GPU。

%% 训练网络——Options
%% Train for 30 epochs 学习率0.001 在20个epoch后降低学习率。
%% 通过指定验证数据和验证频率,监控培训过程中的网络准确性。
%% 根据训练数据对网络进行训练,并在训练过程中定期对验证数据进行精度计算。
%% 验证数据不用于更新网络权重。打开训练进度图,并关闭命令窗口输出。
miniBatchSize = 128;
validationFrequency = floor(numel(Ytrain) / miniBatchSize);
options = trainingOptions('sgdm', ...
'MiniBatchSize', miniBatchSize, ...
'MaxEpochs', 30, ...
'InitialLearnRate', 1e-3, ...
'LearnRateSchedule', 'piecewise', ...
'LearnRateDropFactor', 0.1, ...
'LearnRateDropPeriod', 20, ...
'Shuffle', 'every-epoch', ...
'ValidationData', {XValidation, YValidation}, ...
'ValidationFrequency', validationFrequency, ...
'Plots', 'training-progress', ...
'Verbose', false);

训练网络

net = trainNetwork(XTrain, Ytrain, layers, options);

Matlab 使用CNN拟合回归模型预测手写数字的旋转角度_数据_04

预测结果


基于验证数据评估准确度来测试网络性能。使用 predict 预测验证图像的旋转角度。

YPredicted = predict(net,XValidation);

评估性能

通过计算以下值来评估模型性能:

predictionError = YValidation - YPredicted;

计算在实际角度的可接受误差界限内的预测值的数量。将阈值设置为 10 度。计算此阈值范围内的预测值的百分比。

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numValidationImages = numel(YValidation);
accuracy = numCorrect/numValidationImages

使用均方根误差 (RMSE) 来衡量预测旋转角度和实际旋转角度之间的差异。

squares = predictionError.^2;
rmse = sqrt(mean(squares))
accuracy =
0.9584




rmse =
single
4.8987


显示原始数字以及校正旋转后的数字,使用 montage (Image Processing Toolbox) 将数字显示在同一个图像上。

Matlab 使用CNN拟合回归模型预测手写数字的旋转角度_旋转角度_05

©著作权归作者所有:来自51CTO博客作者domi+1的原创作品,请联系作者获取转载授权,否则将追究法律责任

问题解决系列:io.grpc.netty.shaded.io.netty.handler.ssl.notsslrecordexception-多极客编程

问题场景最近使用公司微服务框架开发后台,要调用由​​python​​​写的服务端接口。这里我们是使用了​​grpc​​​来做不同语言之间的接口调用。已知​​python​​服务端是开启着的,而在测试过程,发现后台报错,报错提示如下:Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE: io exceptionChannel Pipeline

【dubbo3入门到精通】「序章介绍说明」dubbo3新特性概览的介绍说明-多极客编程

Dubbo3的微服务框架系列​​【Dubbo3入门到精通】总体技术体系介绍及技术指南(目录)​​本系列专题是关于 Dubbo 的简单介绍,涵盖Dubbo的核心概念、基本使用方式以及Dubbo3核心功能。Dubbo的基本介绍Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用

java8实战之stream-多极客编程

Java8实战之Stream前言在前面一个小节中,我们已经学习了行为参数化以及Lambda表达式,通过Lambda表达式,可以使得代码更加简洁,尤其是当一个方法只需要使用一次的时候,然而,如果Java8中只有Lambda表达式的话,那还是不足以让人感到兴奋的,个人感觉,Java8中最有意思,也是最方便的功能,莫过于​​Stream​​了Stream初窥​​Stream​​可以翻译为流,实际上其操作

python通过flask搭建音频流/文件服务-多极客编程

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 🍎个人主页:算法工程师的学习日志工作上需要搭建一个音频推送服务,考虑到使用python Flask搭建一个服务,下面给出简单的代码,代码中每次请求推送当前目录下的音频文件。from flask import Flaskfrom flask import Responseimport osapp = Flask(_

spring integration对redis的支持-多极客编程

Spring Integration 2.1引入了对Redis​的支持:“一个开源的高级键值存储”。 这种支持以基于 Redis 以及发布-订阅消息传递适配器的形式出现,Redis 通过其 PUBLISH、SUBSCRIBE和 UNSUBSCRIBE​命令支持这些适配器。​​MessageStore​​您需要将此依赖项包含在项目中:<dependency> <groupId

c++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学-多极客编程

1. 前言 排序算法中,冒泡、插入、选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置。 希尔、归并、快速排序算法也可归为同一类,它们的共同点都是建立在分治思想之上。把大问题分拆成小问题,解决所有小问题后,再合并每一个小问题的结果,最终得到对原始问题的解答。 Tips: 通俗而言:化整为零,各个击破。 分治算法很有哲学蕴味:老祖宗所言 合久必分,分久必

【shell文本三剑客--awk】-多极客编程

awk简介awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk命令格式和选项调用awk语法格式1.命令行方式awk [-F field-separator] '条件

zabbix 6 系列学习 06:编译方式安装-多极客编程

接着上篇的 Zabbix Appliance 安装,今天带来的是源码编译的安装方式,本文并不是全源码方式,仅仅是 Zabbix 部分源码安装。本文环境CentOS 7 2009关闭 Firewall、Selinuxsystemctl stop firwalld && systemctl disable firewalld setenforce 0永久关闭 selinux,需要重启服

三、教你搞懂渐变堆叠面积图《手把手教你 echarts 数据可视化详解》-多极客编程

注:本系列教程需要对应 JavaScript 、html、css 基础,否则将会导致阅读时困难,本教程将会从 ECharts 的官方示例出发,详解每一个示例实现,从中学习 ECharts 。 ECharts 官方示例:https://echarts.apache.org/examples/zh/index.html 《手把手教你 ECharts 数据可视化详解》 目录 一、基础折线图详解 二、基础

如何进行微服务的技术选型?-多极客编程

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者| 慕课网精英讲师陈于吉吉我们都知道,现在在微服务市场比较流行的有 2 大框架,一个是 Ali 的 Dubbo,一个是 SpringCloud。两者孰优孰劣一直是一个比较令人头疼的问题。1. 技术选型考虑的要素其实我们可以先不去考虑是采用 Dubbo 还是 SpringCloud,而是回到技术选型本身,先看下技术选型可能存

【shell文本三剑客--sed,grep】-多极客编程

一、sed简介sed 是 stream editor 的缩写,流编辑器,主要用于对标准输出或文件进行逐行处理。二、语法语法格式stdout | sed [option] "pattern command" #对 | 前面输出的内容进行sed处理sed [option] "pattern command" fileoption选项-n 只打印模式匹配行-f 编辑动作保存在文件中,-f

如何为 longhorn 扩展对象存储能力-多极客编程

作者: 王海龙,Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 8 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层操作系统 Linux,还是虚拟化 KVM 或是 Docker 容器技术都有丰富的运维和实践经验。在云原生环境中,非常重要的环节之一就