Scikit-Learn 中的神经网络未产生有意义的结果

Neural Network In Scikit-Learn not producing meaningful results

我目前正在尝试使用 scikit 学习包来实现其神经网络功能。我有一个复杂的问题需要解决,但首先我只是尝试一些基本测试来熟悉它。我已经让它做了一些事情,但它没有产生有意义的结果。我的代码:

import sklearn.neural_network.multilayer_perceptron as nnet
import numpy
def generateTargetDataset(expression="%s", generateRange=(-100,100), s=1000):
    expression = expression.replace("x", "%s")    
    x = numpy.random.rand(s,)
    y = numpy.zeros((s,), dtype="float")
    numpy.multiply(x, abs(generateRange[1]-generateRange[0]), x)
    numpy.subtract(x, min(generateRange), x)
    for z in range(0, numpy.size(x)):
        y[z] = eval(expression % (x[z]))
    x = x.reshape(-1, 1)
    outTuple = (x, y)
    return(outTuple)
print("New Net + Training")
QuadRegressor = nnet.MLPRegressor(hidden_layer_sizes=(10), warm_start=True, verbose=True, learning_rate_init=0.00001, max_iter=10000, algorithm="sgd", tol=0.000001)
data = generateTargetDataset(expression="x**2", s=10000, generateRange=(-1,1))
QuadRegressor.fit(data[0], data[1])
print("Net Trained")
xt = numpy.random.rand(10000, 1)
yr = QuadRegressor.predict(xt)
yr = yr.reshape(-1, 1)
xt = xt.reshape(-1, 1)
numpy.multiply(xt, 100, xt)
numpy.multiply(yr, 10000, yr)
numpy.around(yr, 2, out=yr)
numpy.around(xt, 2, out=xt)
out = numpy.concatenate((xt, yr), axis=1)
numpy.set_printoptions(precision=4)
numpy.savetxt(fname="C:\SCRATCHDIR\numpydump.csv", X=out, delimiter=",")

我不明白如何 post 它给我的数据,但对于 0 到 100 之间的所有输入,它吐出 7000 到 10000 之间的数据。它似乎正确地映射到非常接近顶部的范围,但对于接近 0 的输入,它只是 returns 接近 7000 的东西。

编辑:我忘了添加这个。如果我删除对 y=x 的虚拟训练,网络具有相同的行为,但我在某处读到,有时您可以通过将网络训练到不同但更接近的功能,然后使用已经加权的网络作为起点来帮助网络。它没有用,但我还没有把它拿出来。

我的建议是减少每层的神经元数量,并增加训练数据集的大小。现在,您有很多参数需要在您的网络中训练,并且训练集很小(~10K)。但是,我回答的要点是 sklearn 可能不是您最终应用程序的最佳选择。

你有一个复杂的问题想用神经网络解决吗?

I have a complex problem to solve with it, but to start out I am just trying a couple of basic tests to familiarize myself with it.

根据official user guide, sklearn's implementation of neural networks isn't designed for large applications and is a lot less flexible than other options进行深度学习。

我使用过的 Python 深度学习库 keras 是一个模块化、易于使用的库,支持 GPU。

这是我编写的示例,用于训练单个感知器进行二次回归。

from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD
import numpy as np
import matplotlib.pyplot as plt

model = Sequential()
model.add(Dense(1, init = 'uniform', input_dim=1))
model.add(Activation('sigmoid'))


model.compile(optimizer = SGD(lr=0.02, decay=1e-6, momentum=0.9, nesterov=True), loss = 'mse')

data = np.random.random(1000)
labels = data**2

model.fit(data.reshape((len(data),1)), labels, nb_epoch = 1000, batch_size = 128, verbose = 1)

tdata = np.sort(np.random.random(100))
tlabels = tdata**2

preds = model.predict(tdata.reshape((len(tdata), 1)))

plt.plot(tdata, tlabels)
plt.scatter(tdata, preds)
plt.show()

这将输出测试数据点的散点图以及真实曲线图。

如您所见,结果是合理的。一般来说,神经网络很难训练,在我让这个例子工作之前我不得不做一些参数调整。

您似乎在使用 Windows。 可能有助于在 Windows 上安装 Keras。