当前位置: 首页 > 知识库问答 >
问题:

神经网络中的线性函数输出值很大

岳英锐
2023-03-14

我正在对虹膜数据集进行回归以预测其类型。我已经成功地使用相同的数据和相同的神经网络进行了分类。对于分类,我在所有层中都使用tanh作为激活函数。但是对于回归,我在隐藏层使用tanh函数,在输出层使用恒等式函数。

import numpy as np

class BackPropagation:
    weight =[]
    output =[]
    layers =0
    eta = 0.1

    def __init__(self, x):
        self.layers = len(x)
        for i in range(self.layers-2):
        w = np.random.randn(x[i]+1,x[i+1]+1)
        self.weight.append(w)
        w = w = np.random.randn(x[-2]+1,x[-1])
        self.weight.append(w)

    def tanh(self,x):
        return np.tanh(x)

    def deriv_tanh(self,x):
        return 1.0-(x**2)

    def linear(self,x):
        return x

    def deriv_linear(self,x):
        return 1


    def training(self,in_data,target,epoch=100):
        bias = np.atleast_2d(np.ones(in_data.shape[0])*(-1)).T
        in_data = np.hstack((in_data,bias))
        print("Training Starts ......")

        while epoch!=0:
            epoch-=1
            self.output=[]
            self.output.append(in_data)
            # FORWARD PHASE
            for j in range(self.layers-2):
                y_in = np.dot(self.output[j],self.weight[j])
                y_out = self.tanh(y_in)
                self.output.append(y_out)

            y_in = np.dot(self.output[-1],self.weight[-1])
            y_out = self.linear(y_in)
            self.output.append(y_out)
            print("Weight Is")
            for i in self.weight:
                print(i)       

            # BACKWARD PHASE
            error = self.output[-1]-target
            print("ERROR IS")
            print(np.mean(0.5*error*error))
            delta=[]
            delta_o = error * self.deriv_linear(self.output[-1])
            delta.append(delta_o)

            for k in reversed(range(self.layers-2)):
                delta_h = np.dot(delta[-1],self.weight[k+1].T) * self.deriv_tanh(self.output[k+1])
                delta.append(delta_h)
            delta.reverse()

            # WEIGHT UPDATE

            for i in range(self.layers-1):
                self.weight[i] -= (self.eta * np.dot(self.output[i].T, delta[i]))

        print("Training complete !")
        print("ACCURACY IS")
        acc = (1.0-(0.5*error*error))*100
        print(np.mean(acc))

    def recall(self,in_data):
        in_data = np.atleast_2d(in_data)
        bias = np.atleast_2d(np.ones(in_data.shape[0])*(-1)).T
        in_data = np.hstack((in_data,bias))
        y_out = in_data.copy()
        for i in range(self.layers-2):
            y_in = np.dot(y_out,self.weight[i])
            y_out = self.tanh(y_in).copy()
        y_in = np.dot(y_out,self.weight[-1])
        y_out = self.linear(y_in).copy()
        return y_out
# MAIN
data = np.loadtxt("iris.txt",delimiter=",")
obj = BackPropagation([4,2,1])
in_data = data[:rows,:cols].copy()
target = data[:rows,cols:].copy()
obj.training(in_data,target)
print("ANSWER IS")
print(obj.recall(in_data))  

数据集是这样的。这里,前4列是功能,最后一列包含目标值。数据集中有150条这样的记录。

5.1,3.5,1.4,0.2,0
4.9,3.0,1.4,0.2,0
5.0,3.6,1.4,0.2,0
5.4,3.9,1.7,0.4,0
4.6,3.4,1.4,0.3,0
7.0,3.2,4.7,1.4,1
6.4,3.2,4.5,1.5,1
6.9,3.1,4.9,1.5,1
5.5,2.3,4.0,1.3,1
6.3,3.3,6.0,2.5,2
5.8,2.7,5.1,1.9,2
7.1,3.0,5.9,2.1,2
6.3,2.9,5.6,1.8,2

在每个纪元之后,预测值呈指数级增长。并且,在50个纪元内,代码给出INF或-INF作为输出。代替恒等式函数,我还尝试了泄漏ReLU,但输出仍然是INF。我还尝试了不同的学习率、隐藏层中的神经元数量、隐藏层数量、初始权重值、迭代次数等。那么,如何使用具有错误反向传播的神经网络进行回归呢?

共有1个答案

彭修筠
2023-03-14

对回归任务使用均方误差函数。对于分类任务,通常使用softmax层作为输出,并优化交叉输入成本函数。

 类似资料:
  • 我正在学习神经网络,并在python中实现它。我首先定义了一个 softmax 函数,我遵循这个问题给出的解决方案 Softmax 函数 - python。以下是我的代码: 我得到了一个测试代码,看看函数是否正确。是测试数据,

  • 我正在开发一种卷积神经网络用于图像分类或更好的车牌分类。这些车牌最多包含8个字符,每个字符可以包含37个字符(A-Z、0-9和空格)。我现在想知道如何设计网络中的最后两层。我认为,最后一个必须是具有37个概率的softmax层。这应该完全连接到一个(?)神经元在前一层?我想,在前一层我们需要8个神经元,因为之前的车牌上有8个字符,但我不确定。在此层之前,我添加了一些卷积层和maxPooling层。

  • 我对TensorFlow和LSTM架构相当陌生。我在计算数据集的输入和输出(x_train、x_test、y_trainy_test)时遇到了问题。 我最初输入的形状: X_列车:(366,4) Ytrain和Ytest是一系列股票价格。Xtrain和Xtest是我想学习的四个预测股价的功能。 这是产生的错误: -------------------------------------------

  • 神经网络 (Neural Network) 是机器学习的一个分支,全称人工神经网络(Artificial Neural Network,缩写 ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 Perceptron (感知器) 一个典型的神经网络由输入层、一个或多个隐藏层以及输出层组成,其中箭头代表着数据流动的方向,而圆圈代表激活函数(最常用的激活函数为

  • 译者:bat67 最新版会在译者仓库首先同步。 可以使用torch.nn包来构建神经网络. 我们以及介绍了autograd,nn包依赖于autograd包来定义模型并对它们求导。一个nn.Module包含各个层和一个forward(input)方法,该方法返回output。 例如,下面这个神经网络可以对数字进行分类: 这是一个简单的前馈神经网络(feed-forward network)。它接受一

  • 本文向大家介绍问题:神经网络激活函数?相关面试题,主要包含被问及问题:神经网络激活函数?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: sigmod、tanh、relu 解析:需要掌握函数图像,特点,互相比较,优缺点以及改进方法