Результаты нейронной сети всегда одинаковы - PullRequest
3 голосов
/ 09 марта 2020

Редактировать: Для всех, кто заинтересован. Я сделал это немного лучше. Я использовал регуляризатор L2 = 0,0001, я добавил два более плотных слоя с 3 и 5 узлами без функций активации. Добавлен doupout = 0,1 для 2-го и 3-го слоев GRU. Уменьшен размер партии до 1000, а также для функции потерь установлено значение mae

Важное примечание: Я обнаружил, что мой кадр данных TEST был чрезвычайно мал по сравнению с Поезд один, и это главная причина, по которой он дал мне очень плохие результаты.

У меня есть модель GRU, которая имеет 12 функций в качестве входных данных, и я пытаюсь предсказать выходную мощность. Я действительно не понимаю, выбираю ли я

  • 1 слой или 5 слоев
  • 50 нейронов или 512 нейронов
  • 10 эпох с небольшим размером партии или 100 эопохов с большим размером партии
  • Различные оптимизаторы и функции активации
  • Перераспределение и повторное масштабирование 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()

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Я сделал это немного лучше. Я использовал регуляризатор L2 = 0,0001, я добавил два более плотных слоя с 3 и 5 узлами без функций активации. Добавлен doupout = 0,1 для 2-го и 3-го слоев GRU. Уменьшен размер партии до 1000, а также для функции потерь установлено значение mae

Важное примечание: я обнаружил, что мой кадр данных TEST был очень маленьким по сравнению с поездом, и это Основная причина, по которой он дал мне очень плохие результаты.

0 голосов
/ 09 марта 2020

Я думаю, что единицы ГРУ очень высоки там. Слишком много единиц GRU может вызвать исчезающую проблему градиента. Для начала я бы выбрал от 30 до 50 единиц ГРУ. Кроме того, немного выше скорость обучения, например, 0,001.

Если набор данных общедоступен, не могли бы вы дать мне ссылку, чтобы я мог поэкспериментировать с этим и сообщить вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...