神经网络结果始终相同

Posted

技术标签:

【中文标题】神经网络结果始终相同【英文标题】:Neural Network Results always the same 【发布时间】:2020-06-21 06:52:58 【问题描述】:

编辑:对于任何感兴趣的人。我让它稍微好一点。我使用了 L2 正则化器 = 0.0001,我添加了两个更密集的层,具有 3 个和 5 个节点,没有激活函数。为第 2 和第 3 GRU 层添加了 doupout=0.1。将批量大小减少到 1000,并将损失函数设置为 mae

重要提示:我发现我的 TEST 数据框 w 与火车一相比非常小,这是它给我带来非常糟糕结果的主要原因。

我有一个 GRU 模型,它有 12 个特征作为输入,我正在尝试预测输出功率。我真的不明白我是否选择

1 层或 5 层 50 个神经元或 512 个神经元 10 个小批量的 epoch 或 100 个大批量的 epoch 不同的优化器和激活函数 Dropput 和 L2 正则化 添加更密集的层。 提高和降低学习率

我的结果总是一样的,没有任何意义,我的损失和 val_loss 损失在前 2 个时期非常陡峭,然后在其余时间它变得恒定,而 val_loss 的波动很小

这是我的代码和损失图,如果需要,还有我的数据框:

数据框1:https://drive.google.com/file/d/1I6QAU47S5360IyIdH2hpczQeRo9Q1Gcg/view 数据框2:https://drive.google.com/file/d/1EzG4TVck_vlh0zO7XovxmqFhp2uDGmSM/view

import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from google.colab import files
from tensorboardcolab import TensorBoardColab, TensorBoardColabCallback
tbc=TensorBoardColab() # Tensorboard
from keras.layers.core import Dense
from keras.layers.recurrent import GRU
from keras.models import Sequential
from keras.callbacks import EarlyStopping
from keras import regularizers
from keras.layers import Dropout





df10=pd.read_csv('/content/drive/My Drive/Isolation Forest/IF 10 PERCENT.csv',index_col=None)
df2_10= pd.read_csv('/content/drive/My Drive/2019 Dataframe/2019 10minutes IF 10 PERCENT.csv',index_col=None)

X10_train= df10[['WindSpeed_mps','AmbTemp_DegC','RotorSpeed_rpm','RotorSpeedAve','NacelleOrientation_Deg','MeasuredYawError','Pitch_Deg','WindSpeed1','WindSpeed2','WindSpeed3','GeneratorTemperature_DegC','GearBoxTemperature_DegC']]
X10_train=X10_train.values

y10_train= df10['Power_kW']
y10_train=y10_train.values

X10_test= df2_10[['WindSpeed_mps','AmbTemp_DegC','RotorSpeed_rpm','RotorSpeedAve','NacelleOrientation_Deg','MeasuredYawError','Pitch_Deg','WindSpeed1','WindSpeed2','WindSpeed3','GeneratorTemperature_DegC','GearBoxTemperature_DegC']]
X10_test=X10_test.values

y10_test= df2_10['Power_kW']
y10_test=y10_test.values




# scaling values for model


x_scale = MinMaxScaler()
y_scale = MinMaxScaler()

X10_train= x_scale.fit_transform(X10_train)
y10_train= y_scale.fit_transform(y10_train.reshape(-1,1))
X10_test=  x_scale.fit_transform(X10_test)
y10_test=  y_scale.fit_transform(y10_test.reshape(-1,1))


X10_train = X10_train.reshape((-1,1,12)) 
X10_test = X10_test.reshape((-1,1,12))



Early_Stop=EarlyStopping(monitor='val_loss', patience=3 , mode='min',restore_best_weights=True)



# creating model using Keras
model10 = Sequential()
model10.add(GRU(units=200, return_sequences=True, input_shape=(1,12),activity_regularizer=regularizers.l2(0.0001)))
model10.add(GRU(units=100, return_sequences=True))
model10.add(GRU(units=50))
#model10.add(GRU(units=30))
model10.add(Dense(units=1, activation='linear'))
model10.compile(loss=['mse'], optimizer='adam',metrics=['mse']) 
model10.summary() 

history10=model10.fit(X10_train, y10_train, batch_size=1500,epochs=100,validation_split=0.1, verbose=1, callbacks=[TensorBoardColabCallback(tbc),Early_Stop])


score = model10.evaluate(X10_test, y10_test)
print('Score: '.format(score))



y10_predicted = model10.predict(X10_test)
y10_predicted = y_scale.inverse_transform(y10_predicted)

y10_test = y_scale.inverse_transform(y10_test)


plt.scatter( df2_10['WindSpeed_mps'], y10_test, label='Measurements',s=1)
plt.scatter( df2_10['WindSpeed_mps'], y10_predicted, label='Predicted',s=1)
plt.legend()
plt.savefig('/content/drive/My Drive/Figures/we move on curve6 IF10.png')
plt.show()

【问题讨论】:

看起来“学习”已经饱和了。训练集和验证集的大小是多少? 运行代码时,训练 8140477 个样本,验证 904498 个样本。 可能是局部最小值的模型堆栈?我会尝试提高学习率,看看它是否表现不同。此外,从 50 个 GRU 单元到 1 个 Dense 单元似乎是一大步,尝试在其间放置另一个 Dense 层和/或一些 Dropout 如果中间的 Dense 层也有 1 个单位,我选择了 1 个单位,因为功率是唯一可以预测的? @AliYoussef 拥有第二个密集层的目的是为了从 50 个节点过渡到一个更平滑的节点,所以我会尝试 5-15 个节点的路线,输出节点将保持为是不是因为,正如你所说,你有一个输出。我认为像你一样添加辍学是很好的。看看改变学习率是否有帮助也很有趣,你试过了吗? 【参考方案1】:

我做得稍微好一点。我使用了 L2 正则化器 = 0.0001,我添加了两个更密集的层,具有 3 个和 5 个节点,没有激活函数。为第 2 和第 3 GRU 层添加了 doupout=0.1。将批量大小减少到 1000,并将损失函数设置为 mae

重要提示:我发现我的 TEST 数据帧与火车相比非常小,这是它给我带来非常糟糕结果的主要原因。

【讨论】:

【参考方案2】:

我认为那里的 GRU 单位非常高。太多的 GRU 单元可能会导致梯度消失问题。首先,我会选择 30 到 50 个单位的 GRU。此外,更高的学习率 e。 G。 0.001。

如果数据集是公开可用的,请给我链接,以便我可以对此进行试验并通知您。

【讨论】:

我现在就这样做,我是否应该添加另一个密集层,是否应该在第二层添加 0.1 的 dropout 以及我是否应该使用 l2 正则化。此外,这是具有所有 12 个功能的第一个数据帧的 link 和具有电源功能的数据帧2 的 link。 感谢分享数据。您可以逐个更改每个超参数并查看结果。

以上是关于神经网络结果始终相同的主要内容,如果未能解决你的问题,请参考以下文章

结果始终为零

相同训练测试集的 ANN 不同结果

使用神经网络进行数字识别的具体示例

为啥我在使用 Scikit-Learn Keras 模型函数时,对于相同的网络配置会得到不同的准确度结果?

用于 Keras 中句子相似性的具有 LSTM 的连体网络定期给出相同的结果

为啥 LogisticRegression 和 MLPClassifier 不产生相同的结果?