numpy【极简】神经网络(非线性)

第三章神经网络——基于numpy的代码详解 本专栏是书《深度学习入门》的阅读笔记一共八章: 第一章深度学习中的Python基础。主要讲解了深度学习将要用到的python的基础知识以及简单介绍了numpy库和matpoltlib库,本书编写深度学习神经网络代码仅使用Python和numpy库,不使用目前流行的各种深度学习框架,适合入门新手学习理论知识。 第二章感知机。主要介绍了神经网络和深度学习的基本单元感知机。感知机接收多个输入,产生一... 阅读详情

流程和算法

在这里插入图片描述
在这里插入图片描述

import numpy as np, matplotlib.pyplot as mp

"""创建随机样本"""
def make_moons(n_samples=100, n_features=2, species=3):
    X = np.zeros((n_samples * species, n_features))
    y = np.zeros(n_samples * species, dtype=int)
    for j in range(species):
        ix = range(n_samples * j, n_samples * (j + 1))
        r = np.linspace(0, 1, n_samples)
        t = np.linspace(j * 4, (j + 1) * 4, n_samples) + np.random.randn(n_samples) * .2
        X[ix] = np.c_[r * np.sin(t), r * np.cos(t)]
        y[ix] = j
    return X, y
X, y = make_moons()
n = X.shape[0]  # 样本数
d = X.shape[1]  # 维数
k = len(np.unique(y))  # 种类数

"""神经网络模型参数"""
nn = 100  # 神经元个数
W1 = .01 * np.random.randn(d, nn)
b1 = np.zeros((1, nn))
W2 = .01 * np.random.randn(nn, k)
b2 = np.zeros((1, k))

"""梯度下降循环"""
for i in range(2999):
    # 1、ReLU激活
    hidden_layer = np.maximum(0, np.dot(X, W1) + b1)
    # 2、得分
    scores = np.dot(hidden_layer, W2) + b2
    # 3、概率
    exp_scores = np.exp(scores)
    probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
    # 4、梯度
    probs[range(n), y] -= 1
    dscores = probs / n
    # 5、反向传播:ReLU
    dhidden = np.dot(dscores, W2.T)
    dhidden[hidden_layer <= 0] = 0
    # 6、参数更新:W2、b2
    W2 -= np.dot(hidden_layer.T, dscores)
    b2 -= np.sum(dscores, axis=0, keepdims=True)
    # 7、参数更新:W1、b1
    W1 -= np.dot(X.T, dhidden)
    b1 -= np.sum(dhidden, axis=0, keepdims=True)

"""模型评估"""
hidden_layer = np.maximum(0, np.dot(X, W1) + b1)
scores = np.dot(hidden_layer, W2) + b2
predicted_class = np.argmax(scores, axis=1)
print('准确率:%.2f' % (np.mean(predicted_class == y)))

"""可视化"""
x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
Z = np.dot(np.maximum(0, np.dot(np.c_[xx.ravel(), yy.ravel()], W1) + b1), W2) + b2
Z = np.argmax(Z, axis=1)
Z = Z.reshape(xx.shape)
mp.contourf(xx, yy, Z, alpha=.1)  # 填色等位线
mp.scatter(X[:, 0], X[:, 1], c=y, s=20, alpha=.7)
mp.show()

在这里插入图片描述

面向对象版

import numpy as np, matplotlib.pyplot as mp
from sklearn.datasets import make_circles


class NN:
    def __init__(self, nn):
        self.nn = nn  # 神经元个数
        self.W1, self.b1 = None, None
        self.W2, self.b2 = None, None

    def fit(self, X, y):
        n = X.shape[0]  # 样本数
        d = X.shape[1]  # 维数
        k = len(np.unique(y))  # 种类数
        # 参数初始化
        W1 = 0.01 * np.random.randn(d, self.nn)
        b1 = np.zeros((1, self.nn))
        W2 = 0.01 * np.random.randn(self.nn, k)
        b2 = np.zeros((1, k))
        # 梯度下降循环
        for i in range(1000):
            # ReLU激活
            hidden_layer = np.maximum(0, np.dot(X, W1) + b1)
            # 得分
            scores = np.dot(hidden_layer, W2) + b2
            # 概率
            exp_scores = np.exp(scores)
            probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
            # 梯度
            probs[range(n), y] -= 1
            dscores = probs / n
            # 反向传播
            dhidden = np.dot(dscores, W2.T)  # 隐层
            dhidden[hidden_layer <= 0] = 0  # ReLU
            # 参数更新:W2、b2
            W2 -= np.dot(hidden_layer.T, dscores)
            b2 -= np.sum(dscores, axis=0, keepdims=True)
            # 参数更新:W1、b1
            W1 -= np.dot(X.T, dhidden)
            b1 -= np.sum(dhidden, axis=0, keepdims=True)
        # 训练完成
        self.W1, self.b1 = W1, b1
        self.W2, self.b2 = W2, b2


def visualize(X, y, nn, i, le):
    mp.subplot(1, le, i)
    x_min, x_max = X[:, 0].min() - .1, X[:, 0].max() + .1
    y_min, y_max = X[:, 1].min() - .1, X[:, 1].max() + .1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
    Z = np.dot(np.maximum(0, np.dot(np.c_[xx.ravel(), yy.ravel()], nn.W1) + nn.b1), nn.W2) + nn.b2
    Z = np.argmax(Z, axis=1)
    Z = Z.reshape(xx.shape)
    mp.contourf(xx, yy, Z, alpha=.1)
    mp.scatter(X[:, 0], X[:, 1], c=y, s=20, alpha=.7)


"""探究【神经元个数】对分类结果的影响"""
X, y = make_circles(200, noise=.1, factor=.4)  # 创建随机样本
nnn = [1, 2, 3, 4, 99]  # 神经元个数
le = len(nnn)
for i in range(le):
    nn = NN(nnn[i])  # 建模
    nn.fit(X, y)  # 拟合
    visualize(X, y, nn, i + 1, le)
mp.show()

在这里插入图片描述

补充

  • numpy.sum
>>> X = np.array([[0, 0],
...               [0, 1],
...               [2, 0]])
>>> np.sum(X)
3
>>> np.sum(X, axis=0)
array([2, 1])
>>> np.sum(X, axis=1)
array([0, 1, 2])
>>> np.sum(X, axis=0, keepdims=True)
array([[2, 1]])
>>> np.sum(X, axis=1, keepdims=True)
array([[0],
       [1],
       [2]])
  • numpy.maximum
>>> X = np.array([[-1, -1],
...               [10, 99],
...               [10, -1]])
>>> np.max(X)
99
>>> np.maximum(0, X)
array([[ 0,  0],
       [10, 99],
       [10,  0]])
  • range
>>> X = np.array([[0, 0, 0],
...               [0, 0, 0],
...               [0, 0, 0],
...               [0, 0, 0]])
>>> y = np.array([2, 2, 1, 0])
>>> X[range(X.shape[0]), y] += 100
>>> X
array([[  0,   0, 100],
       [  0,   0, 100],
       [  0, 100,   0],
       [100,   0,   0]])
  • numpy.argmax
    Returns the indices of the maximum values along an axis
>>> X = np.array([[0, 1],
...               [2, 1],
...               [0, 3]])
>>> np.argmax(X, axis=0)
array([1, 2], dtype=int64)
>>> np.argmax(X, axis=1)
array([1, 0, 1], dtype=int64)
python深度学习--神经网络--多层感知机 在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。在多层感知机中,每个神经元都有一个激活函数,通常使用非线性函数,如Sigmoid函数、ReLU函数等。在多分类问题中,我们通常会使用softmax函数作为网络输出层的激活函数,softmax函数可以对输出值进行归一化操作,把所有输出值都转化为概率,所有概率值加起来等于1。由于概率的取值范围是0到1,当感知机用于解决二分类问题时,输出层的神经元一般使用Sigmoid激活函数。 阅读详情

相关推荐

用python实现神经网络

一、BP神经网络 这里介绍目前常用的BP神经网络,其网络结构及数学模型如下: x为n 维向量, y 为n 维向量,隐含层有q 个神经元。假设N 有个样本数据,𝑦𝑡,𝑥𝑡,𝑡=1,2,…𝑁{y(t),x(t),t=1,2,…N}。从输入层到隐含层的权重记为: 𝑊𝑘𝑖(𝑘=1,2,..,𝑞,𝑖=1,2,…𝑛)W_ki (k=1,2,..,q,i=1,2,…n),从隐含层到输出层的权重记为:𝑊𝑘𝑖𝑘=1,2,…𝑞,𝑖=1,2,…𝑛W_ki (k=1,2,…q,i=1,2,…n) 。 1)以澳...

chy3232的博客 5549

用Python实现神经网络(附完整代码)!

好啦,这就是今天的内容,入门知识点资料免费发送的哈,想要的小伙伴儿不要错过,带你直接弯道超车,少走一大波弯路,准备好了嘛?!我们要开始学习一项编程技术啦!

tingting11232的博客 1万+

从零手写神经网络:激活函数、反向传播与权重初始化实操

神经网络的核心在于信号如何通过激活函数实现非线性变换,以及反向传播如何依据损失函数逐层校准权重。理解这一能量流动与梯度纠错机制,是突破调参玄学、构建可解释模型的基础能力。本文聚焦二分类任务,以同心圆数据为载体,结合Sigmoid激活函数与二元交叉熵损失,手推并实现完整前向/反向传播流程;重点剖析Xavier初始化如何匹配激活函数特性,避免梯度消失,并通过张量维度追踪、中间变量监控等工程技巧,建立对权重更新节奏的直观手感。适合已接触PyTorch但尚未穿透底层机制的学习者。

weixin_32556315的博客 279

Python学习篇30-神经网络

神经网络(神经网络介绍、神经网络原理、感知机、激活函数(Sigmoid函数、双曲正切函数))、TensorFlow框架介绍(Tensorflow简介、Tensorflow数据流图、图与Tensorflow、TensorBoard可视化、张量、变量)、实现线性回归(线性回归案例实现、添加变量显示、增加命名空间、保存读取模型)、MINIST数据集(MINIST数据集简介、加载MINIST数据集、手写数字识别)

Txtechcom的博客 2644

使用numpy搭建神经网络,进行手写数字识别-2019

使用numpy搭建神经网络,进行手写数字识别 1 实验目的与要求 实验要求使用神经网络来完成基于MNIST的手写数字的分类。其中MNIST数据库是由Yann提供的手写数字数据库文件。这个数据库主要包含了60000张的训练图像和10000张的测试图像,囊括了各种手写数字图片。数据样本如下图所示。 实验要求使用手动搭建神经网络,实现前后向,参数更新。神经网络结构不限,建议使用CNN,并利用训练好的神经网络对于测试集进行分类,依据初步的分类结果,对所设计的网络结构进行分析与改进,最后对于结果进行分析,并与前两次

yyy的技术日常 1万+

纯Numpy实现简单的深度学习:从零开始构建神经网络

在本文中,我们将通过使用Python的Numpy库,从头开始构建一个简单的神经网络模型,以此来深入理解深度学习的基本原理。我们将涵盖神经网络的基础、前向传播与反向传播过程、损失函数以及梯度下降法等核心概念,并通过代码示例展示如何利用Numpy实现这些概念。最后,我们还将探讨如何保存与加载模型。

weixin_65502565的博客 1747

numpy【极简】神经网络

文章目录极简神经网络参数更新原理封装成类 极简神经网络 import numpy as np np.random.seed(0) def sigmoid(x, deriv=False): if deriv: # 导数 return x * (1 - x) # S'(x) = S(x) (1 - S(x)) return 1 / (1 + np.exp(-x...

ArYe 4127

基于numpy的前馈神经网络(feedforward neural network)

这几天在上Andrew Ng教授开的Coursera系列课程Deep Learning,总觉得光是看视频和做作业还不够,还是得自己动手写写代码,亲自实现课程里提到的算法内容,于是便有了这篇博客,作为自己入门深度学习的里程碑吧。

廖致君的博客 3671

使用Python和Numpy构建神经网络模型

一:波士顿房价预测任务 上一节我们初步认识了神经网络的基本概念(如神经元、多层连接、前向计算、计算图)和模型结构三要素(模型假设、评价函数和优化算法)。本节将以“波士顿房价”任务为例,向读者介绍使用Python语言和Numpy库来构建神经网络模型的思考过程和操作方法。 波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。和大家对房价的普遍认知相同,波士顿地区的房价是由诸多因素影响的。该数据集统计了13种可能影响房价的因素和该类型房屋的均价,期望构建一个基于13个因素进行房价

班婕妤 4226

使用 NumPy 从零实现神经网络:构建与训练多层感知器

在本文中, 我们了解了神经网络的相关基础知识,同时利用 Numpy 从零开始实现了神经网络的训练过程——前向传播和反向传播,了解了神经网络的通用训练流程。

盼小辉丶的博客 4130

使用NumPy打造全连接神经网络框架

全连接神经网络(Fully Connected Neural Network),也称为多层感知机(Multilayer Perceptron, MLP),是神经网络的一种基本结构,广泛应用于机器学习领域。它由多个全连接层组成,每个层内的神经元与上一层的每个神经元相连接,形成了一种紧凑的网络结构。全连接神经网络主要通过前向传播和反向传播算法进行训练和预测,是一种基础且强大的机器学习模型。神经网络由输入层、隐藏层(包括多个全连接层)和输出层组成。

weixin_31961675的博客 1006

用PennyLane搭建第一个极简量子神经网络

”"极简量子神经网络前向传播电路:param params: 可训练参数(量子门旋转角度):param x: 经典输入数据:return: 量子测量期望值(模型输出)“”"# 输入编码:RX门将经典数据x编码为量子态# 隐藏层参数变换:可训练RY、RZ门,拟合数据特征# 输出测量:测量泡利Z算子,输出经典数值4.3 构建模型、损失函数与优化器。

weixin_43156294的博客 819

从芯片原厂到BSP工程师:技术转型与核心能力解析

嵌入式系统开发中,BSP(板级支持包)作为连接硬件与操作系统的关键层,其开发能力直接影响设备稳定性与性能。理解Linux内核架构(如内存管理、进程调度)和基础接口协议(I2C/SPI/USB)是BSP工程师的核心技能。在芯片验证与驱动开发场景中,多核异构系统调试与稳定性问题排查(如死机分析)展现了工程师的实战能力。随着物联网与智能设备发展,掌握从硬件适配到系统优化的全链路技术栈,成为职业发展的关键突破点。

weixin_36012152的博客 600

深度学习之手撕神经网络代码(基于numpy)

声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添...

种树最好的时间是10年前,其次是现在!!! 8456

antv x6 沿边图标循环动画实现

2.使用transition给边设置动画,利用complte方法实现循环动画。实现效果,如下图,边上存在两个图标,要求图标延边一直循环动画。1.注册一个自定义边,边上定义两个图标,并设置其初始位置。

lingliu0824的博客 3366

WSL2部署Cadence Virtuoso IC25.1:Ubuntu 26.04排障实录

WSL2以轻量虚拟机结合完整Linux内核,为Windows桌面环境提供了原生级Linux运行能力,解决了传统虚拟机资源开销大、双系统切换低效的问题。对于依赖X11图形协议、FlexNet许可服务和特定动态库的EDA工具链而言,利用WSL2部署Linux发行版需要关注系统集成、显示通路与许可连通性。从技术原理看,图形层X Server的配置、动态库依赖的补齐以及license服务的主机名解析,共同构成EDA工具在WSL2中稳定运行的关键环节。在芯片设计场景中,设计工程师常需在Windows办公机与Linux

weixin_29597551的博客 214

Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解

这篇文章介绍了如何使用 Python 的 Numpy 库来实现神经网络的自动训练,重点展示了反向传播算法和激活函数的应用。反向传播是神经网络训练的核心,能够通过计算梯度来优化模型参数,使得预测更加精准。文中详细演示了如何使用 Numpy 进行神经网络的前向预测、反向传播更新、误差计算,并通过引入 ReLU 等激活函数提升模型的非线性拟合能力。最后,通过对比训练前后的结果,展示了加入激活函数后模型性能的显著提升,适合初学者和爱好者学习神经网络的基础原理与应用。

敲代码别忘了喝上一杯凉白开。 1533

YOLOv8进阶:SEAM注意力与Repulsion Loss双剑合璧,突破遮挡检测瓶颈

做目标检测时,最头疼的莫过于目标被遮挡的场景——行人被树木挡住一半、车辆被广告牌遮挡部分轮廓……这些情况往往让模型“犯迷糊”。但现在,有了SEAM注意力模块和Repulsion Loss排斥损失,我们就能让YOLOv8在遮挡场景下也能“拨开迷雾见真章”。这篇教程会带你一步步理解这两个技术,并亲手把它们融入YOLOv8,让你的检测模型在复杂场景下也能稳如泰山。

FJN110的博客 234

Python NumPy 在神经网络中的矩阵运算与激活函数详解

本文结合 Python 中的 NumPy 库,深入讲解了神经网络中的矩阵运算及其在前向传播中的应用。通过详细的代码示例,展示如何利用 NumPy 实现矩阵乘法,并应用于神经网络的回归和分类问题。此外,文章还介绍了常见的激活函数(如 Sigmoid、ReLU、Tanh)的定义及其在神经网络中的作用,帮助提升模型的非线性拟合能力。最后,归纳了激活函数在不同任务中的最佳应用场景,助力读者高效构建深度学习模型。

敲代码别忘了喝上一杯凉白开。 1265

27、视网膜血管识别与分类的数据集和验证过程

本文介绍了视网膜血管自动识别与分类方法所使用的数据集及其验证过程。通过30张高分辨率的近红外反射视网膜图像,结合专业医生的手动标注结果,构建了包含597个血管段的基准数据集。研究采用准确率、召回率、F1分数和混淆矩阵等评估指标对模型进行验证,并提出了特征增强和分类器优化策略以提升性能。实验结果显示,该方法在复杂区域具有较强的鲁棒性和较高的准确性,为临床应用提供了可靠的依据。

i7j8k9l的博客 148

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4119

神经网络解决非线性二分类

python__init__方法:初始化神经网络的权重和偏置。input_size为输入层神经元数量,为隐藏层神经元数量,为输出层神经元数量。pythonsigmoid方法:实现 Sigmoid 激活函数,将输入值映射到 (0, 1) 区间,常用于二分类问题的输出层。relu方法:实现 ReLU 激活函数,将小于 0 的值置为 0,大于等于 0 的值保持不变,可缓解梯度消失问题。pythonforward方法:实现神经网络的前向传播过程。

weixin_69327572的博客 694

关于cefsharp访问iqiyi.com显示403 Forbidden解决办法(2种方法)

cefsharp不加UserAgent的默认值为 (注意126是当前cefsharp的版本)Edge浏览器的UserAgent 为 (edge的版本是128的)说明根据浏览器的不同,UserAgent可能不太一样。

无线智能模块 可视DIY智能专家 1319
上一篇: 中文依存句法分析接口
下一篇: numpy【极简】RNN
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值