学生休息室

分享学生如何在日常项目中使用MATLAB和Simulink的技术和现实例子#学生成功#金宝app

通过MATLAB的深度学习减缓气候变化

今天参加我们节目的是 Kaveh Faraji 而且 Azin Al Kajbaf ,他获得了MATLAB的最佳使用奖 的BioMassters 竞争!继续阅读,了解更多关于这两人的信息,以及他们如何使用深度学习来估算生物量。轮到你们了……
Azin.jpg Kaveh.jpg
Azin于2022年获得马里兰大学土木工程博士学位,目前是约翰霍普金斯大学和美国国家标准与技术研究所(NIST)的博士后研究员。Kaveh是马里兰大学土木工程专业的博士候选人。我们的学术重点领域包括机器学习、地理空间分析和统计方法在自然灾害评估中的应用。几年前我们开始使用深度学习。当时我们正在用MATLAB为我们的研究实现机器学习,并且对深度学习也很感兴趣。当时MathWorks正在赞助一场深度学习比赛,这激发了我们学习MATLAB的深度学习工具箱和深度学习的概念。从那时起,我们参加了多个深度学习比赛。目前,我们正在研究机器学习和深度学习在自然灾害评估中的应用。我们一直计划在机器学习和深度学习在卫星图像工作中的应用方面获得一些实践经验,这最终也可能对我们的研究有所帮助,而这次特定的比赛为我们提供了绝佳的机会。

灵感

我们是博士后研究员和博士生。我们在研究项目中实现了机器学习和深度学习方法,MATLAB是我们使用的编程语言之一。参加数据科学竞赛已经成为我们的激情所在,因为它激励我们更多地了解机器学习和深度学习方法及其在现实世界中的应用。的BioMassters竞赛特别有趣,因为我们最近开始在研究中使用卫星图像进行自然灾害评估。

分解问题

12个月的卫星图像数据包含15个波段(Sentinel-2为11个波段,Sentinel-1为4个波段)。目的是预测这些图像的年生物量(标签的像素值)。数据具有空间和时间方面。我们的想法是:
  1. 在不考虑空间影响的情况下,对图像进行逐像素分类(为此,我们使用了1-D CNN)
  2. 然后利用三维U-Net结构来考虑像素之间的空间关系。

我们是如何实现它的?

该解决方案包含两个主要步骤:

步骤1:使用一维CNN逐像素回归

在这个网络中,我们读取每个图像并使用自定义训练循环来训练网络。我们将卫星图像(大小为[15 * 12 *256 *256])重塑为形状为[channel_size(C) = 15 batch_size(B) = (256*256) temporal_size(T) = 12]的矩阵。我们预测了训练和测试数据集中每张图像的标签。
例如,您可以看到下面的代码,我们用来创建和训练一个提高分数的1-D CNN。
建立一个一维的CNN
filterSize = 3;
numFilters = 64;
numClasses = 10;
层= [...
sequenceInputLayer(15日最小长度= 12)
convolution1dLayer (filterSize numFilters填充=“因果”
reluLayer
layerNormalizationLayer
maxPooling1dLayer (2)
convolution1dLayer (2 * numFilters filterSize,填充=“因果”
reluLayer
layerNormalizationLayer
globalMaxPooling1dLayer
fullyConnectedLayer (512)
reluLayer
fullyConnectedLayer (128)
reluLayer
fullyConnectedLayer (1)
reluLayer];
% analyzeNetwork(层);
lgraph = layerGraph(图层);
Net = dlnetwork(lgraph);
使用预训练模型或训练模型
如果你想从头开始训练模型,改变“train_network”的值
%改为true。
Train_network = true;
如果train_network
miniBatchSize = 1;
numEpochs = 10;
numObservations = numel(inputTrain.Files);
numIterationsPerEpoch = floor(numObservations./miniBatchSize);
averageGrad = [];
averageSqGrad = [];
numIterations = nummepochs * numIterationsPerEpoch;
monitor = trainingProgressMonitor(指标=“损失”信息=“时代”包含=“迭代”);
迭代= 0;
Epoch = 0;
epoch < numEpochs && ~monitor。停止
Epoch = Epoch + 1;
% Shuffle数据。
洗牌(兆贝可);
重置(mbq_val);
Hasdata (mbq) && ~monitor。停止
迭代=迭代+ 1;
读取小批数据。
[X,T] = next(mbq);
将小批数据转换为大数组。
X = dlarray(single(X),“认知行为治疗”);
我们读取大小为[15 * 12 * 256 * 256]的每张图像
[channel_size(C) = 15 batch_size(B) = (256*256) temporal_size(T) = 12]
我们不得不使用一个小于65501的批量大小。
当我们使用超过此值的批处理大小时出现错误。
X = X(:,1:65500,:);
T = T(:,1:65500,:);
如果在GPU上训练,则将数据转换为gpuArray。
如果canUseGPU
X = gpuArray(X);
T = gpuArray (T);
结束
使用辅助损失函数计算损失和梯度。
[loss,gradients] = dlfeval(@modelLoss,net,X,T);
使用Adam优化器更新网络参数。。
[net,averageGrad,averageSqGrad] = adamupdate(net,gradients,averageGrad,averageSqGrad,iteration);
更新培训进度监视器。
recordMetrics(监控、迭代损失=损失);
updateInfo(监视、时代=时代+的"+ numEpochs);
班长。进度= 100 * iteration/numIterations;
结束
%验证错误
2 = 0;
hasdata (mbq_val)
[X_val, T_val]= next(mbq_val);
如果canUseGPU
X_val = dlarray(single(X_val),“认知行为治疗”);
T_val = gpuArray(T_val);
结束
Y_val = predict(net,X_val);
error = mse(Y_val, T_val)^.5;
2 = 2 + 1;
Rmse_error (ii) = extractdata(gather(error));
% disp (rmse_error (ii))
结束
disp ([“时代”(时代)+ +字符串验证错误(RMSE):,意味着(rmse_error)))
结束
保存(“trainedNetwork_conv1d_submit.mat”“净”
其他的
Lgraph =负载(“trainedNetwork_conv1d.mat”);加载预训练网络
Net = lgraph.net;
结束

第二步:使用三维U-Net模型

接下来,我们使用一个三维U-Net模型,并为其提供形状为[16*12*256*256]的输入。U-Net网络输入的第16个通道是步骤1中生成的标签。你可以在下面的动图中看到关于这个模型的更多细节:
DDWinnersFA22.gif

结果

在下面的图中,您可以看到我们的解决方案框架和最终得分的摘要。
Framework.jpg

关键的外卖

这次比赛为我们提供了在一个新的领域应用深度学习的机会。我们认为,对于这种性质的项目,目的是为卫星图像像素分配值或标签,需要集成模型来实现更好的性能。集成可以包括一个执行逐像素预测的模型和一个考虑周围像素影响的模型(3D U-net)。我们还想强调我们使用MATLAB的自定义网络训练循环的经验,这是灵活和直观的。我们在以前的项目中有使用MATLAB工具箱的经验。我们发现MATLAB深度学习工具箱用户友好,大多数时候我们可以使用文档和MATLAB答案找到问题的解决方案。
我们要感谢MathWorks赞助这次比赛。它提供了一个很好的机会,可以获得与空间和时间方面的卫星图像工作的实际经验,并更多地了解MATLAB的深度学习工具箱功能。

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。