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