神经网络正弦近似

use*_*298 1 python machine-learning neural-network deep-learning keras

在花费数天未能使用神经网络进行 Q 学习之后,我决定回归基础并做一个简单的函数近似,看看一切是否正常工作,以及一些参数如何影响学习过程。这是我想出的代码

from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
import random
import numpy
from sklearn.preprocessing import MinMaxScaler

regressor = Sequential()
regressor.add(Dense(units=20, activation='sigmoid', kernel_initializer='uniform', input_dim=1))
regressor.add(Dense(units=20, activation='sigmoid', kernel_initializer='uniform'))
regressor.add(Dense(units=20, activation='sigmoid', kernel_initializer='uniform'))
regressor.add(Dense(units=1))
regressor.compile(loss='mean_squared_error', optimizer='sgd')
#regressor = ExtraTreesRegressor()

N = 5000
X = numpy.empty((N,))
Y = numpy.empty((N,))

for i in range(N):
    X[i] = random.uniform(-10, 10)
X = numpy.sort(X).reshape(-1, 1)

for i in range(N):
    Y[i] = numpy.sin(X[i])
Y = Y.reshape(-1, 1)

X_scaler = MinMaxScaler()
Y_scaler = MinMaxScaler()
X = X_scaler.fit_transform(X)
Y = Y_scaler.fit_transform(Y)

regressor.fit(X, Y, epochs=2, verbose=1, batch_size=32)
#regressor.fit(X, Y.reshape(5000,))

x = numpy.mgrid[-10:10:100*1j]
x = x.reshape(-1, 1)
y = numpy.mgrid[-10:10:100*1j]
y = y.reshape(-1, 1)
x = X_scaler.fit_transform(x)

for i in range(len(x)):
    y[i] = regressor.predict(numpy.array([x[i]]))

plt.figure()
plt.plot(X_scaler.inverse_transform(x), Y_scaler.inverse_transform(y))
plt.plot(X_scaler.inverse_transform(X), Y_scaler.inverse_transform(Y))
Run Code Online (Sandbox Code Playgroud)

问题是我所有的预测值都在 0 左右。如您所见,我使用了 sklearn(注释行)中的 ExtraTreesRegressor 来检查协议是否确实正确。那么我的神经网络有什么问题呢?为什么它不起作用?

(我试图解决的实际问题是使用神经网络计算山地车问题的 Q 函数。它与这个函数逼近器有什么不同?)

des*_*aut 5

有了这些变化:

  • 激活到 relu
  • 删除kernel_initializer(即保留默认值 'glorot_uniform'
  • 亚当优化器
  • 100个时代

IE

regressor = Sequential()
regressor.add(Dense(units=20, activation='relu', input_dim=1)) 
regressor.add(Dense(units=20, activation='relu')) 
regressor.add(Dense(units=20, activation='relu')) 
regressor.add(Dense(units=1))
regressor.compile(loss='mean_squared_error', optimizer='adam')

regressor.fit(X, Y, epochs=100, verbose=1, batch_size=32)
Run Code Online (Sandbox Code Playgroud)

其余代码不变,结果如下:

在此处输入图片说明

廷克,一次又一次……