可以多分类的神经网络

简介: ''' 11行神经网络① 层数可变,多类 ''' import numpy as np import matplotlib.pyplot as plt class BPNN(object): def __init__(self, neurals, epsilon=0.

 

'''
11行神经网络① 
层数可变,多类
'''
import numpy as np
import matplotlib.pyplot as plt



class BPNN(object):
    def __init__(self, neurals, epsilon=0.01, lamda=0.01):
        if not isinstance(neurals, list): raise '出错:参数 neurals 必须是 list 类型'
        self.neurals = neurals   # 各层神经元数目,如:[3,10,8,2]
        self.size = len(neurals)
        
        self.epsilon = epsilon  # 学习速率
        self.lamda = lamda      # 正则化强度

        self.w = [np.random.randn(i,j) for i,j in zip(neurals[:-1], neurals[1:])] + [None]
        self.b = [None] + [np.random.randn(1,j) for j in neurals[1:]]
        self.l = [None] * self.size
        self.l_delta = [None] * self.size
        
        self.probs = None
        
    # 前向传播
    def forward(self, X):
        self.l[0] = X
        for i in range(1, self.size-1):
            self.l[i] = np.tanh(np.dot(self.l[i-1], self.w[i-1]) + self.b[i]) # tanh 函数    
        self.l[-1] = np.exp(np.dot(self.l[-2], self.w[-2]) + self.b[-1])
        self.probs = self.l[-1] / np.sum(self.l[-1], axis=1, keepdims=True)
        
    # 后向传播
    def backward(self, y):
        self.l_delta[-1] = np.copy(self.probs)
        self.l_delta[-1][range(self.n_samples), y] -= 1
        for i in range(self.size-2, 0, -1):
            self.l_delta[i] = np.dot(self.l_delta[i+1], self.w[i].T) * (1 - np.power(self.l[i], 2)) # tanh 函数的导数
            
    # 更新权值、偏置
    def update(self):
        self.b[-1] -= self.epsilon * np.sum(self.l_delta[-1], axis=0, keepdims=True)
        for i in range(self.size-2, -1, -1):
            self.w[i] -= self.epsilon * (np.dot(self.l[i].T, self.l_delta[i+1]) + self.lamda * self.w[i])
            if i == 0: break
            self.b[i] -= self.epsilon * np.sum(self.l_delta[i], axis=0)
    
    # 计算损失
    def calculate_loss(self, y):
        loss = np.sum(-np.log(self.probs[range(self.n_samples), y]))
        loss += self.lamda/2 * np.sum([np.sum(np.square(wi)) for wi in self.w[:-1]]) # 可选
        loss *= 1/self.n_samples  # 可选
        return loss
    
    # 拟合
    def fit(self, X, y, n_iter=1000, print_loss=True):
        self.n_samples = X.shape[0] # 样本大小(样本数目)
        
        for i in range(n_iter):
            self.forward(X)
            self.backward(y)
            self.update()
            
            if not print_loss: continue
            if i%100 == 0: print(self.calculate_loss(y))
    
    # 预测
    def predict(self, x):
        self.forward(x)
        return np.argmax(self.probs, axis=1)
    

    
def plot_decision_boundary(clf, X, y):
    # Set min and max values and give it some padding
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    h = 0.01
    # Generate a grid of points with distance h between them
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # Predict the function value for the whole gid
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # Plot the contour and training examples
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
    
    
def test1():
    X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
    #y = np.array([0,1,1,0]) # 两类
    y = np.array([0,1,2,3])  # 多类
    
    # bpnn = BPNN([3, 10, 8, 1])
    bpnn = BPNN([3, 10, 8, 4])
    bpnn.fit(X, y, n_iter=1000)
    
    print('训练结果:', bpnn.predict(X))
    
    
def test2():
    from sklearn.datasets import make_moons
    from sklearn.linear_model import LogisticRegressionCV
    
    X, y = make_moons(200, noise=0.20)
    plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.Spectral)
    plt.show()

    clf = LogisticRegressionCV()
    clf.fit(X, y)
    plot_decision_boundary(clf, X, y)
    plt.show()

    #nn = BPNN([2,5,4,2])
    nn = BPNN([2,4,2])
    nn.fit(X, y, n_iter=1000)
    plot_decision_boundary(nn, X, y)
    plt.show()
    
    
    
if __name__ == '__main__':
    #test1()
    test2()

    

 

目录
相关文章
|
7月前
|
机器学习/深度学习 自然语言处理 算法
神经网络分类算法的应用及其实现
神经网络分类算法的应用及其实现
111 0
|
机器学习/深度学习 网络架构
神经网络4
与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数。 这是什么意思呢?也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。 下面就是一个例子(此两图来自colah的博客),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。 可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务? 我们可以把输出层的决策分界单独拿出来看一下
77 0
|
6月前
|
机器学习/深度学习 算法 数据可视化
感知机和神经网络
**神经网络**是模仿生物神经元结构的数学模型,用于处理复杂关系和模式识别。它由输入层、隐藏层(可能多层)和输出层组成,其中隐藏层负责信息处理。随着层数增加(深度学习),网络能处理更多信息。基本模型包括感知机,仅输入和输出层,用于线性划分;而**BP神经网络**有多个隐藏层,通过反向传播和梯度下降优化参数,避免局部最小值。训练过程中,神经元通过激励函数响应并调整权重,以提高预测准确性。
|
6月前
|
机器学习/深度学习 存储 算法
简单的神经网络
softmax激活函数将多个未归一化的值转换为概率分布,常用于多分类问题。交叉熵损失函数,特别是与softmax结合时,是评估分类模型性能的关键,尤其适用于多分类任务。它衡量模型预测概率与实际标签之间的差异。在PyTorch中,`nn.CrossEntropyLoss`函数结合了LogSoftmax和负对数似然损失,用于计算损失并进行反向传播。通过`loss.backward()`,模型参数的梯度被计算出来,然后用优化器如`SGD`更新这些参数以减小损失。
|
6月前
|
机器学习/深度学习
什么是神经网络?
神经网络是一种深度学习方法,源自人类大脑生物神经网络的概念。它由大量相互连接的人工神经元(也称为节点或单元)组成,每个神经元接收输入,进行简单处理后生成输出,并将结果传递给下一层的神经元。
108 2
|
6月前
|
机器学习/深度学习 算法 语音技术
神经网络
【6月更文挑战第14天】神经网络。
51 3
|
机器学习/深度学习 算法 自动驾驶
神经网络5
4.训练 下面简单介绍一下两层神经网络的训练。 在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。 机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标
86 0
|
机器学习/深度学习 自然语言处理 算法
简单了解神经网络
神经网络是一种强大的机器学习算法,具有很广泛的应用,可以用于图像识别、语音识别、自然语言处理、推荐系统等多个领域。
103 0
|
机器学习/深度学习 算法
连载|神经网络(上)
连载|神经网络(上)
|
机器学习/深度学习 算法
连载|神经网络(下)
连载|神经网络(下)