神经网络与深度学习Python入门

一、神经网络基础

1. 神经元模型

在神经网络中,最基本的单元是神经元(Neuron),也称为节点或单元。它模拟了生物神经系统中的神经元行为。一个典型的神经元模型包含多个输入(x1,x2,…,xnx_1, x_2, \ldots, x_nx1,x2,,xn),每个输入都对应一个权重(w1,w2,…,wnw_1, w_2, \ldots, w_nw1,w2,,wn),以及一个偏置(bias)。神经元的输出(yyy)通过激活函数(Activation Function)计算得出,公式如下:

y=f(∑i=1nwixi+b) y = f\left(\sum_{i=1}^{n} w_i x_i + b\right) y=f(i=1nwixi+b)

其中,fff 表示激活函数,常见的激活函数有Sigmoid、Tanh和ReLU等。

代码示例:

import numpy as npdef sigmoid(z):return 1 / (1 + np.exp(-z))def neuron_output(weights, inputs, bias):z = np.dot(weights, inputs) + biasreturn sigmoid(z)weights = np.array([0.5, -0.2, 0.1])
inputs = np.array([1.0, 0.5, -1.5])
bias = 0.3output = neuron_output(weights, inputs, bias)
print("Neuron output:", output)
2. 激活函数

激活函数引入非线性特性,使得神经网络能够学习复杂的模式。常用的激活函数包括:

  • Sigmoid: 将输入映射到(0,1)区间,适用于二分类问题。
  • Tanh: 将输入映射到(-1,1)区间,输出均值为0,收敛速度比Sigmoid快。
  • ReLU(Rectified Linear Unit): 当输入大于0时输出输入值,否则输出0,缓解梯度消失问题,加速训练。

代码示例:

def tanh(z):return np.tanh(z)def relu(z):return np.maximum(0, z)# 示例比较不同激活函数
z = np.array([-2.0, -1.0, 0.0, 1.0, 2.0])
print("Sigmoid:", sigmoid(z))
print("Tanh:", tanh(z))
print("ReLU:", relu(z))

二、前馈神经网络结构

1. 多层感知机(MLP)

前馈神经网络由输入层、一个或多个隐藏层及输出层组成。每一层由多个神经元构成,层与层之间全连接。信息从输入层流向输出层,无反馈连接。

架构示意:

输入层 -> 隐藏层1 -> 隐藏层2 -> ... -> 输出层

代码示例:

from keras.models import Sequential
from keras.layers import Dense# 构建一个简单的三层MLP
model = Sequential()
model.add(Dense(units=32, activation='relu', input_dim=784))  # 输入层(假设输入为28x28图像)
model.add(Dense(units=64, activation='relu'))                 # 隐藏层1
model.add(Dense(units=10, activation='softmax'))              # 输出层(10类分类)
2. 前向传播过程

在前向传播中,输入数据通过网络层层传递,每层的输出作为下一层的输入。最终,输出层的输出即为模型的预测结果。

代码示例:

# 使用Keras进行前向传播
import tensorflow as tf
from tensorflow.keras.datasets import mnist# 加载数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 784).astype('float32') / 255
x_test = x_test.reshape(-1, 784).astype('float32') / 255
y_train = tf.keras.utils.to_categorical(y_train, 10)
y_test = tf.keras.utils.to_categorical(y_test, 10)# 编译模型
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=32)# 评估模型
loss, accuracy = model.evaluate(x_test, y_test)
print(f"Test Accuracy: {accuracy*100:.2f}%")

三、损失函数与优化器

1. 损失函数

损失函数衡量模型预测与真实标签之间的差异,指导模型参数的调整。常见的损失函数包括:

  • 均方误差(MSE): 常用于回归问题。
  • 交叉熵损失(Cross-Entropy Loss): 常用于分类问题,特别是多类别分类。
  • 二元交叉熵(Binary Cross-Entropy): 适用于二分类问题。

代码示例:

from keras.losses import binary_crossentropy, categorical_crossentropy, mean_squared_error# 示例计算损失
y_true = np.array([1, 0, 0])
y_pred = np.array([0.8, 0.1, 0.1])# 多类别交叉熵
loss_ce = categorical_crossentropy(y_true, y_pred)
print("Categorical Cross-Entropy Loss:", loss_ce)# 二类别交叉熵
loss_bce = binary_crossentropy(y_true[0], y_pred[0])
print("Binary Cross-Entropy Loss:", loss_bce)
2. 优化器

优化器通过调整模型参数以最小化损失函数。常用的优化算法包括:

  • 梯度下降(Gradient Descent): 最基本的优化方法,但收敛速度慢。
  • 随机梯度下降(SGD): 每次使用一个样本更新参数,速度快但波动大。
  • 动量(Momentum): 引入动量项,加速收敛并减少震荡。
  • 自适应学习率方法:
    • Adagrad: 根据参数梯度的历史累积调整学习率。
    • RMSprop: 结合动量和Adagrad的优点,适应性更强。
    • Adam: 结合了动量和RMSprop,广泛使用的优化器。

代码示例:

from keras.optimizers import SGD, Adam# 使用SGD优化器
sgd_optimizer = SGD(learning_rate=0.01, momentum=0.9)
model.compile(optimizer=sgd_optimizer, loss='categorical_crossentropy', metrics=['accuracy'])# 使用Adam优化器
adam_optimizer = Adam(learning_rate=0.001)
model.compile(optimizer=adam_optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

四、反向传播算法

1. 反向传播原理

反向传播(Backpropagation)是通过计算损失函数相对于每个参数的梯度,来更新网络参数的过程。具体步骤包括:

  1. 前向传播: 计算每一层的激活值和最终输出。
  2. 计算损失: 比较输出与真实标签,计算损失。
  3. 反向传播: 从输出层开始,逐层向后计算梯度。
  4. 参数更新: 根据梯度和优化器规则更新权重和偏置。
2. 梯度计算与链式法则

反向传播依赖于链式法则(Chain Rule),即复合函数的导数等于各函数导数的乘积。对于每一层,梯度通过激活函数的导数和权重矩阵传递回前一层。

代码示例:

# 简化的反向传播示例(手动实现单层)
import numpy as np# 定义简单的两层网络
input_data = np.array([[0.1, 0.2]])
weights = np.array([[0.5, -0.3], [0.2, 0.4]])
bias = np.array([0.1, -0.1])# 前向传播
hidden_layer = sigmoid(np.dot(input_data, weights) + bias)
print("Hidden Layer Output:", hidden_layer)# 假设真实标签为[0,1]
true_labels = np.array([[0, 1]])# 计算损失(使用MSE)
loss = np.mean((hidden_layer - true_labels) ** 2)
print("Loss:", loss)# 反向传播:计算梯度
delta = hidden_layer - true_labels
dW = np.dot(input_data.T, delta)
db = np.sum(delta, axis=0)
print("Gradient dW:", dW)
print("Gradient db:", db)

五、训练与验证

1. 数据集划分

为了评估模型的泛化能力,通常将数据集划分为训练集、验证集和测试集。训练集用于模型学习,验证集用于调参和监控训练过程,测试集用于最终评估。

代码示例:

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris# 加载数据
data = load_iris()
X = data.data
y = data.target# 将多类别标签转换为one-hot编码
y = tf.keras.utils.to_categorical(y, num_classes=3)# 划分训练集和测试集(80%训练,20%测试)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 过拟合与正则化

过拟合指模型在训练集上表现良好,但在验证集或测试集上表现较差。常见防止过拟合的方法包括:

  • L1和L2正则化: 在损失函数中添加权重绝对值或平方和的惩罚项,限制权重大小。
  • Dropout: 在训练过程中随机“丢弃”一部分神经元,减少神经元间的依赖。
  • 早停(Early Stopping): 当验证性能不再提升时停止训练,防止过拟合。

代码示例:

from keras.layers import Dropout
from keras.regularizers import l2
from keras.callbacks import EarlyStopping# 添加L2正则化和Dropout层
model = Sequential()
model.add(Dense(units=64, activation='relu', kernel_regularizer=l2(0.01), input_dim=4))
model.add(Dropout(0.5))  # Dropout比例为50%
model.add(Dense(units=3, activation='softmax'))# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# 添加早停回调
early_stop = EarlyStopping(monitor='val_loss', patience=5)

六、实战案例:手写数字识别

1. MNIST数据集介绍

MNIST是一个广泛用于手写数字识别的数据集,包含6万张训练图像和1万张测试图像,每张图像为28x28像素的灰度图,对应数字0-9。该数据集简单且具有代表性,适合初学者实践神经网络。

2. 数据预处理与加载

在训练前,需要对图像数据进行归一化处理,将像素值缩放到[0,1]区间,以提高训练效率和模型性能。此外,将标签进行One-Hot编码以适应多分类任务。

代码示例:

from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
import numpy as np
import matplotlib.pyplot as plt# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
print(f"Training data shape: {x_train.shape}, Test data shape: {x_test.shape}")# 数据归一化
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0# 标签One-Hot编码
y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914677.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android System WebView:Android生态的核心组件

在Android生态系统中,Android System WebView(简称WebView)扮演着至关重要的角色。它是Chrome浏览器的内核,为Android设备提供了强大的网页浏览和Web内容展示功能。无论是日常浏览网页、使用基于Web的应用程序,还是进行…

Element Plus和Ant Design Vue深度对比分析与选型指南

在 Vue3生态中,Element Plus和Ant Design Vue(以下简称 AntD Vue)是两款最主流的 UI 组件库。它们分别脱胎于 Element UI(Vue 2 版本)和 Ant Design(React 生态),经过多年迭代已成为…

AJAX 开发中的注意点

关键词:AJAX、异步请求、前端开发、跨域、错误处理、安全、性能优化 ✅ 引言 在现代 Web 应用中,AJAX 是实现前后端数据交互的重要手段。然而,在实际开发过程中,如果不注意一些常见问题,可能会导致应用出现安全性漏洞…

类之间的纵向关系——继承

继承定义:被继承的类叫做基类(父类),继承的类叫派生类(子类),在派生类类名后面加: 继承方式 基类class CFather{}; class CSon:public CFather{};父类(基类)与子类(派生类)之间的关系…

bytetrack漏检补齐

bytetrack漏检补齐1.人流慢速运动,跟踪效果比较好,偶尔有漏检,跟踪可以自动补齐。2.快速运动,频繁遮挡,效果可能不好*如果漏检,倒着跟踪,把丢失的检测框拷贝出来,保留进行跟踪。有时…

安装Keycloak并启动服务(macOS)

前提:电脑已经安装Java 17 1、下载Keycloak 2、下载完后解压缩,使用文本编辑器修改配置文件(keycloak/conf/keycloak.conf) # Basic settings for running in production. Change accordingly before deploying the server. # …

汽车动力转向器落锤冲击试验台

落锤冲击试验台主要用于扣件减振量的测试,采用电动锚链提锤结构,控制精度高,定位准确。采用伺服电机减速机驱动,避免提锤加速和到位减速时的冲击,具有多重安全保护功能,防止二次冲击装置。主机框架采用上下…

Linux系统集群部署模块之Keepalived双机热备

目录 概述 一、keepalived安装 二、配置文件 三、 其他配置项说明 四、名词解释 五、高阶使用 1、介绍 2、keepalived主要作用 3、工作在三层、四层和七层原理 4、健康状态检测方式 4.1 HTTP服务状态检测 4.2 TCP端口状态检测(使用TCP端口服务基本上都可…

TDengine 使用最佳实践(1)

目录 数据建模 单列模型 多列模型 分库分表 边界限制 资源规划 CPU 主频 CPU 核数 内存分类 内存计算 CPU 内存比例 磁盘 网络 下一篇 TDengine 使用最佳实践(1) 关于 TDengine TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台&am…

Java行为型模式---责任链模式

责任链模式基础概念责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是将请求的发送者和接收者解耦,使多个对象都有机会处理请求。这些对象连接成一条链,请求沿着链传递,直到有…

嵌入式学习笔记- 结构体名字被赋值时是整体内容赋值

结构体变量名被赋值时,‌不是赋值的地址,而是执行对整个结构体内容的复制(值拷贝)‌直接赋值是成员级复制‌ 当使用 s2 s1; 形式的赋值时(其中 s1 和 s2 是同类型结构体变量),系统会‌逐成员复…

基于UDP/IP网络游戏加速高级拥塞控制算法(示意:一)

/* ███████╗ 基于UDP/IP网络游戏加速高级拥塞控制算法&#xff08;示意&#xff1a;一&#xff09; ███████╗ */#pragma once#include <iostream> #include <vector> #include <deque> #include <cmath> #include <algorithm> …

【YOLOv11-目标检测】06-模型部署(C++)

上一节课,我们学习了模型的预测。那么,如何用C++部署呢? 克隆项目 进入cmd,进入自己的项目文件夹,然后git clone项目: git clone https://github.com/Geekgineer/YOLOs-CPP 进入到YOLOs-CPP文件夹: 配置环境 ONNX Runtime 后续构建项目的时候,会自动下载,因此,我…

【第零章编辑器开发与拓展】

前言&#xff1a;对编辑器拓展与开发可以节省很多时间&#xff0c;提高开发效率&#xff0c;比如技能编辑器&#xff0c;关卡编辑器这种。当然这只是编辑器开发的一些典型应用&#xff0c;它能做不止这些。学习完这个之后&#xff0c;我们可以开发项目需要的工具。我本意在编辑…

使用 mongoimport 导入本地 JSON 文件到 MongoDB 及数据查看指南

在项目中&#xff0c;我们经常需要将本地 JSON 文件批量导入 MongoDB 数据库。本文以 Ubuntu 22.04 环境为例&#xff0c;详细记录了如何安装 mongoimport 工具、正确导入多个 JSON 文件&#xff0c;以及查看导入后的数据。一、环境介绍操作系统&#xff1a;Ubuntu 22.04.5 LTS…

新手向:Python数据处理Excel报表自动化生成与分析

Python实现Excel报表自动化系统全流程指南本文将详细介绍如何使用Python实现一个完整的Excel报表自动化系统&#xff0c;涵盖从数据清洗、分析到可视化报表生成的全流程。本教程面向Python初学者&#xff0c;通过实际案例讲解pandas和openpyxl库的核心用法。系统概述Excel报表自…

【第六节】docker可视化工具portainer安装

该文章参考了这篇文章https://zhuanlan.zhihu.com/p/27740131259portainer是一个基于网页的docker可视化管理工具&#xff0c;试想一下我们怎么登录路由器管理界面的&#xff0c;异曲同工。那么就需要在服务器的docker内安装portainer&#xff0c;然后在我们的开发机或者说工作…

使用 Certbot 申请和自动续签 Let’s Encrypt 的免费 SSL 证书

一. Let’s Encrypt 介绍 Let’s Encrypt 是当前最常用的免费 HTTPS 证书生成工具之一。该服务由非营利组织提供&#xff0c;致力于为全球范围内的网站提供便捷的自动化证书颁发服务。虽然 Let’s Encrypt 证书的有效期只有90天&#xff0c;但是可以自动续期&#xff0c;这使得…

【kubernetes】--controller(DaemonSet)

Kubernetes DaemonSet 控制器详解 它确保集群中所有(或部分)节点上都运行一个 Pod 的副本。当有新节点加入集群时&#xff0c;DaemonSet 会自动在新节点上创建 Pod&#xff1b;当节点从集群中移除时&#xff0c;这些 Pod 也会被垃圾回收。 DaemonSet 的核心特性 每个节点一个 P…

内测分发平台应用的异地容灾和负载均衡处理和实现思路

内测分发平台应用的异地容灾和负载均衡处理和实现思路如下&#xff1a;一、异地容灾1.风险评估和需求分析&#xff1a;对现有的IT基础设施进行全面的风险评估和需求分析&#xff0c;评估潜在风险和灾害的可能性&#xff0c;以及确定业务和数据的关键性。2.设计备份架构&#xf…