Итак, существует универсальная теорема аппроксимации, которая гласит, что нейронная сеть может аппроксимировать любую непрерывную функцию, если она имеет хотя бы один скрытый слой и использует там нелинейную активацию.
Итак, моё сомнение заключается в следующем: «Как мне аппроксимировать функцию с использованием нейронных сетей, когда мой ввод - это другие функции?»
Допустим, я хочу приблизительно 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()