【发布时间】:2016-12-08 07:14:53
【问题描述】:
我目前正在尝试将 scikit learn 包用于其神经网络功能。我有一个复杂的问题要解决,但一开始我只是尝试一些基本测试来熟悉它。我已经让它做某事,但它没有产生有意义的结果。我的代码:
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,网络具有相同的行为,但我在某处读到,有时您可以通过将网络训练到不同但更接近的功能,然后使用已经加权的网络作为起点来帮助网络。它没有用,但我还没有拿出那一点。
【问题讨论】:
-
您是否对输入数据进行了标准化以及如何初始化权重?
-
这个网络只有一个输入,范围从 -100 到 100。我想我可以尝试将其标准化为 -1 到 1,然后在最后乘以 10,000。我尝试使用 scikit-learn 中的内置功能随机初始化权重,以及使用经过训练以回归 y=x 的网络的热启动。
-
我刚刚尝试将我的输入标准化为 -1,1 并将我的学习率降低了十倍。我还将收敛的容差设置得更低,因为现在误差会成倍增加。该网络现在的训练速度提高了大约 60 倍,但实际上并没有提高其性能,因为所有预测的数据点都大致遵循公式 f(x) = 240x-17000,而不是应该的 x^2
标签: python-3.x scikit-learn neural-network anaconda