【问题标题】:Matlab deep learning regressionMatlab 深度学习回归
【发布时间】:2019-08-12 20:25:00
【问题描述】:

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

我写了以下代码:

% 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 是一个最初来自 Matlab 表的 2xn 数组。

这是输出:

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 );

显然发生了一些不正常的事情,因为训练几乎是瞬时的,我无法查看生成的网络。谁能告诉我我做错了什么?或者提供一些调试技巧?

谢谢, 亚当。

【问题讨论】:

  • 感谢整理输出格式!

标签: matlab neural-network deep-learning regression


【解决方案1】:

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

但是,您训练的 netSeriesNetwork,这是一个更新的类,用于深度学习。 networkSeriesNetwork 的函数不能混合使用,因此 view() 在这里不起作用。

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

analyzeNetwork(net)

第二个问题是训练后的RMSE和损失为NaN(not-a-number)。如果没有您的实际数据,其原因很难诊断。

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

any(isnan(training_X(:)))

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

【讨论】:

    【解决方案2】:

    您还应该考虑查看 trainingOptions 中的“InitialLearnRate”参数。默认情况下它是 1e-3,有时需要选择一个较小的值以避免优化爆炸,就像你目前的那样。

    关于回归问题的另一个选项是 trainingOptions 中的“GradientThreshold”选项。设置此项将使用梯度裁剪来防止梯度在训练期间爆炸。这对于使 RMSE 优化表现良好也是有益的/必要的。

    【讨论】:

    • 是的,我意识到渐变存在问题。我切换到“亚当”算法并给它一个降低学习率的时间表。这意味着有合理的收敛。它仍然没有给我有用的结果,但我认为这更多的是与数据而不是算法有关,非常感谢您的帮助!
    猜你喜欢
    • 2018-01-21
    • 2017-01-08
    • 1970-01-01
    • 2020-03-10
    • 2016-10-14
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多