python - 尽管输入发生变化,神经网络仍返回相同的输出

标签 python python-3.x machine-learning neural-network

我正在尝试制作一个可以从其他程序导入的神经网络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 random
from numpy import mean
random.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:
    pass
print('done!')
score=0
error=[]
tests=0
for 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 Score
0,0.019230769230769232,0.0,0.3877551020408163
0,0.057692307692307696,0.0,0.8163265306122449
1,0.038461538461538464,0.00819672131147541,0.05102040816326531
1,0.09615384615384616,0.00819672131147541,0.7755102040816326
1,0.25,0.01639344262295082,0.3979591836734694

我预计输出会有所不同,但事实并非如此

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

这似乎是神经网络中一个非常常见的错误,原因有很多。我想增加一笔赏金,但我买不起。多年来尝试不同的事情,我希望你们中的一个人能弄清楚! 提前致谢, 3NiGMa

最佳答案

对于数据集的大小来说,您的学习率太高,请尝试将其提高到 0.1 或 1,以便您的权重可以更快地变化

关于python - 尽管输入发生变化,神经网络仍返回相同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55718408/

相关文章:

python - 基于 Django rest 框架函数的 View 中的身份验证

amazon-web-services - 部署命令在 aws sagemaker 中的作用是什么?

machine-learning - keras中LSTM返回序列时如何做softmax?

python - Python 在搜索非内置模块之前是否先搜索内置模块?

python - 如何使用 GUI 在 Python 3 中打开目录?

c++ - 梯度下降算法不会收敛

python - 替换文件中的字符

python - 大范围连续整数的数据结构?

python - python语法是如何生成的以及解释器如何理解它

python-3.x - 扩展枚举并重新定义__getitem__的问题