Приближение функции нейронной сети Кераса - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь приблизить следующую функцию: enter image description here

но мой лучший результат выглядит так:

enter image description here (функция потерь справа) Я пробовал даже с эпохами 50 тысяч, похожие результаты.

Модель:

model = Sequential()
model.add(Dense(40, input_dim=1,kernel_initializer='he_normal', activation='relu'))
model.add(Dense(20, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1,input_dim=1, activation=activation_fun))
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape', 'cosine'])
history = model.fit(x, y, batch_size=32, epochs=5000, verbose=0)

preds = model.predict(x_test)
prettyPlot(x,y,x_test,preds,history,'linear',5000)
model.summary()

Функция prettyPlot создает графики.

Как я могу добиться лучших результатов без изменения топологии NN? Я не хочу, чтобы это было большим или широким. Я хочу использовать еще меньше скрытых слоев и нейронов, если это возможно.

Функция, которую я хочу аппроксимировать:

def fun(X):
    return math.sin(1.2*X + 0.5) + math.cos(2.5*X + 0.2) + math.atan(2*X + 1) -  math.cos(2*X + 0.5) 

образцы:

range = 20
x = np.arange(0, range, 0.01).reshape(-1,1)
y = np.array(list(map(fun, x))).reshape(-1,1)

x_test = (np.random.rand(range*10)*range).reshape(-1,1)
y_test = np.array(list(map(fun, x_test))).reshape(-1,1)

Затем y и y_test нормализуются с помощью MinMaxScaler.

scalerY= MinMaxScaler((0,1))
scalerY.fit(y)
scalerY.fit(y_test)
y = scalerY.transform(y)
y_test = scalerY.transform(y_test)

Функция активации в последнем слое является линейной.

1 Ответ

0 голосов
/ 11 июня 2019

Если у вас все еще есть проблемы с точностью, попробуйте использовать много точек данных, таких как 10k-100k.

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