当前位置: 首页 > news >正文

神经网络与深度学习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.dtcms.com/a/278422.html

相关文章:

  • 构建高效事件驱动架构:AWS S3与SQS集成实践指南
  • 实战:如何创建 AWS RDS 数据库
  • 显示器核心三要素详解:刷新率、分辨率、色深
  • 【JAVA】监听windows中鼠标侧面键的按钮按下事件
  • Web 前端面试
  • redis实现红锁
  • (1-7-3)数据库的基本查询
  • 【React Native】Switch、Alert、Dimensions、StatusBar、Image组件
  • 打破数据孤岛!医疗数据如何实现“可用不可见”?
  • OpenVela之开发自测试框架cmocka
  • 深入解析ThreadLocal:线程隔离的奥秘与内存泄漏解决方案
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(上)
  • Linux操作系统从入门到实战(八)详细讲解编译器gcc/g++编译步骤与动静态库链接
  • C语言:20250714笔记
  • 更改elementui 图标 css content
  • Docker搭建Redis分片集群
  • kotlin学习笔记
  • Kubernetes Ingress:实现HTTPHTTPS流量管理
  • HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位
  • Spring Boot 双数据源配置
  • 基于Python的物联网岗位爬取与可视化系统的设计与实现【海量数据、全网岗位可换】
  • java基础(day07)
  • java基础-1 : 运算符
  • 如何连接 AWS RDS 数据库实例
  • Spark 和 Hadoop MapReduce 的基本概念及区别
  • 2D和3D激光slam的点云去运动畸变
  • autoware激光雷达和相机标定
  • 0-1搭建springboot+vue的教务管理系统(核心源码)
  • 第一次接触自动化监测,需要付费厂家安装服务吗?比人工测量主要区别是啥?
  • 使用 pytest 测试框架构建自动化测试套件之一