Как приблизить функцию с помощью другой функции - NN - PullRequest
2 голосов
/ 26 мая 2019

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

Итак, моё сомнение заключается в следующем: «Как мне аппроксимировать функцию с использованием нейронных сетей, когда мой ввод - это другие функции?»

Допустим, я хочу приблизительно y = x + 1 , и у меня есть z_1 = 2x, z_2 = 3x + 3 и z_3 = 4x + 1 с x вариант времени. Я хочу, чтобы моя модель выучила отношения между z_1, z_2, z_3 и y , как я могу написать * y = -6 * z_1 - 1 * z_2 + 4 z_3 * (Я хочу, чтобы моя сеть изучала эти отношения).

Со времени 0 до T У меня есть значение всех функций и я могу учиться под наблюдением, но с (T + 1) + у меня будет только z_1, z_2 и z_3 и так, я буду использовать сеть для аппроксимации будущих значений y на основе этих функций z (z_1, z_2, z_3 ) .

Как мне реализовать это на python, используя Keras? Я использовал следующий код, но не получил приличных результатов.

import numpy as np
import matplotlib.pyplot as plt
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop

n = 10000

def z_1(x):
    x_0 = []
    for i in x:
        x_0.append(2*i)
    return x_0

def z_2(x):
    x_0 = []
    for i in x:
        x_0.append(3*i + 3)
    return x_0

def z_3(x):
    x_0 = []
    for i in x:
        x_0.append(4* i + 1)
    return x_0

def z_0(x):
    x_0 = []
    for i in x:
        x_0.append(i + 1)
    return x_0

model = Sequential()
model.add(Dense(500, activation='relu', input_dim=3))
model.add(Dense(500, activation='relu'))
model.add(Dense(1, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

np.random.seed(seed = 2000)
input = np.random.random(n) * 10

dataset = z_0(input)
input_1 = z_1(input)
input_2 = z_2(input)
input_3 = z_3(input)

x_train = np.array([input_1[0:int(0.8*n)], input_2[0:int(0.8*n)], input_3[0:int(0.8*n)]])
y_train = np.array([dataset[0:int(0.8*n)]])
x_train = x_train.reshape(int(0.8*n), 3)
y_train = y_train.reshape(int(0.8*n),1)

es = keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

model.fit(x_train, y_train, epochs=100, batch_size=128, callbacks = [es])


x_test = np.array([input_1[int(n-100):n], input_2[int(n-100):n], input_3[int(n-100):n]])
x_test = x_test.reshape(int(100), 3)

classes = model.predict(x_test, batch_size=128)

y_test = np.array([dataset[int(n-100):n]]).reshape(int(100),1)
plt.plot(y_test,c='b', label = 'test data')
plt.plot(classes,c='r', label = 'test result')
plt.legend()
plt.show()

1 Ответ

1 голос
/ 11 июня 2019

Вы не можете сделать это с помощью нейронной сети с прямой связью.Вы должны сделать это с помощью повторяющихся нейронных сетей.Посмотрите ячейки LSTM или GRU в Керасе.

https://keras.io/layers/recurrent/

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