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

AI学习指南深度学习篇-丢弃法Python实践

AI学习指南深度学习篇-丢弃法Python实践

引言

在深度学习的领域中,丢弃法(Dropout)是一种有效的防止过拟合的随机正则化技术。过拟合是指模型在训练集上表现良好,但在测试集或未见过的数据上表现较差的现象。丢弃法通过随机地“丢弃”一部分神经元节点,使模型在训练过程中不能过于依赖某个特定的特征。本文将详细介绍丢弃法的基本概念、原理,以及在TensorFlow和PyTorch等深度学习库中的具体实现,并通过实际代码示例展示如何调参以优化模型性能。

1. 丢弃法的基本概念

丢弃法首次提出于2014年的论文《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》中。其主要思想是在每次训练迭代中随机选取一定比例的神经元,并将其输出置为零。这样可以迫使网络以不同方式学习,使得模型具有更好的泛化能力。

1.1 丢弃率(Dropout Rate)

丢弃率是指在每次训练中被丢弃的神经元的比例。常用的丢弃率有0.2、0.5等,具体值需要根据实验结果进行调整。较高的丢弃率可能会导致欠拟合,而较低的丢弃率则可能不足以起到正则化的效果。

2. 使用TensorFlow实现丢弃法的示例

2.1 环境配置

在开始之前,请确保你已经安装了TensorFlow。如果你没有安装,可以使用以下命令进行安装:

pip install tensorflow

2.2 加载数据集

我们将使用MNIST手写数字数据集作为示例。TensorFlow提供了方便的接口来加载MNIST数据集。以下是加载数据集的代码:

import tensorflow as tf
from tensorflow.keras import layers, models# 加载MNIST数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()# 预处理数据
x_train = x_train.reshape((60000, 28, 28, 1)).astype("float32") / 255
x_test = x_test.reshape((10000, 28, 28, 1)).astype("float32") / 255

2.3 构建模型

下面的代码示例展示了如何构建包含丢弃法的卷积神经网络(CNN)模型。

def create_model(dropout_rate=0.5):model = models.Sequential()model.add(layers.Conv2D(32, (3, 3), activation="relu", input_shape=(28, 28, 1)))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation="relu"))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation="relu"))# 添加丢弃层model.add(layers.Dropout(dropout_rate))model.add(layers.Flatten())model.add(layers.Dense(64, activation="relu"))model.add(layers.Dropout(dropout_rate))model.add(layers.Dense(10, activation="softmax"))return model

2.4 编译和训练模型

接下来,我们需要编译模型,并使用训练数据进行训练。我们将创建一个包含不同丢弃率的模型,对比它们的表现。

# 编译和训练模型
def train_model(dropout_rate):model = create_model(dropout_rate)model.compile(optimizer="adam",loss="sparse_categorical_crossentropy",metrics=["accuracy"])history = model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))return history# 测试不同的丢弃率
dropout_rates = [0.2, 0.5, 0.7]
histories = {}for rate in dropout_rates:print(f"Training with dropout rate: {rate}")histories[rate] = train_model(rate)

2.5 可视化训练过程

我们可以通过绘制训练和验证损失及准确率图来比较不同丢弃率模型的表现。

import matplotlib.pyplot as pltdef plot_history(histories):plt.figure(figsize=(12, 5))for rate, history in histories.items():plt.subplot(1, 2, 1)plt.plot(history.history["accuracy"], label=f"train acc (dropout {rate})")plt.plot(history.history["val_accuracy"], label=f"val acc (dropout {rate})")plt.subplot(1, 2, 2)plt.plot(history.history["loss"], label=f"train loss (dropout {rate})")plt.plot(history.history["val_loss"], label=f"val loss (dropout {rate})")plt.subplot(1, 2, 1)plt.title("Training and Validation Accuracy")plt.xlabel("Epochs")plt.ylabel("Accuracy")plt.legend()plt.subplot(1, 2, 2)plt.title("Training and Validation Loss")plt.xlabel("Epochs")plt.ylabel("Loss")plt.legend()plt.show()plot_history(histories)

3. 使用PyTorch实现丢弃法的示例

接下来,我们将使用PyTorch实现相同功能。首先,请确保你安装了PyTorch。如果尚未安装,可以使用以下命令:

pip install torch torchvision

3.1 加载数据集

同样,我们将使用MNIST数据集。以下是加载数据集的代码:

import torch
import torchvision
import torchvision.transforms as transforms# 定义数据转换
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])# 加载MNIST数据集
trainset = torchvision.datasets.MNIST(root="./data", train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)testset = torchvision.datasets.MNIST(root="./data", train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)

3.2 构建模型

下面是使用丢弃法的CNN模型代码:

import torch.nn as nn
import torch.nn.functional as Fclass Net(nn.Module):def __init__(self, dropout_rate=0.5):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 32, 3)self.conv2 = nn.Conv2d(32, 64, 3)self.fc1 = nn.Linear(64 * 24 * 24, 128)self.fc2 = nn.Linear(128, 10)self.dropout = nn.Dropout(dropout_rate)def forward(self, x):x = F.relu(self.conv1(x))x = F.max_pool2d(x, 2)x = F.relu(self.conv2(x))x = F.max_pool2d(x, 2)x = x.view(-1, 64 * 24 * 24)x = F.relu(self.fc1(x))x = self.dropout(x)  # Apply Dropoutx = self.fc2(x)return x

3.3 训练和测试模型

接下来,我们需要定义训练和测试过程:

def train_model(dropout_rate, num_epochs=10):model = Net(dropout_rate)criterion = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters())for epoch in range(num_epochs):model.train()running_loss = 0.0for i, data in enumerate(trainloader):inputs, labels = dataoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch {epoch + 1}, Loss: {running_loss / (i + 1)}")return model# 测试不同丢弃率模型
dropout_rates = [0.2, 0.5, 0.7]
models = {}for rate in dropout_rates:print(f"Training model with dropout rate: {rate}")models[rate] = train_model(rate)

3.4 测试模型

接下来,我们来评估模型的准确率:

def test_model(model):correct = 0total = 0model.eval()with torch.no_grad():for data in testloader:images, labels = dataoutputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Accuracy: {100 * correct / total}%")# 测试不同丢弃率模型
for rate, model in models.items():print(f"Testing model with dropout rate: {rate}")test_model(model)

结论

在本篇文章中,我们详细介绍了丢弃法的基本概念及其在深度学习中的应用。通过使用TensorFlow和PyTorch,我们实现了包含丢弃法的卷积神经网络,并对不同丢弃率模型的性能进行了比较和分析。

丢弃法作为一种简单有效的正则化技术,可以帮助我们减少模型的复杂度,提高模型在未见数据上的泛化能力。在实际应用中,还需根据具体的任务场景调整丢弃率以及其他超参数,以寻求最佳的模型性能。希望本文能够为深度学习爱好者提供一个清晰的丢弃法实践指南!

相关文章:

  • FTP访问方式详解
  • 【JVM】JVM执行流程和内存区域划分
  • 04_OpenCV图片缩放
  • element-plus中el-table固定列fixed失效问题
  • 智慧环保大数据平台建设方案
  • ASP.NET Core8.0学习笔记(十九)——EF Core DbSet
  • 论文阅读 | HiDDeN网络架构
  • 一次 Spring 扫描 @Component 注解修饰的类坑
  • 什么是数据挖掘?初学者指南
  • 基于python+django+vue的电影数据分析及可视化系统
  • 瓶子类型检测系统源码分享
  • 第十四届蓝桥杯真题Java c组A.求和(持续更新)
  • unity CustomEditor的基本使用
  • 基于php的助农生鲜销售系统
  • Transformers 引擎,vLLM 引擎,Llama.cpp 引擎,SGLang 引擎,MLX 引擎
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android单元测试 - 几个重要问题
  • C++11: atomic 头文件
  • CSS 提示工具(Tooltip)
  • css属性的继承、初识值、计算值、当前值、应用值
  • gops —— Go 程序诊断分析工具
  • java正则表式的使用
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • node 版本过低
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python爬虫--- 1.3 BS4库的解析器
  • Redis 懒删除(lazy free)简史
  • SpingCloudBus整合RabbitMQ
  • TCP拥塞控制
  • ucore操作系统实验笔记 - 重新理解中断
  • yii2中session跨域名的问题
  • 深入 Nginx 之配置篇
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用简单代码看卷积组块发展
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • gunicorn工作原理
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 数据库巡检项
  • #面试系列-腾讯后端一面
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2.2w字)前端单元测试之Jest详解篇
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (done) 声音信号处理基础知识(2) (重点知识:pitch)(Sound Waveforms)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)库存超卖案例实战——优化redis分布式锁
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET MVC之AOP