无效的训练数据。序列响应必须与对应的预测变量具有相同的序列长度。哪里出了问题。
XrTrain = cell(size(pn_train,2),1); %注意size是1还是2,tn_train是2*4095数组,pn_train是6*4095数组
YrTrain = zeros(size(tn_train,1),4095);%YrTrain是2*4095数组
for i=1:size(pn_train,2)%i是1到4095
XrTrain{i,1} = pn_train(:,i); %pn_train 是6*4095列.Xrtrain是6*1个胞元,
YrTrain(:,i) = tn_train(:,i);
% YrTrain(:,1)= tn_train(:,i); %每个tn_train是2*1列,tn_train是2*4095
end
numFeatures = size(pn_train,1);
% 输出特征维度
numResponses = 2;
FiltZise = 10;
% 创建"CNN-LSTM"模型
layers = [...
% 输入特征
sequenceInputLayer([numFeatures 1 1],'Name','input')
sequenceFoldingLayer('Name','fold')
% CNN特征提取
convolution2dLayer([FiltZise 1],32,'Padding','same','WeightsInitializer','he','Name','conv','DilationFactor',1);
batchNormalizationLayer('Name','bn')
eluLayer('Name','elu')
averagePooling2dLayer(1,'Stride',FiltZise,'Name','pool1')
% 展开层
sequenceUnfoldingLayer('Name','unfold')
% 平滑层
flattenLayer('Name','flatten')
% LSTM特征学习
lstmLayer(128,'Name','lstm1','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
% LSTM输出
lstmLayer(32,'OutputMode',"last",'Name','bil4','RecurrentWeightsInitializer','He','InputWeightsInitializer','He')
dropoutLayer(0.25,'Name','drop3')
% 全连接层
fullyConnectedLayer(numResponses,'Name','fc')
regressionLayer('Name','output') ];
layers = layerGraph(layers);
layers = connectLayers(layers,'fold/miniBatchSize','unfold/miniBatchSize');
analyzeNetwork(layers); %补充分析
%% CNNLSTM训练选项
% 批处理样本
MiniBatchSize =24;
% 最大迭代次数
MaxEpochs = 60;
% 学习率
learningrate = 0.005;
% 一些参数调整
if gpuDeviceCount>0
mydevice = 'gpu';
else
mydevice = 'cpu';
end
options = trainingOptions( 'adam', ...
'MaxEpochs',100, ...
'GradientThreshold',1, ...
'InitialLearnRate',learningrate, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',20, ...
'LearnRateDropFactor',0.8, ...
'L2Regularization',1e-3,...
'Verbose',false, ...
'ExecutionEnvironment',mydevice,...
'Plots','training-progress');
%% 训练混合网络
% rng(0);
% 训练
net = trainNetwork(XrTrain,YrTrain,layers,options);