Scikit中的神经网络 - 学习不会产生有意义的结果

时间:2016-08-02 19:19:28

标签: python-3.x scikit-learn neural-network anaconda

我目前正在尝试将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=",")

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

编辑:我忘记添加此内容。如果我将虚拟训练移除到y = x,网络具有相同的行为,但我读到有时你可以通过将其训练到不同但更接近的功能然后使用已经加权的网络作为起点来帮助网络。它没有用,但我还没有把它拿出来。

1 个答案:

答案 0 :(得分:2)

我的建议是减少每层神经元的数量,并增加训练数据集的大小。现在,您需要在网络中训练很多参数,以及一个小型训练集(~10K)。但是,我的答案主要是sklearn可能不是您最终应用的绝佳选择。

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

  

我有一个复杂的问题需要解决,但首先我只是尝试了几个基本的测试来熟悉它。

根据official user guide,sklearn的神经网络实现并不是针对大型应用而设计的,并且在深度学习方面不如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()

这将输出测试数据点的散点图,以及真实曲线图。Keras Quad regression fit

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

看起来您正在使用Windows。 This question可能有助于在Windows上安装Keras。