如何多元输出回归

211次浏览(过去30天)
jaehong金
jaehong金 2021年2月12日
编辑: KSSV 2022年9月21日
我想知道如何自定义回归训练循环(多个输出)。
我想获得关于自定义多重输出回归的简单代码示例。
每个前任都是关于cnn的,但我只想要DNN,谢谢你阅读我的问题:)

答案(1)

Raynier苏雷什
Raynier苏雷什 2021年2月17日
下面的代码将为您提供一个关于如何创建和训练具有多个回归输出的自定义网络的示例。
创建多个输出的网络
图层= [imageInputLayer([28 28 1],“归一化”“没有”“名字”“在”
fullyConnectedLayer (1,“名字”“fc1”));
lgraph = layerGraph(图层);
lgraph = addLayers(lgraph,fullyConnectedLayer(1“名字”“取得”));
lgraph = connectLayers(“在”“取得”);
数字
情节(lgraph)
Dlnet = dlnetwork(lgraph);
培训数据
XTrain = rand(28,28,1,50);输入数据(50张大小为28x28x1的图像)
YTrain1 = randi(10,50,1);%输出1的回归输出数据
YTrain2 = randi(10,50,1);%输出2的回归输出数据
dsXTrain = arrayDatastore(XTrain,“IterationDimension”4);
dsYTrain1 = arrayDatastore(YTrain1);
dsYTrain2 = arrayDatastore(YTrain2);
dsTrain = combine(dsXTrain,dsYTrain1,dsYTrain2);
训练网络
numEpochs = 3;
miniBatchSize = 128;
情节=“训练进步”
mbq = minibatchqueue(dsTrain,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”@preprocessData,“MiniBatchFormat”, {“SSCB”});
如果情节= =“训练进步”
数字
lineLossTrain = animatedline(“颜色”,[0.85 0.325 0.098]);
ylim([0正])
包含(“迭代”); ylabel (“损失”网格);
结束
trailingAvg = [];
trailingAvgSq = [];
迭代= 0;
开始= tic;
%遍历epoch。
epoch = 1:numEpochs
% Shuffle数据。
洗牌(兆贝可)
在小批上循环
hasdata(兆贝可)
迭代=迭代+ 1;
[dlX,dlY1,dlY2] = next(mbq);
使用dlfeval和
% modelGradients函数。
[gradients,state,loss] = dlfeval(@modelGradients, dlnet, dlX, dlY1, dlY2);
dlnet。状态=状态;
使用Adam优化器更新网络参数。。
[dlnet,trailingAvg,trailingAvgSq] = adamupdate(dlnet,gradients,trailingAvg,trailingAvgSq,iteration);
%显示培训进度。
如果情节= =“训练进步”
D = duration(0,0,toc(start),“格式”“hh: mm: ss”);
addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))
标题(”时代:“+ epoch +,消失:"+字符串(D))
drawnow
结束
结束
结束
训练网络的必要功能
函数[gradients,state,loss] = modelGradients(dlnet,dlX,T1,T2)
[dlY1,dlY2,state] = forward(dlnet,dlX,“输出”, (“fc1”“取得”]);
lossT1 = mse(dlY1,T1);
lossT2 = mse(dlY2,T2);
损耗= 0.1*lossT1 + 0.1*lossT2;
gradients = dlgradient(loss,dlnet.Learnables);
结束
函数[X,Y1,Y2] = preprocessData(XCell,Y1Cell,Y2Cell)
X = cat(4,XCell{:});
Y1 = cat(2,Y1Cell{:});
Y2 = cat(2,Y2Cell{:});
结束
欲了解更多信息,请参考以下链接
2的评论
程邱
程邱 2021年9月28日
编辑:KSSV 2022年9月21日
层= [
imageInputLayer ([1] 32,“名字”“输入”“归一化”“没有”
fullyConnectedLayer (Nhide“名称”“FC1”
reluLayer (“名称”“Relu1”
fullyConnectedLayer (Nhide“名称”“取得”
dropoutLayer (0.5,“名称”“做”
fullyConnectedLayer (outputSize“名称”“一个FC3”文件
reluLayer (“名字”“Relu2”));
lgraph = layerGraph(图层);
Dlnet = dlnetwork(lgraph);
%培训选择
numEpochs = 1e3;
miniBatchSize = 32;
initialLearnRate = 0.001;
衰减= 0.01;
动量= 0.9;
情节=“训练进步”
executionEnvironment =“汽车”
如果情节= =“训练进步”
数字
lineLossTrain = animatedline(“颜色”,[0.85 0.325 0.098]);
ylim([0正])
包含(“迭代”
ylabel (“损失”
网格
结束
培训网络
numObservations = numel(输出);
numIterationsPerEpoch = floor(numObservations./miniBatchSize);
迭代= 0;
开始= tic;
%遍历epoch。
epoch = 1:numEpochs
% Shuffle数据。
idx = randperm(numel(OutPower(:,1)));
Input = Input (:,:,:,idx);
Output = Output (:,idx);
在小批上循环。
i = 1:numIterationsPerEpoch
迭代=迭代+ 1;
读取小批数据并将标签转换为虚拟标签
%变量。
idx = (i-1)*miniBatchSize+1:i*miniBatchSize;
X = input(:,:,:,idx);
Y1 = output(1,idx);
Y2 = output(2,idx);
Y3 = output(3,idx);
Y4 = output(4,idx);
将小批量数据转换为大数组。
dlX = dlarray(X,“SSCB”);
dlY1 = dlarray(日元“某人”);
dlY2 = dlarray (Y2,“某人”);
dlY3 = dlarray (Y3,“某人”);
dlY4 = dlarray (Y4,“某人”);
% ly = darray (Y,'SSCB');
如果在GPU上训练,则将数据转换为gpuArray。
如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”
dlX = gpuArray(dlX);
结束
使用dlfeval和
% modelGradients函数并更新网络状态。
[gradients,state,loss] = dlfeval(@modelGradients,dlnet,dlX,dlY1,dlY2,dlY3,dlY4);
dlnet。状态=状态;
函数[gradients,state,loss] = modelGradients(dlnet,dlX,Y1,Y2,Y3,Y4)
[dlYPred,state] = forward(dlnet,dlX);
损失=√(dlYPred (1) y1)。^ 2 + (dlYPred (2) y2)。^ 2 + (dlYPred (3) y3)。^ 2 + (dlYPred (4) y4)。^ 2)/ 2;
gradients = dlgradient(loss,dlnet.Learnables);
结束

登录评论。

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map