我正在使用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
在从我的_模型中提取相关参数时,我是否跳过了另一个权重/偏差?我在重建中的行动顺序有缺陷吗?
1条答案
按热度按时间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中完成的因此,最终的公式是: