clc;clear;close all
% https://blog.csdn.net/qq_41043389/article/details/109554411
% 创建数据
[data,text] = xlsread('yangzheng', '数据', 'B2:IV51');
input=data(:,2:255)'; %载入输入数据
output=data(:,1)'; %载入输出数据
m=10;
n=40;
train_x=input(:,1:n);
train_y=output(:,1:n);
test_x=input(:,n+1:end);
test_y=output(:,n+1:end);
method=@mapminmax;
% method=@mapstd;
[train_x,train_ps]=method(train_x);
test_x=method('apply',test_x,train_ps);
[train_y,output_ps]=method(train_y);
test_y=method('apply',test_y,output_ps);
trainD=reshape(train_x,[254,1,1,n]);%训练集输入
testD=reshape(test_x,[254,1,1,m]);%测试集输入
targetD = train_y;%训练集输出
targetD_test = test_y;%测试集输出
% 输入254*1经过池化降维127*1、输出1
% 128 = (127+1)*1
layers = [
% 输入层,要正确输入图片的height, width 和 number of channels of the images
% 输入254*1的1维数据
imageInputLayer([254 1 1]) %输入层参数设置 254
% batchNormalizationLayer(); % 批量归一化
% 16个3*1大小的卷积核、填补方式用0
% 16个254*1
convolution2dLayer([3,1],16,'Padding','same')
reluLayer%relu激活函数
% 2*1最大池化、步长2
% 16个127*1
maxPooling2dLayer([2 1],'Stride',2)% 2x1 kernel stride=2
% 其他个数也可以,只是前人实验出来觉得此处为1024比较合适
fullyConnectedLayer(1024) % 全连接层神经元
reluLayer%relu激活函数
fullyConnectedLayer(1024)
fullyConnectedLayer(1) % 输出层神经元 1
regressionLayer];%添加回归层,用于计算损失值
% 设置迭代次数 batchsize 学习率
options = trainingOptions('adam', ...
'MaxEpochs',20, ...
'MiniBatchSize',16, ...
'InitialLearnRate',0.005, ...
'GradientThreshold',1, ...
'Verbose',false,...
'Plots','training-progress',...
'ValidationData',{testD,targetD_test'});
% 输入数据都是最后一维为样本数,偏偏输出要第一维为样本数,所以targetD和targetD_test都取了转置
% 训练
net = trainNetwork(trainD,targetD',layers,options);
% 预测
YPredict = predict(net,testD);
% 结果
YPredict=double(YPredict');%输出是n*1的single型数据,要转换为1*n的double是数据形式
% 反归一化
predict_value=method('reverse',YPredict,output_ps);predict_value=double(predict_value);
true_value=method('reverse',targetD_test,output_ps);true_value=double(true_value);
figure
plot(true_value,'-*','linewidth',3)
hold on
plot(predict_value,'-s','linewidth',3)
legend('实际值','预测值')
grid on
rmse=sqrt(mean((true_value-predict_value).^2));
disp(['根均方差(RMSE):',num2str(rmse)])
mae=mean(abs(true_value-predict_value));
disp(['平均绝对误差(MAE):',num2str(mae)])
mape=mean(abs((true_value-predict_value)./true_value));
disp(['平均相对百分误差(MAPE):',num2str(mape*100),'%'])
% 错误如下:
% 错误使用 nnet.cnn.layer.Convolution2DLayer.parseInputArguments (line 253)
% 'Padding' 的值无效。它必须满足函数: iIsNaturalNumberScalarOrRowVectorOfTwo。
%
% 出错 convolution2dLayer (line 73)
% args = nnet.cnn.layer.Convolution2DLayer.parseInputArguments(varargin{:});
%
% 出错 CNNi784o1 (line 34)
% convolution2dLayer([3,1],16,'Padding','same')%卷积层的核大小[3 1],因为我们的输入是[254 1],是一维的数
% 据,所以卷积核第二个参数为1就行了,这样就是1d卷积
% 解决错误
% Matlab版本问题(Matlab2018及以上版本)
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
CNN多输入单输出.zip (4个子文件)
CNN多输入单输出
CNNi784o1.m 3KB
notMNIST_small.mat 112.14MB
CNNi2828o1.m 3KB
yangzheng.xlsx 190KB
共 4 条
- 1
资源评论
杨铮...
- 粉丝: 167
- 资源: 258
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功