神经网络结果始终相同
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。 感谢分享数据。您可以逐个更改每个超参数并查看结果。以上是关于神经网络结果始终相同的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在使用 Scikit-Learn Keras 模型函数时,对于相同的网络配置会得到不同的准确度结果?