Modelo keras para ajustar polinomio.

Generé algunos datos de un polinomio de cuarto grado y quise crear un modelo de regresión en Keras para ajustarlo a este polinomio. El problema es que las predicciones después del ajuste parecen ser básicamente lineales. Como esta es la primera vez que trabajo con redes neuronales, asumo que cometí un error muy trivial y estúpido.

Aquí está mi código:

model = Sequential() model.add(Dense(units=200, input_dim=1)) model.add(Activation('relu')) model.add(Dense(units=45)) model.add(Activation('relu')) model.add(Dense(units=1)) model.compile(loss='mean_squared_error', optimizer='sgd') model.fit(x_train, y_train, epochs=20, batch_size=50) loss_and_metrics = model.evaluate(x_test, y_test, batch_size=100) classes = model.predict(x_test, batch_size=1) 

x_train y y_train son matrices numpy que contienen las primeras 9900 entradas de este archivo .

Probé diferentes tamaños de lote, número de épocas, tamaños de capa y cantidades de datos de entrenamiento. Nada parece ayudar.

Por favor, señale todo lo que ve que no tiene sentido!

Las redes neuronales generalmente no hacen un buen trabajo extrapolando funciones polinomiales. Sin embargo, si sus datos de entrenamiento y pruebas son del mismo rango, podría lograr resultados bastante buenos. Generé algunos datos y utilicé tu código:

 import numpy as np x_train=np.random.rand(9000) y_train=x_train**4+x_train**3-x_train x_train=x_train.reshape(len(x_train),1) x_test=np.linspace(0,1,100) y_test=x_test**4+x_test**3-x_test x_test=x_test.reshape(len(x_test),1) model = Sequential() model.add(Dense(units=200, input_dim=1)) model.add(Activation('relu')) model.add(Dense(units=45)) model.add(Activation('relu')) model.add(Dense(units=1)) model.compile(loss='mean_squared_error', optimizer='sgd') model.fit(x_train, y_train, epochs=40, batch_size=50, verbose=1) loss_and_metrics = model.evaluate(x_test, y_test, batch_size=100) classes = model.predict(x_test, batch_size=1) test=x_test.reshape(-1) plt.plot(test,classes,c='r') plt.plot(test,y_test,c='b') plt.show() 

Tenga en cuenta que aumenté las epochs a 40 para obtener más iteraciones y resultados más precisos. También puse verbose = 1 para poder ver cómo se comporta la pérdida. De hecho, la pérdida está disminuyendo hasta 7.4564e-04 , y debajo está el resultado que obtengo. La línea roja es la predicción de la red, y la línea azul es el valor correcto. Se puede ver que están muy cerca uno del otro.

introduzca la descripción de la imagen aquí