首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab深度学习回归

Matlab深度学习回归
EN

Stack Overflow用户
提问于 2019-03-22 05:37:21
回答 2查看 1K关注 0票数 2

我正在尝试用Matlab构建我自己的回归网络。虽然到目前为止我得到的东西看起来有点无意义,但我确实想稍后将其扩展到一个稍微不寻常的网络中,所以我正在自己做,而不是从货架上拿到一些东西。

我写了以下代码:

代码语言:javascript
复制
% splitinto dev, val and test sets
[train_idxs,val_idxs,test_idxs] = dividerand(size(X,2));

training_X = X( : , train_idxs );
training_Y = Y( : , train_idxs );

val_X = X( : , val_idxs );
val_Y = Y( : , val_idxs );

test_X = X( : , test_idxs );
test_Y = Y( : , test_idxs );

input_count = size( training_X , 1 );
output_count = size( training_Y , 1 );

layers = [ ...
    sequenceInputLayer(input_count)
    fullyConnectedLayer(16)
    reluLayer
    fullyConnectedLayer(8)
    reluLayer
    fullyConnectedLayer(4)
    reluLayer
    fullyConnectedLayer(output_count)
    regressionLayer
    ];

options = trainingOptions('sgdm', ...
    'MaxEpochs',8, ...
    'MiniBatchSize', 1000 , ...
    'ValidationData',{val_X,val_Y}, ...
    'ValidationFrequency',30, ...
    'ValidationPatience',5, ...
    'Verbose',true, ...
    'Plots','training-progress');

size( training_X )
size( training_Y )
size( val_X )
size( val_Y )

layers

net = trainNetwork(training_X,training_Y,layers,options);

view( net );

pred_Y = predict(net,test_X)

我不能分享X和Y实际上是什么,但是输入X是一个3xn的双精度数组,输出是Y是一个2xn的数组,它最初来自Matlab表。

下面是输出:

代码语言:javascript
复制
ans =
       3      547993

ans =
       2      547993

ans =
       3      117427

ans =
       2      117427

layers = 
  9x1 Layer array with layers:

     1   ''   Sequence Input      Sequence input with 3 dimensions
     2   ''   Fully Connected     16 fully connected layer
     3   ''   ReLU                ReLU
     4   ''   Fully Connected     8 fully connected layer
     5   ''   ReLU                ReLU
     6   ''   Fully Connected     4 fully connected layer
     7   ''   ReLU                ReLU
     8   ''   Fully Connected     2 fully connected layer
     9   ''   Regression Output   mean-squared-error


Training on single CPU.
|======================================================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Validation  |  Mini-batch  |  Validation  |  Base Learning  |
|         |             |   (hh:mm:ss)   |     RMSE     |     RMSE     |     Loss     |     Loss     |      Rate       |
|======================================================================================================================|
|       1 |           1 |       00:00:02 |         0.88 |      4509.94 |       0.3911 |   1.0170e+07 |          0.0100 |
|       8 |           8 |       00:00:04 |          NaN |          NaN |          NaN |          NaN |          0.0100 |
|======================================================================================================================|
Error using view (line 73)
Invalid input arguments

Error in layer (line 85)
view( net );

很明显,一些病态的东西正在发生,因为训练几乎是瞬间的,我看不到结果网络。有人能告诉我我哪里做错了吗?或者给出一些调试技巧?

谢谢,亚当。

EN

回答 2

Stack Overflow用户

发布于 2019-03-22 15:52:07

这里有两个问题:第一个问题是,调用view(net)失败。原因是view()函数只对network对象有效。多年来,network类和相应的方法一直是神经网络工具箱的一部分,旨在用于浅层的“经典”神经网络。

然而,您训练过的net是一个SeriesNetwork,这是一个用于深度学习的新得多的类。您不能将networkSeriesNetwork的函数混合在一起,因此view()在这里不起作用。

有一个名为analyzeNetwork()的类似功能,可以以图形方式查看和分析SeriesNetwork格式的深度神经网络:

代码语言:javascript
复制
analyzeNetwork(net)

第二个问题是训练后的均方根误差和损失是NaN (不是一个数字)。没有您的实际数据,很难诊断原因。

一个可能的原因是:在输入或输出中有包含NaN的数据。您可以使用isnan()函数进行检查:

代码语言:javascript
复制
any(isnan(training_X(:)))

如果不是这样,那么您可以例如检查权重和偏差初始化或学习率。

票数 3
EN

Stack Overflow用户

发布于 2019-03-23 01:48:11

您还应该考虑查看trainingOptions中的'InitialLearnRate‘参数。默认情况下是1e-3,有时需要选择一个较小的值,以避免优化失败,就像你现在这样。

另一个需要考虑回归问题的选项是trainingOptions中的'GradientThreshold‘选项。设置此选项将使用渐变裁剪,以防止在训练期间发生渐变爆炸。这在使RMSE优化运行良好方面也是有益的/必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55289626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档