在一个用pybrain训练来近似一个函数的网络中,输出总是相等的

2024-09-29 21:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下代码:

tf = open('defl_07h.csv','r')

for line in tf.readlines():
    data = [float(x) for x in line.strip().split(';') if x != '']
    indata =  tuple(data[:1])
    outdata = tuple(data[1:])
    ds.addSample(indata,outdata)

net = buildNetwork(ds.indim,20,ds.outdim,recurrent=True)
t = BackpropTrainer(net,learningrate=0.01,momentum=0.5,verbose=True)
t.trainOndataset(ds,10)
t.testOnData(verbose=True)

获得如下相同的输出:

出局:[3.479] 正确:[11.86] 错误:35.12389858 出局:[3.479] 正确:[12.1] 错误:37.16423359 出局:[3.479] 正确:[12.28] 错误:38.73228485

然后网络结构产生了:

^{pr2}$

哪里会出错?在


Tags: 代码intrueforverbosedatanettf
1条回答
网友
1楼 · 发布于 2024-09-29 21:20:36

我看到你的代码样本有一些问题,它们导致你的网络没有学到任何有意义的东西。以下是您的代码存在的一些问题:

  1. 你的数据没有标准化!神经网络对输入的数据范围很敏感。在您的例子中,您提供了一个范围,最小值为~2500,最大值为~36000,此时您的输入和目标应规范化为-1,1或0,1范围(取决于您使用的是Tanh还是Sigmoid)。在
  2. 您选择了BackpropTrainer,它通常需要训练超过10个时代。试试100或1000。(或者试试RPromMinusTrainer,这是我个人喜欢的。)

这两个问题都导致你的网络只能学习输出一个值。在

我对您的代码做了一点修改,以包含规范化和RPropMinusTrainer以及相当数量的迭代(RProp-需要更少的时期):

from pybrain.supervised.trainers import *
from pybrain.tools.shortcuts import buildNetwork
from pybrain.datasets import SupervisedDataSet, SequentialDataSet
from pybrain.structure import RecurrentNetwork
from pybrain.structure import TanhLayer
import numpy as np

ds = SupervisedDataSet(1, 1)

tf = open('defl_07h.csv','r')

for line in tf.readlines():
    data = [float(x) for x in line.strip().split(';') if x != '']
    indata =  tuple(data[:1])
    outdata = tuple(data[1:])
    ds.addSample(indata,outdata)

i = np.array([d[0] for d in ds])
i /= np.max(np.abs(i),axis=0)
o = np.array([d[1] for d in ds])
o /= np.max(np.abs(o),axis=0)

nds = SupervisedDataSet(1, 1)
for ix in range(len(ds)):
    nds.addSample( i[ix], o[ix])

# train with normalized
net = buildNetwork(nds.indim,5,nds.outdim,recurrent=True)
t = RPropMinusTrainer(net,verbose=True)
t.trainOnDataset(nds,30)
t.testOnData(nds, verbose=True)

我得到以下输出:

^{pr2}$

不是完美的,但是预测会随着实际的标准化值而增加,就像原始的(预标准化的)数据一样。在

附言:我知道这是一个老问题,但我以前也遇到过这个问题,认为它可能会对某些人有所帮助。所以,如果你在神经网络的战壕里却一无所获,记得问问自己:我的神经网络需要标准化的数据吗?我训练够了吗?在

相关问题 更多 >

    热门问题