Теоретически, нейронная сеть с одним скрытым слоем с m скрытыми узлами может быть обучена с помощью градиентного спуска, чтобы соответствовать n точкам данных с 0 ошибками обучения, где m> = n .
У меня есть 100 точек данных (x, y), x в R и y в R, никакого конкретного шаблона, просто случайный.И я использовал нейронную сеть с одним скрытым слоем с 1000/2000/10000 / ... скрытыми узлами, чтобы соответствовать этим точкам (со стохастическим градиентным спуском и ReLU).
Но я не могу этого достичь.Есть идеи, в чем здесь проблема?
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Activation
from keras.optimizers import SGD
from keras import initializers
## initializing x_train and y_train randomly ##
def f1(x):
if x < 3:
return np.abs(x-1)
else:
return -np.abs(x-1)+4
n = 100
x_train = np.random.uniform(-4+1, 4+1, size = n)
e = np.random.normal(0, 0.5, size = n)
y_train = np.vectorize(f1)(x_train) + e
np.random.shuffle(y_train)
k = 10000 # number of hidden nodes
ep = 5
loss = []
model = Sequential()
model.add(Dense(k, kernel_initializer = 'random_normal', input_shape = (1,), use_bias=True))
model.add(Activation('relu'))
model.add(Dense(1, kernel_initializer = 'random_normal', use_bias=True))
#sgd = SGD(lr=0.00005, decay=1e-6, momentum=0.9)
sgd = SGD(lr=0.00008)
model.compile(loss='mse', optimizer=sgd, metrics = ['mse'])
for i in range(5000):
H = model.fit(x_train, y_train, epochs=ep, verbose=False)
wt = model.get_weights()
temp = H.history['mean_squared_error'][-1]
print(temp)
loss.append(temp)
image