我构建了一个GRU模型,并在同一个模型上比较了三个不同的数据集。我刚刚运行了第一个数据集,并将epoch数设置为25,但我注意到我的验证损失在第6个epoch之后就开始增加,这不是表示过拟合吗?我是不是做错了什么?
import pandas as pdimport tensorflow as tffrom keras.layers.core import Densefrom keras.layers.recurrent import GRUfrom keras.models import Sequentialimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import MinMaxScalerfrom google.colab import filesfrom tensorboardcolab import TensorBoardColab, TensorBoardColabCallbacktbc=TensorBoardColab() # Tensorboarddf10=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.valuesy10_train= df10['Power_kW']y10_train=y10_train.valuesX10_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.valuesy10_test= df2_10['Power_kW']y10_test=y10_test.values# scaling values for modelx_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))# creating model using Kerasmodel10 = Sequential()model10.add(GRU(units=512, return_sequences=True, input_shape=(1,12)))model10.add(GRU(units=256, return_sequences=True))model10.add(GRU(units=256))model10.add(Dense(units=1, activation='sigmoid'))model10.compile(loss=['mse'], optimizer='adam',metrics=['mse']) model10.summary() history10=model10.fit(X10_train, y10_train, batch_size=256, epochs=25,validation_split=0.20, verbose=1, callbacks=[TensorBoardColabCallback(tbc)])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.plot( y10_predicted, label='Predicted')plt.plot( y10_test, label='Measurements')plt.legend()plt.savefig('/content/drive/My Drive/Figures/Power Prediction 10 Percent.png')plt.show()
回答:
LSTM(尽管GRU结构较轻)同样容易过拟合,出了名的。
减少每层中单元的数量(输出大小)(例如第一层32个单元,第二层64个单元);你也可以完全去掉最后一层。
其次,你使用了激活函数’sigmoid
‘,但你的损失函数和度量标准是mse
。
确保你的问题是回归
还是分类
问题。如果确实是回归问题,那么在最后一步激活函数应为’linear
‘。如果是分类问题,你应该将损失函数改为binary_crossentropy
,度量标准改为’accuracy
‘。
因此,目前显示的图表具有误导性。如果你按照我的建议修改后,仍然得到这样的训练-验证损失图,那么我们可以确定你确实存在过拟合的情况。