神经网络构建与训练深度学习模型全过程(PyTorch TensorFlow)

神经网络构建与训练深度学习模型全过程(PyTorch & TensorFlow)

目录

  1. 🔗 什么是神经网络:基础架构与工作原理
  2. 🧩 构建简单的神经网络:层次结构与激活函数
  3. 🚀 前向传播:神经网络的数据流动
  4. 🎯 损失函数与代价函数:神经网络的误差度量
  5. 🔄 反向传播算法:模型的参数优化机制
  6. 🛠️ 常见优化器解析:从梯度下降到自适应优化
  7. 🧠 实战:训练与调优深度神经网络模型
  8. 📊 结果评估与模型调试:准确率与过拟合问题分析

1. 🔗 什么是神经网络:基础架构与工作原理

神经网络(Neural Network)是一种模拟人脑神经元的数学模型,其目的是通过模拟神经元之间的连接与传递信息的方式,来完成复杂的数据处理任务。神经网络由若干层神经元组成,通常分为输入层、隐藏层和输出层。

神经元:
每个神经元接收输入信号,并经过激活函数处理后产生输出信号,输出信号又成为下一层神经元的输入。每个连接上的权重决定了输入的重要性,而偏置(bias)则用于调整神经元的输出。

工作原理:
当输入层接收数据后,信息通过权重矩阵传递到隐藏层,并在此处进行复杂的计算与转换。激活函数是确保模型可以捕获非线性关系的关键,常见的激活函数包括ReLU、Sigmoid和Tanh。最终,输出层产生预测结果,模型根据这些结果和真实标签之间的误差来调整权重。

PyTorch实现:

import torch
import torch.nn as nn# 定义简单的神经网络架构
class SimpleNeuralNetwork(nn.Module):def __init__(self):super(SimpleNeuralNetwork, self).__init__()self.layer1 = nn.Linear(10, 5)  # 输入层10维,输出5维self.layer2 = nn.Linear(5, 2)   # 隐藏层5维,输出2维def forward(self, x):x = torch.relu(self.layer1(x))  # 使用ReLU激活函数x = self.layer2(x)              # 输出层不需要激活函数return x# 创建模型实例并输出网络结构
model = SimpleNeuralNetwork()
print(model)

TensorFlow实现:

import tensorflow as tf
from tensorflow.keras import layers, models# 定义简单的神经网络架构
model = models.Sequential([layers.Dense(5, activation='relu', input_shape=(10,)),  # 输入层10维,输出5维layers.Dense(2)  # 输出层2维,不指定激活函数
])# 打印模型结构
model.summary()

2. 🧩 构建简单的神经网络:层次结构与激活函数

神经网络的核心在于其层次结构。通常情况下,神经网络由多个全连接层(Fully Connected Layer)组成,每一层的输出都作为下一层的输入。在这个过程中,激活函数起到至关重要的作用,它赋予网络非线性表达能力,使其可以处理复杂的模式识别问题。

在这里插入图片描述

PyTorch实现:

class MultiLayerNetwork(nn.Module):def __init__(self):super(MultiLayerNetwork, self).__init__()self.layer1 = nn.Linear(10, 64)  # 输入10维,输出64维self.layer2 = nn.Linear(64, 32)  # 隐藏层64维,输出32维self.output_layer = nn.Linear(32, 1)  # 输出层1维def forward(self, x):x = torch.relu(self.layer1(x))    # ReLU激活函数x = torch.tanh(self.layer2(x))    # Tanh激活函数x = torch.sigmoid(self.output_layer(x))  # 输出层Sigmoidreturn x# 创建模型实例
model = MultiLayerNetwork()
print(model)

TensorFlow实现:

model = models.Sequential([layers.Dense(64, activation='relu', input_shape=(10,)),  # 第一层使用ReLU激活layers.Dense(32, activation='tanh'),  # 第二层使用Tanh激活layers.Dense(1, activation='sigmoid')  # 输出层使用Sigmoid激活
])# 打印模型结构
model.summary()

3. 🚀 前向传播:神经网络的数据流动

前向传播(Forward Propagation)是神经网络的核心过程之一。它是指从输入层开始,信息逐层传递并最终在输出层生成预测结果的过程。在每一层,输入数据通过权重矩阵变换,经过激活函数处理后,再传递到下一层。

在这里插入图片描述

PyTorch实现:

# 定义前向传播函数
def forward_pass(model, inputs):output = model(inputs)  # 前向传播return output# 示例:使用随机输入数据进行前向传播
inputs = torch.rand(1, 10)  # 随机生成10维输入数据
output = forward_pass(model, inputs)
print("预测输出:", output)

TensorFlow实现:

# 示例:使用随机输入数据进行前向传播
inputs = tf.random.normal([1, 10])  # 随机生成10维输入数据
output = model(inputs)  # 前向传播
print("预测输出:", output.numpy())

4. 🎯 损失函数与代价函数:神经网络的误差度量

在神经网络的训练过程中,损失函数(Loss Function)用于度量预测结果与真实值之间的误差,进而指导模型的学习过程。损失函数的选择直接影响模型的性能,因此是构建神经网络时的一个重要部分。

在这里插入图片描述

PyTorch实现:

# 定义损失函数
criterion_mse = nn.MSELoss()  # 均方误差损失函数
criterion_ce = nn.BCELoss()   # 二分类交叉熵损失函数# 示例:计算损失
true_values = torch.tensor([1.0, 0.0])  # 真实标签
predicted_values = torch.tensor([0.8, 0.2])  # 模型预测# 计算损失
loss_mse = criterion_mse(predicted_values, true_values)
loss_ce = criterion_ce(predicted_values, true_values)print("均方误差损失:", loss_mse.item())
print("交叉熵损失:", loss_ce.item())

TensorFlow实现:

# 定义损失函数
mse_loss_fn = tf.keras.losses.MeanSquaredError()  # 均方误差
bce_loss_fn = tf.keras.losses.BinaryCrossentropy()  # 二分类交叉熵# 示例:计算损失
true_values = tf.constant([1.0, 0.0])  # 真实标签
predicted_values = tf.constant([0.8, 0.2])  # 模型预测# 计算损失
loss_mse = mse_loss_fn(true_values, predicted_values)
loss_bce = bce_loss_fn(true_values, predicted_values)print("均方误差损失:", loss_mse.numpy())
print("交叉熵损失:", loss_bce.numpy())

5. 🔄 反向传播算法:模型的参数优化机制

反向传播(Backpropagation)是神经网络中的关键算法,用于通过计算梯度来更新网络中的权重,以最小化损失函数。反向传播的目标是找到损失函数相对于每个参数的偏导数,并使用这些梯度来调整模型参数。

反向传播的步骤可以概括为:

  1. 计算损失函数的梯度:对于每个参数,计算损失函数对其的偏导数(梯度)。
  2. 权重更新:使用优化器,根据梯度信息更新每个参数的值。

梯度的计算过程依赖于链式法则,从损失函数到每个参数逐层计算梯度,这个过程就是反向传播。

PyTorch实现:

# 使用SGD优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 示例:前向传播计算损失
inputs = torch.rand(1, 10)
true_values = torch.tensor([1.0])  # 真实标签
predicted_values = model(inputs)
loss = criterion_mse(predicted_values, true_values)# 反向传播并更新权重
optimizer.zero_grad()  # 清空之前的梯度
loss.backward()        # 反向传播计算梯度
optimizer.step()       # 更新权重print("更新后的权重:", model.layer1.weight)

TensorFlow实现:

# 使用SGD优化器
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)# 示例:前向传播并计算损失
inputs = tf.random.normal([1, 10])
true_values = tf.constant([1.0])  # 真实标签
with tf.GradientTape() as tape:predicted_values = model(inputs)loss = mse_loss_fn(true_values, predicted_values)# 计算梯度并更新权重
grads = tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(grads, model.trainable_weights))print("更新后的权重:", model.layers[0].weights[0])

6. 🛠️ 常见优化器解析:从梯度下降到自适应优化

优化器是控制模型参数更新的关键因素,不同的优化器有不同的性能表现。这里展示如何使用几种常见的优化器,包括随机梯度下降(SGD)和Adam优化器。

PyTorch实现:

# SGD优化器
optimizer_sgd = torch.optim.SGD(model.parameters(), lr=0.01)# Adam优化器
optimizer_adam = torch.optim.Adam(model.parameters(), lr=0.001)# 示例:更新权重
optimizer_sgd.step()  # 使用SGD更新
optimizer_adam.step()  # 使用Adam更新

TensorFlow实现:

# SGD优化器
optimizer_sgd = tf.keras.optimizers.SGD(learning_rate=0.01)# Adam优化器
optimizer_adam = tf.keras.optimizers.Adam(learning_rate=0.001)# 示例:更新权重
optimizer_sgd.apply_gradients(zip(grads, model.trainable_weights))  # 使用SGD更新
optimizer_adam.apply_gradients(zip(grads, model.trainable_weights))  # 使用Adam更新

7. 🧠 实战:训练与调优深度神经网络模型

在模型训练过程中,使用数据进行多次迭代,通过前向传播、计算损失和反向传播来优化网络。以下展示如何在PyTorch和TensorFlow中执行完整的训练过程。

PyTorch实现:

# 定义训练函数
def train_model(model, data_loader, optimizer, criterion, epochs=10):for epoch in range(epochs):for inputs, labels in data_loader:optimizer.zero_grad()             # 清空梯度outputs = model(inputs)           # 前向传播loss = criterion(outputs, labels) # 计算损失loss.backward()                   # 反向传播optimizer.step()                  # 更新权重print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.item()}")# 示例数据加载器
data_loader = [(torch.rand(1, 10), torch.rand(1)) for _ in range(100)]
train_model(model, data_loader, optimizer_adam, criterion_mse)

TensorFlow实现:

# 定义训练函数
def train_model(model, dataset, optimizer, loss_fn, epochs=10):for epoch in range(epochs):for inputs, labels in dataset:with tf.GradientTape() as tape:predictions = model(inputs)loss = loss_fn(labels, predictions)grads = tape.gradient(loss, model.trainable_weights)optimizer.apply_gradients(zip(grads, model.trainable_weights))print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.numpy()}")# 示例数据集
dataset = tf.data.Dataset.from_tensor_slices((tf.random.normal([100, 10]), tf.random.normal([100, 1]))).batch(10)
train_model(model, dataset, optimizer_adam, mse_loss_fn)

8. 📊 结果评估与模型调试:准确率与过拟合问题分析

在训练模型后,需要对模型的性能进行评估,并监测是否发生了过拟合。可以使用验证集来检测模型的泛化能力。以下展示如何进行评估。

PyTorch实现:

# 模型评估
def evaluate_model(model, data_loader, criterion):model.eval()  # 评估模式,不会计算梯度total_loss = 0with torch.no_grad():for inputs, labels in data_loader:outputs = model(inputs)loss = criterion(outputs, labels)total_loss += loss.item()print(f"平均损失:{total_loss / len(data_loader)}")# 示例:评估模型
evaluate_model(model, data_loader, criterion_mse)

TensorFlow实现:

# 模型评估
def evaluate_model(model, dataset, loss_fn):total_loss = 0for inputs, labels in dataset:predictions = model(inputs)loss = loss_fn(labels, predictions)total_loss += loss.numpy()print(f"平均损失:{total_loss / len(dataset)}")# 示例:评估模型
evaluate_model(model, dataset, mse_loss_fn)

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

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

相关文章

基于Handsontable.js + Excel.js实现表格预览和导出功能(公式渲染)

本文记录在html中基于Handsontable.js Excel.js实现表格预览、导出、带公式单元格渲染功能&#xff0c;在这里我们在html中实现&#xff0c;当然也可以在vue、react等框架中使用npm下载导入依赖文件。 Handsontable官方文档 一、开发前的准备引入相关依赖库 <!DOCTYPE ht…

微服务经典应用架构图

从网上找了一个经典的微服务架构图&#xff0c;资料来源于若依开源系统的ruoyi-cloud&#xff0c;仅供参考&#xff01;

面向城市运行“一网统管”的实景三维示范应用

在新型智慧城市建设的浪潮中&#xff0c;实景三维技术正成为推动城市治理现代化的重要力量。“一网统管”作为城市运行管理的新理念&#xff0c;强调了跨部门协作和数据共享&#xff0c;而实景三维技术为此提供了强有力的支撑。本文将探讨实景三维技术如何赋能“一网统管”&…

Linux笔记---vim的使用

1. vim的基本概念 Vim是一款功能强大的文本编辑器&#xff0c;它起源于Unix系统的vi编辑器&#xff0c;并在其基础上进行了许多改进和增强。 Vim以其高效的键盘操作、高度的可定制性和强大的文本处理能力而闻名&#xff0c;尤其受程序员和系统管理员的欢迎。 Vim支持多种模式…

cmake 编译 01

CMakeLists.txt cmake_minimum_required(VERSION 3.10)project(MyProject)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True)# 如果顶层 CMakeLists.txt 文件中使用了 add_subdirectory() 命令&#xff0c;CMake 会进入指定的子目录&#xff0c;并处理该目录…

2024年超好用的防泄密软件分享|10款加密防泄密软件推荐

在当今数字化时代&#xff0c;企业数据安全已成为不可忽视的重要议题。随着数据泄露事件频发&#xff0c;选择一款高效可靠的防泄密软件变得尤为重要。本文将为您推荐10款在2024年备受推崇的防泄密软件&#xff0c;并重点介绍Ping32防泄密软件的功能与优势。 1. Ping32防泄密软…

Zico 2 靶机 - 详细流程

✨ 准备工作 靶机 && kali 环境要求 机器名网络配置靶机Zico 2NAT 模式攻击机kaliNAT 模式 靶机下载链接&#xff1a;zico2: 1 ~ VulnHub 打开 VMware&#xff0c;将 zico2.ova 拖拽到 VMware 中 设置 虚拟机名称(A) - 存储路径(P)- 导入 若是&#xff0c;…

3. 单例模式唯一性问题—构造函数

1. 构造函数带来的唯一性问题指什么&#xff1f; 对于不继承MonoBehaviour的单例模式基类 我们要避免在外部 new 单例模式类对象 例如 &#xff08;完整单例模式定义在上一节&#xff09; public class Main : MonoBehaviour {void Start(){// 破坏单例模式的唯一性&#xf…

【Python】AI Navigator对话流式输出

前言 在上一章节,我们讲解了如何使用Anaconda AI Navigator软件结合python搭建本机的大模型环境 【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 但是在上一章节搭建的大模型环境无法流式输出,导致输出需要等待很久,所以在这一章节,解决…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式&#xff1a; 在当今信息爆炸的时代&#xff0c;如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

【深度学习】阿里云GPU服务器免费试用3月

【深度学习】阿里云GPU服务器免费试用3月 1.活动页面2.选择交互式建模PAI-DSW3.开通 PAI 并创建默认工作空间4.前往默认工作空间5.创建交互式建模&#xff08;DSW&#xff09;实例 1.活动页面 阿里云免费使用活动页面 2.选择交互式建模PAI-DSW 支持抵扣PAI-DSW入门机型计算用量…

【Unity新闻】Unity 6 正式版发布

Unity CEO Matt Bromberg 在今天自豪地宣布&#xff0c;Unity 6 正式发布&#xff01;作为迄今为止最强大和稳定的版本&#xff0c;Unity 6 为游戏和应用开发者提供了大量的新功能和工具&#xff0c;帮助他们加速开发并提升性能。 本次正式版是6.0000.0.23f1&#xff08;LTS&a…

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四&#xff0c;五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的&#xff0c;包名 实体类的定义…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

设置 Notepad++ 制表符(Tab 缩进)宽度为2个空格大小

Notepad 默认的制表符宽度是 4 个空格的大小&#xff0c;一个规模比较大的代码段或者 xml 等文件&#xff0c;小屏幕打开时看到的情景真的和让人着急&#xff0c;拖来拖去&#xff01;有两种方案可以解决这种情况。 修改缩进为空格 这种我们不太推荐&#xff0c;但是有些公司…

小白必看web专题!配置环境还在用phpstudy?该用docker了!(php+nginx+mysql+phpmyadmin。)

大家好&#xff0c;我是Dest1ny。 大家用mac或者是windows都是使用phpstudy。 今天docker来搭建一整个phpnginxmysqlphpmyadmin。 而且mac用docker比较方便&#xff01; docker才是众望所归。 大家多多点赞&#xff0c;多多支持&#xff0c;谢谢&#xff01;&#xff01;&…

Qml-Item的构造和显示顺序

Qml-Item的构造和显示顺序 qml文件中组件构造顺序 在同一个qml文件中&#xff0c;同层级的Item, 文件尾的Item优先构造&#xff0c;文件首的Item后构造。这就能解释默认情况下同一个qml文件中&#xff0c;几个同层级的item都设置了focus:true&#xff0c;为啥最上面item最终有…

echarts设置x轴中文垂直显示,x轴滚动条

echarts官网配置&#xff0c;主要配置dataZoom option {xAxis: {type: category,data: [张三,李四,王五,赵六,孙七,周八,吴九,郑十,钱十一,陈十二,刘十三,杨十四,黄十五,何十六,宋十七],axisLabel: {formatter: function (value) {return value.split().join(\n); // 使用换行…

超全!一文详解大型语言模型的11种微调方法

导读&#xff1a;大型预训练模型是一种在大规模语料库上预先训练的深度学习模型&#xff0c;它们可以通过在大量无标注数据上进行训练来学习通用语言表示&#xff0c;并在各种下游任务中进行微调和迁移。随着模型参数规模的扩大&#xff0c;微调和推理阶段的资源消耗也在增加。…