神经网络在输入变化时返回相同输出

我正在尝试制作一个可以从其他程序导入的神经网络Python模块。我用kaggle上的某些数据来测试这个模块。然而,无论输入是什么,输出几乎总是相同的,误差在1e-7以内!!我已经对数据进行了归一化,并且尝试增加了更多的隐藏层和更多的隐藏节点。我还降低了学习率,并且在训练过程中使其进一步降低。我尝试添加偏置,但这产生了负面效果

这里是可导入的hidden_net.py模块:

class network:    def __init__(self,layer_num,learning_rate=0.7,seed=None,logistic_coefficent=0.9):        self.logistic_coefficent=logistic_coefficent        self.learning_rate=learning_rate        self.w0 = np.random.random((layer_num[0],layer_num[1]))        self.w1 = np.random.random((layer_num[1],layer_num[2]))        np.random.seed(seed)    def sigmoid(self,x,reverse=False):            if(reverse==True):                return x*(1-x)            return 1/(1+np.exp(-x))    def train(self,inps,outs,mod_learn_rate=0):        if mod_learn_rate == 0:            mod_learn_=self.learning_rate        inps=np.array(inps)        layer0 = inps        layer1 = self.sigmoid(np.dot(layer0,self.w0))        layer2 = self.sigmoid(np.dot(layer1,self.w1))        layer2_error = outs - layer2        layer2_delta = layer2_error*self.sigmoid(layer2,reverse=True)#*mod_learn_rate        layer1_error = layer2_delta.dot(self.w1.T)        layer1_delta = layer1_error * self.sigmoid(layer1,reverse=True)#*mod_learn_rate        self.w1 += layer2.T.dot(layer2_delta)        self.w0 += layer1.T.dot(layer1_delta)        return np.mean(abs(layer2_error))    def calcout(self,inp):        inp=np.array(inp)        layer0=inp        layer1=self.sigmoid(np.dot(layer0,self.w0))        out=self.sigmoid(np.dot(layer1,self.w1))        return out

以及导入该模块的脚本:

import randomfrom numpy import meanrandom.seed(50404)op=open('Mall_Customers_Mod.txt','r')full=op.read()op.close()full_lines=full.split('\n')training_lines=random.sample(full_lines,175)training_inputs=[]training_outputs=[]for j in training_lines:    training_inputs.append([float(j.split(',')[0]),float(j.split(',')[1]),float(j.split(',')[2])])    training_outputs.append(float(j.split(',')[3]))testing_lines=random.sample(full_lines,175)testing_inputs=[]testing_outputs=[]for l in testing_lines:    testing_inputs.append([float(l.split(',')[0]),float(l.split(',')[1]),float(j.split(',')[2])])    testing_outputs.append(float(l.split(',')[3]))nn=hidden_net.network([3,9,1],seed=50404,learning_rate=10)er=[]txt=''try:    for i in range(10000):        for l in range(len(training_inputs)):            er.append(nn.train(training_inputs[l],training_outputs[l],10/(i+1)))        if (i%1000==0 or i==1 or i==0 or i==2):            print('epoch:{}\nerror:{}\nlearning_rate={}'.format(i,mean(er),10/(i+1)))            txt=txt+'\nepoch:{}\nerror:{}'.format(i,mean(er))            er=[]except KeyboardInterrupt:    passprint('done!')score=0error=[]tests=0for i in range(len(testing_inputs)):    print('net output: ' +str(nn.calcout(testing_inputs[i])))    print('true output: '+str(testing_outputs[i]))    error.append(abs(nn.calcout(testing_inputs[i]) - testing_outputs[i]))print('error: {}'.format(mean(error)))print('\n\nweights:{}'.format(nn.w0))

归一化后的数据格式为

Sex     Age          Income  Spending Score0,0.019230769230769232,0.0,0.38775510204081630,0.057692307692307696,0.0,0.81632653061224491,0.038461538461538464,0.00819672131147541,0.051020408163265311,0.09615384615384616,0.00819672131147541,0.77551020408163261,0.25,0.01639344262295082,0.3979591836734694

我本以为输出会有所不同,但事实并非如此

net output: [0.49777196]true output: 0.3979591836734694net output: [0.49999907]true output: 0.8571428571428571net output: [0.49997918]true output: 0.7346938775510204net output: [0.49983941]true output: 0.30612244897959184net output: [0.49999985]

这似乎是神经网络中一个相当常见的错误,原因有很多。我本想增加悬赏但我负担不起。尝试了各种方法很久了,希望你们中的某一位能解决这个问题!提前感谢,3NiGMa


回答:

你的学习率对于你的数据集大小来说太高了,试着将其提高到0.1或1,这样你的权重可以更快地变化

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注