在MatLab中重构SkLearning MLP回归

a7qyws3x  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(166)

我正在使用SkLearning对12个特征和1个输出进行多层感知器回归训练。StandardScalar()适合训练数据并应用于所有输入数据。经过一段时间的架构优化培训后,我得到了一个似乎相当准确的模型(误差小于10%)。我现在需要提取权重和偏差,以便在与人交互的系统上实时实现预测。这是通过对权重使用my_Model.coef_,对偏差使用my_Model.intercepts来完成的。权重根据我的模型中的节点数进行了适当的调整,而偏差对于每一层都有适当的长度。
现在的问题是,我在MatLab中实现了矩阵代数,得到的预测结果与my_Model.Forecast()产生的结果大相径庭。
我对2层MLP(第一层有11个节点,第二层有10个节点)的重建过程:

scale()             % elementwise subtract feature mean and divide by feature stdev
scaled_obs = scale(raw_obs)  
% Up to this point results from MatLab == Sklearn

weight1 = [12x11]   % weights to transition from the input layer to the first hidden layer
weight2 = [11x10]
weight3 = [10x1]
bias1 = [11x1]      % bias to add to the first layer after weight1 has been applied
bias2 = [10x1]
bias3 = [1x1]

my_prediction = ((( scaled_obs * w1 + b1') * w2  + b2') * w3  + b3);

我也试过了

my_prediction2 = ((( scaled_obs * w1 .* b1') * w2  .* b2') * w3  .* b3);   % because nothing worked...```

对于我的特定数据:

Sklearn prediction = 1.731
my_prediction = -50.347
my_prediction2 = -3.2075

在从我的_模型中提取相关参数时,我是否跳过了另一个权重/偏差?我在重建中的行动顺序有缺陷吗?

ao218c7q

ao218c7q1#

在我看来my_prediction = ((( scaled_obs * w1 + b1') * w2 + b2') * w3 + b3);是正确的,但只有一个缺失的部分,那就是激活功能。您为该模型传递的激活函数是什么。默认情况下,从第一层到倒数第三层(含),MLPRegressor具有relu作为激活函数。倒数第二层没有任何激活功能。和输出层有一个单独的激活函数,它是identity函数,基本上是f(x) = x函数,所以你不需要为此做任何事情。
如果您选择了relu,或者您根本没有选择激活(那么relu是默认的),那么您必须在NumPy中执行类似于np.maximum(0, your_layer1_calculation)的操作,我不确定这是如何在matlab中完成的
因此,最终的公式是:

layer1 = np.dot(scaled_inputs, weight0) + bias0
layer2 = np.dot(np.maximum(0, layer1), weight1) + bias1
layer......
layer(n-1) = np.dot(np.maximum(0, layer(n-2), weight(n-1)) + bias(n-1)
layer(n) = layer(n-1) # identity function

相关问题