基于Pytorch框架构建AlexNet模型

Pytorch

  • 一、判断环境
    • 1.导入必要的库
    • 2.判断环境
  • 二、定义字典
    • 1.定义字典
  • 三、处理图像数据集
    • 1.导入必要的模块
    • 2.定义变量
    • 3.删除隐藏文件/文件夹
  • 四、加载数据集
    • 1.加载训练数据集
    • 2.加载测试数据集
    • 3.定义训练数据集和测试集路径
    • 4.加载训练集和测试集
    • 5.创建训练集和测试集数据加载器
  • 五、定义卷积神经网络
    • 1.定义卷积神经网络
  • 六、创建AlexNet模型
    • 1.创建模型
    • 2.检查GPU设备
    • 3.训练过程
  • 七、训练模型
    • 1.设置模型为训练模式
    • 2.初始化计数器
    • 3.遍历训练数据加载器
    • 4.打印进度
    • 5.打印最终结果
  • 八、验证模型
    • 1.设置模型为验证模式
    • 2.初始化计数器
    • 3.遍历测试数据加载器
    • 4.打印验证结果
  • 九、创建学习率调度器
    • 1.创建学习率调度器
    • 2.训练模型

一、判断环境

1.导入必要的库

torch.optim as optim: 导入 PyTorch 的优化器模块,用于定义优化器。
torch: 导入 PyTorch 的主库,提供神经网络和自动微分的核心功能。
torch.nn as nn: 导入 PyTorch 的神经网络模块,提供构建神经网络所需的层和功能。
torch.nn.parallel: 导入 PyTorch 的并行模块,用于在多GPU上运行模型。
torch.optim: 导入 PyTorch 的优化器模块,用于定义优化器。
torch.utils.data: 导入 PyTorch 的数据处理模块,用于处理数据集和数据加载器
torch.utils.data.distributed: 导入 PyTorch 的分布式数据处理模块,用于处理分布式数据。
torchvision.transforms as transforms: 导入 PyTorch 的图像变换模块,用于数据增强和预处理。
torchvision.datasets as datasets: 导入 PyTorch 的数据集模块,用于加载和访问数据集。
torchvision.models: 导入 PyTorch 的预训练模型模块,用于加载预训练的模型。
from torch.autograd import Variable: 导入 PyTorch 的自动微分模块,用于定义张量为可微变量。
from torchvision import models: 导入 PyTorch 的预训练模型模块,用于加载预训练的模型。
import os: 导入 Python 的操作系统模块,用于操作文件和目录。
from PIL import Image: 导入 Python 的图像处理库 PIL,用于打开和操作图像。
import cv2: 导入 OpenCV 库,用于处理图像和视频。
import torch.optim.lr_scheduler as lr_scheduler: 导入 PyTorch 的学习率调度器模块,用于调整学习率。

import torch.optim as optim
import torch
import torch.nn as nn
import torch.nn.parallel
import torch.optim
import torch.utils.data
import torch.utils.data.distributed
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models
from torch.autograd import Variable
from torch.nn import Conv2d
from tqdm import tqdm
from torchvision import models
import os
from PIL import Image
import cv2
import torch.optim.lr_scheduler as lr_scheduler

2.判断环境

根据 DEVICE 的值来决定是使用 CPU 还是 GPU 进行计算。

#判断环境是CPU运行还是GPU
DEVICE = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
DEVICE

运行结果:
在这里插入图片描述

二、定义字典

1.定义字典

定义一个名为 transform111 的字典,其中包含了两个键值对,分别对应于训练和验证数据集的图像变换。这些变换通常用于数据增强和预处理,以提高模型的泛化能力和性能。

transform111 字典的结构如下:
'train': 训练数据集的图像变换。

  • transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)):
    从原始图片中随机裁剪一个大小为 256x256 的区域,裁剪区域的缩放范围为 0.8 到 1.0。

  • transforms.RandomRotation(degrees=15): 随机旋转图片 15 度。

  • transforms.RandomHorizontalFlip(): 随机水平翻转图片。

  • transforms.CenterCrop(size=224): 从裁剪后的图片中中心裁剪一个大小为 224x224 的区域。

  • transforms.ToTensor(): 将 PIL 图像转换为 PyTorch 张量。

  • transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]):
    对图像进行归一化处理,将每个通道的均值和标准差调整为 0.485、0.456、0.406 和 0.229、0.224、0.225。

'val': 验证数据集的图像变换。

  • transforms.Resize(size=256): 将图片大小调整为 256x256。
  • transforms.CenterCrop(size=224): 从调整后的图片中中心裁剪一个大小为 224x224 的区域。
  • transforms.ToTensor(): 将 PIL 图像转换为 PyTorch 张量。
  • transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]):
    对图像进行归一化处理,将每个通道的均值和标准差调整为 0.485、0.456、0.406 和 0.229、0.224、0.225。
transform111 = {
    'train': transforms.Compose([
        transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
        transforms.RandomRotation(degrees=15),
        transforms.RandomHorizontalFlip(),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Resize(size=256),
        transforms.CenterCrop(size=224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406],
                             [0.229, 0.224, 0.225])
    ])
}
transform111

运行结果:
在这里插入图片描述

三、处理图像数据集

1.导入必要的模块

import shutil: 导入 Python 的 shutil 模块,用于操作文件和目录。

import shutil

2.定义变量

modellr: 用于存储模型的学习率。学习率是模型训练中的一个关键超参数,它决定了优化算法中参数更新的步长。在这个例子中,学习率被设置为 1e-3,即 0.001。
BATCH_SIZE: 用于存储每个训练批次中的样本数量。较大的批大小可以提高计算效率,但可能会增加内存需求。在这个例子中,批大小被设置为 64。
EPOCHS: 用于存储训练过程中迭代的轮数。每个 epoch 表示数据集被完整地遍历了一次。在这个例子中,训练过程被设置为进行 60 个 epoch。

modellr = 1e-3
BATCH_SIZE = 64
EPOCHS = 60

3.删除隐藏文件/文件夹

删除指定目录及其所有子目录中包含 ‘ipynb_checkpoints’ 的文件和文件夹。
操作如下:

1)遍历目录:

  • for root, dirs, files in os.walk('./dataset'): 这行代码使用 os.walk
    函数遍历指定目录 ./dataset 及其所有子目录。os.walk 函数会返回一个三元组 (root, dirs, files),其中 root 是当前目录的路径,dirs 是当前目录下的所有子目录列表,files 是当前目录下的所有文件列表。

2)删除隐藏文件:

  • for file in files: 这行代码遍历当前目录下的所有文件。
  • if 'ipynb_checkpoints' in file: 这行代码检查文件名是否包含 ‘ipynb_checkpoints’。
  • os.remove(os.path.join(root, file)): 如果文件名包含 ‘ipynb_checkpoints’,则使用
    os.remove 函数删除该文件。

3)删除隐藏文件夹:

  • if 'ipynb_checkpoints' in root: 这行代码检查当前目录的路径是否包含
    ‘ipynb_checkpoints’。
  • shutil.rmtree(root): 如果当前目录的路径包含 ‘ipynb_checkpoints’,则使用
    shutil.rmtree 函数删除整个目录及其所有子目录和文件。
# 删除隐藏文件/文件夹
for root, dirs, files in os.walk('./dataset'):
    for file in files:
        if 'ipynb_checkpoints' in file:
            os.remove(os.path.join(root, file))
    if 'ipynb_checkpoints' in root:
        shutil.rmtree(root)

四、加载数据集

1.加载训练数据集

1)dataset_train = datasets.ImageFolder('dataset/train', transform111): 使用 datasets.ImageFolder 函数加载 dataset/train 目录中的图像数据,并应用之前定义的 transform111 变换。
2)print(dataset_train.imgs): 打印出训练数据集的图像路径和对应的标签。
3)print(dataset_train.class_to_idx): 打印出训练数据集的标签映射。

# 读取数据
dataset_train = datasets.ImageFolder('dataset/train', transform111)
print(dataset_train.imgs)

# 对应文件夹的label
print(dataset_train.class_to_idx)

2.加载测试数据集

1)dataset_test = datasets.ImageFolder('dataset/val', transform111): 使用 datasets.ImageFolder 函数加载 dataset/val 目录中的图像数据,并应用之前定义的 transform111 变换。
2)print(dataset_test.imgs): 打印出测试数据集的图像路径和对应的标签。
3)print(dataset_test.class_to_idx): 打印出测试数据集的标签映射。

dataset_test = datasets.ImageFolder('dataset/val', transform111)
# 对应文件夹的label
print(dataset_test.class_to_idx)

3.定义训练数据集和测试集路径

这两个路径分别指向 dataset/train 和 dataset/val 目录,这些目录包含训练和验证图像数据。

1)定义数据集路径:

  • dataset = './dataset': 定义一个变量 dataset,它指向 ./dataset 目录,这是数据集的根目录。

2)定义训练数据集路径:

  • train_directory = os.path.join(dataset, 'train'): 使用 os.path.join 函数将
    dataset 变量和 ‘train’ 字符串连接起来,以创建训练数据集的路径。

3)定义验证数据集路径:

  • valid_directory = os.path.join(dataset, 'val'): 使用 os.path.join 函数将
    dataset 变量和 ‘val’ 字符串连接起来,以创建验证数据集的路径。
dataset = './dataset'
train_directory = os.path.join(dataset, 'train')
valid_directory = os.path.join(dataset, 'val')

4.加载训练集和测试集

定义变量,并使用 datasets.ImageFolder 函数加载了训练和验证数据集。

1)定义批大小和类别数量:

  • batch_size = 32: 定义每个训练批次的样本数量为 32。
  • num_classes = 6: 定义数据集中类别的数量为 6。

2)打印训练数据集路径:

  • print(train_directory): 打印出训练数据集的路径。

3)创建数据集字典:

  • data = {'train': datasets.ImageFolder(root=train_directory, transform=transform111['train']), 'val': datasets.ImageFolder(root=valid_directory, transform=transform111['val'])}: 创建一个名为 data 的字典,其中包含两个键值对。键为 ‘train’
    和 ‘val’,对应的值分别是 datasets.ImageFolder 对象,这些对象加载了训练数据集和验证数据集。
batch_size = 32
num_classes = 6
print(train_directory)
data = {
    'train': datasets.ImageFolder(root=train_directory, transform=transform111['train']),
    'val': datasets.ImageFolder(root=valid_directory, transform=transform111['val'])
}

5.创建训练集和测试集数据加载器

定义变量,并使用 torch.utils.data.DataLoader 函数创建了训练和测试数据加载器。

1)获取数据集大小:

  • train_data_size = len(data['train']): 计算训练数据集的大小。
  • valid_data_size = len(data['val']): 计算验证数据集的大小。

2)创建数据加载器:

  • train_loader = torch.utils.data.DataLoader(data['train'], batch_size=batch_size, shuffle=True, num_workers=8): 创建一个训练数据加载器,其中batch_size 参数定义了每个批次的样本数量,shuffle=True 参数表示在每次迭代时打乱数据,num_workers=8参数定义数据加载过程中使用的线程数。
  • test_loader = torch.utils.data.DataLoader(data['val'], batch_size=batch_size, shuffle=True, num_workers=8):
    创建一个测试数据加载器,其参数与训练数据加载器的参数相同。

3)打印数据集大小:

  • print(train_data_size, valid_data_size): 打印出训练数据集和验证数据集的大小。
train_data_size = len(data['train'])
valid_data_size = len(data['val'])

train_loader = torch.utils.data.DataLoader(data['train'], batch_size=batch_size, shuffle=True, num_workers=8)
test_loader = torch.utils.data.DataLoader(data['val'], batch_size=batch_size, shuffle=True, num_workers=8)

print(train_data_size, valid_data_size)

运行结果:
在这里插入图片描述

五、定义卷积神经网络

1.定义卷积神经网络

定义一个名为 AlexNet 的卷积神经网络类,它继承自 torch.nn.Module。这个类实现了一个简化版的 AlexNet 网络结构,用于图像分类任务。

1)__init__(self, num_classes=2): 构造函数接收一个参数 num_classes,表示输出层的类别数,默认值为 2(例如,二分类问题)。在构造函数中,定义以下层:

  • 特征提取部分(self.features):

  • 第一个卷积层:64 个输出通道,大小为 11x11 的卷积核,步幅为 4,填充为 2

  • ReLU 激活函数。 最大池化层:3x3的窗口,步幅为 2。

  • 第二个卷积层:192 个输出通道,大小为 5x5 的卷积核,padding 为 2。 ReLU 激活函数。

  • 最大池化层:3x3 的窗口,步幅为 2。 第三个卷积层:384 个输出通道,大小为 3x3 的卷积核,padding 为 1。

  • ReLU激活函数。

  • 第四个卷积层:256 个输出通道,大小为 3x3 的卷积核,padding 为 1。 ReLU 激活函数。

  • 第五个卷积层:256 个输出通道,大小为 3x3 的卷积核,padding 为 1。 ReLU 激活函数。

  • 最大池化层:3x3的窗口,步幅为 2。

  • 平均池化层(self.avgpool):自适应平均池化,输出尺寸为 6x6。

  • List item

  • 全连接层(self.classifier):

    Dropout 层。 第一个全连接层:4096 个神经元。 ReLU 激活函数。 Dropout 层。 第二个全连接层:4096
    个神经元。 ReLU 激活函数。 第三个全连接层:num_classes 个神经元。

    LogSoftmax 层:用于计算每个类别的对数概率。

2)forward(self, x): 前向传播函数接收输入 x,并依次通过以下层:

  • 特征提取部分。
  • 平均池化层。
  • 将特征图展平为一维向量。
  • 全连接层。
  • LogSoftmax 层。
  • 返回展平后的特征图和每个类别的对数概率。
class AlexNet(nn.Module):
    def __init__(self, num_classes=2):
        super(AlexNet, self).__init__()
        
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )
        # softmax
        self.logsoftmax = nn.LogSoftmax(dim=1)

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), 256 * 6 * 6)
        x = self.classifier(x)
        x = self.logsoftmax(x)
        return x

六、创建AlexNet模型

1.创建模型

Alex_model = AlexNet()

2.检查GPU设备

如果 GPU 可用,则定义一个 torch.device 对象,表示使用 GPU。如果 GPU 不可用,则定义一个 torch.device 对象,表示使用 CPU。

以下是函数的详细步骤:
1)检查 GPU 可用性:

  • if torch.cuda.is_available(): 这行代码检查是否有可用的 GPU 设备。

  • device = torch.device(‘cuda’): 如果 GPU 可用,则定义一个 torch.device 对象,表示使用 GPU。

  • print(“CUDA is available! Using GPU for training.”): 打印一条消息,表示 CUDA
    可用,并且使用 GPU 进行训练。

  • else: 如果 GPU 不可用,则执行以下代码。

2)使用 CPU 进行训练:

  • device = torch.device(‘cpu’): 定义一个 torch.device 对象,表示使用 CPU。

  • print(“CUDA is not available. Using CPU for training.”): 打印一条消息,表示
    CUDA 不可用,并且使用 CPU 进行训练。

# 首先,检查是否有可用的 GPU
if torch.cuda.is_available():
    # 定义 GPU 设备
    device = torch.device('cuda')
    print("CUDA is available! Using GPU for training.")
else:
    # 如果没有可用的 GPU,则使用 CPU
    device = torch.device('cpu')
    print("CUDA is not available. Using CPU for training.")

3.训练过程

如果 GPU 可用,将模型移动到 GPU 上,并使用 GPU 进行训练;如果 GPU 不可用,则使用 CPU 进行训练。

1)将模型移动到 GPU:
Alex_model.to(device): 将模型移动到之前定义的 device 对象所表示的设备上。如果 device 是 ‘cuda’,则模型将被移动到 GPU;如果 device 是 ‘cpu’,则模型将被移动到 CPU。

2)定义损失函数:
criterion = nn.CrossEntropyLoss(): 定义交叉熵损失函数,这是用于分类问题的常见损失函数。

3)创建优化器:
optimizer = optim.Adam(Alex_model.parameters(), lr=0.001, weight_decay=1e-4): 创建Adam 优化器,其中 lr=0.001 表示学习率为 0.001,weight_decay=1e-4 表示权重衰减为 0.0001。

# 将模型移动到 GPU
Alex_model.to(device)

# 定义损失函数
criterion = nn.CrossEntropyLoss()

# 创建优化器
optimizer = optim.Adam(Alex_model.parameters(), lr=0.001, weight_decay=1e-4)

运行结果:
在这里插入图片描述

七、训练模型

1.设置模型为训练模式

将模型设置为训练模式,这样模型在计算梯度时会使用 Dropout 和 BatchNorm 层。

def train(model, device, train_loader, optimizer, criterion, epoch):
    model.train()

2.初始化计数器

用于在每次迭代时累积损失、正确预测的数量和总样本数。

running_loss = 0.0
correct = 0
total = 0

3.遍历训练数据加载器

遍历 train_loader 中的每个批次,并将数据和标签移动到指定的设备上。然后,它执行前向传播、计算损失、

反向传播和更新模型参数。同时,它累积损失、样本数和正确预测的数量。
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        print(output)  # 检查模型的输出是否为None
        target = target.to(dtype=torch.long)  # 将目标标签转换为长整数类型
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        _, predicted = torch.max(output.data, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()

4.打印进度

在每 10 个批次后打印当前的轮次、批次数和损失值,以便监控训练进度。

if batch_idx % 10 == 0:  # 每10个批次打印一次
    print(f'Epoch {epoch}, Batch {batch_idx}, Loss: {loss.item()}')

5.打印最终结果

在当前轮次结束时打印平均损失和准确率。

print(f’Epoch {epoch}, Loss: {running_loss / len(train_loader)}, Accuracy: {100 * correct / total}%')

说明:这个函数实现了一个基本的训练循环,它能够训练模型进行图像分类。在实际使用中,您可能需要根据您的具体任务调整学习率、优化器、损失函数等超参数,并确保数据加载器的设置与模型的需求相匹配。

八、验证模型

1.设置模型为验证模式

将模型设置为验证模式,这样模型在计算梯度时不会使用 Dropout 和 BatchNorm 层。

# 定义验证过程
def val(model, device, test_loader, criterion):
    model.eval()

2.初始化计数器

用于在每次迭代时累积损失、正确预测的数量和总样本数。

running_loss = 0.0
correct = 0
total = 0

3.遍历测试数据加载器

遍历 test_loader 中的每个批次,并将数据和标签移动到指定的设备上。然后,它执行前向传播并计算损失。由于模型处于验证模式,它不会计算梯度。同时,它累积损失、样本数和正确预测的数量。

with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
loss = criterion(output, target)
running_loss += loss.item()
_, predicted = torch.max(output.data, 1)
total += target.size(0)
correct += (predicted == target).sum().item()

4.打印验证结果

在验证过程结束时打印平均损失和准确率。

print(f’Validation, Loss: {running_loss / len(test_loader)}, Accuracy: {100 * correct / total}%')

说明:这个函数实现了一个基本的验证循环,它能够验证模型在测试数据集上的性能。在实际使用中,您可能需要根据您的具体任务调整超参数,并确保数据加载器的设置与模型的需求相匹配。

九、创建学习率调度器

1.创建学习率调度器

创建一个 StepLR 学习率调度器,其中 optimizer 是之前创建的优化器,step_size=7 表示每 7 个 epoch 调整一次学习率,gamma=0.1 表示每次调整学习率时减少 10%。

# 创建学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)

2.训练模型

定义了一个循环,该循环执行了 EPOCHS 次。在每个 epoch 中,它首先使用 train 函数训练模型,然后使用 val 函数验证模型。在每个 epoch 结束时,它调用 scheduler.step() 方法来调整学习率。

# 训练模型
EPOCHS = 50
for epoch in range(1, EPOCHS + 1):
    train(Alex_model, device, train_loader, optimizer, criterion, epoch)  # 使用 Alex_model
    val(Alex_model, device, test_loader, criterion)  # 使用 Alex_model
    scheduler.step()  # 调整学习率

运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础:IO流

目录 一、定义 1.引言 2.分类 (1)按照流的方向分 (2)按操作文件的类型分 3.体系结构 二、字节流(以操作本地文件为例) 1. FileOutputStream 类 (1)定义 (2&am…

每日一题——Python代码实现PAT甲级1059 Prime Factors(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 改进建议 我要更强 时间复杂度…

大学生综合能力测评系统(安装+讲解+源码)

【毕设者】大学生综合能力测评系统(安装讲解源码) 分为管理员老师学生端 技术栈 后端: SpringBoot Mysql MybatisPlus 前端: Vue Element 功能截图: 给你安装运行

从WebM到MP3:利用Python和wxPython提取音乐的魔法

前言 有没有遇到过这样的问题:你有一个包含多首歌曲的WebM视频文件,但你只想提取其中的每一首歌曲,并将它们保存为单独的MP3文件?这听起来可能有些复杂,但借助Python和几个强大的库,这个任务变得异常简单。…

开源的网络瑞士军刀「GitHub 热点速览」

上周的开源热搜项目可谓是精彩纷呈,主打的就一个方便快捷、开箱即用!这款无需安装、点开就用的网络瑞士军刀 CyberChef,试用后你就会感叹它的功能齐全和干净的界面。不喜欢 GitHub 的英文界面?GitHub 网站汉化插件 github-chinese…

Vite: 关于预构建的毫秒级响应

概述 在我们的项目代码中,我们所说的模块代码其实分为两部分 一部分是源代码,也就是业务代码另一部分是第三方依赖的代码,即 node_modules 中的代码 Vite 是一个提倡 no-bundle 的构建工具,相比于传统的 Webpack能做到开发时的模…

【通用技巧】自动获取日志存放路径,无需手动修改配置文件

我们在部署环境的时候,常常会手动修改一些配置文件的存放地址,比如日志的路径、截图的路径,这是因为我们的环境不一样,部署应用的位置也不一样导致的。如果位置写死了,那么就会造成通用性很差,所以我们经常…

(深度学习记录)第TR5周:Transformer中的位置编码详解

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 🏡我的环境: 语言环境:Python3.11.4编译器:Jupyter Notebooktorcch版本:2.0.…

[FreeRTOS 基础知识] 信号量 概念

文章目录 信号量定义信号量特性 信号量定义 信号量是一个抽象的数据类型,通常包含一个整数值以及一个等待该值变为正数的任务列表(也称为等待队列)。信号量的整数值代表了系统中某种资源的可用数量。 在操作系统中信号量用于控制对共享资源访…

[FreeRTOS 内部实现] 信号量

文章目录 基础知识创建信号量获取信号量释放信号量信号量 内部实现框图 基础知识 [FreeRTOS 基础知识] 信号量 概念 创建信号量 #define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) #define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) #define xSe…

elementUI相关知识及搭建使用过程

​​​​​​ 目录 ​​​​​​ 一.elementUI相关的知识 1.什么是elementUI 2.如何在创建的项目中使用elementUI的组件(1)安装 ​ (2)在项目的main.js中引入elementUI (3)使用elementui里的组件 一.elementUI相关的知识 1.什么是elementUI Element,一套为开…

基于Pytorch框架构建LeNet-5模型

Pytorch 一、训练模型1.导入必要的库2.设置超参数3.数据预处理4.读取数据 二、定义卷积神经网络1.定义卷积神经网络2.定义学习率3.实例化模型并且移动到GPU4.选择优化器 三、定义调整学习率的函数1.定义调整学习率的函数 四、训练模型1.设置模型为训练模式2.遍历训练数据加载器…

嵌入式计算器模块实现

嵌入式计算器模块规划 计算器混合算法解析 上面我们的算法理论已经完善, 我们只用给一个混合运算式, 计算器就可以帮助我们计算出结果. 但是存在一个痛点, 每次计算算式,都要重新编译程序, 所以我们想到了, 利用单片机, 读取用户输入的按键, 组成算式, 输入给机器, 这样我们就…

Docker编译nanopc-t4源码流程介绍

官方文档 Android系统编译 vnc加环境变量配置 https://github.com/friendlyarm/docker-cross-compiler-novnc 下载 git clone https://github.com/friendlyarm/docker-ubuntu-lxde-novnc cd docker-ubuntu-lxde-novnc docker build --no-cache -t docker-ubuntu-lxde-novnc …

板凳--------第20章-信号:基本概念1

tlpi_hdr.h头文件使用及设置 liao__ran 于 2020-09-29 15:12:01 发布 阅读量1.6k 收藏 5 点赞数 1 分类专栏: linux系统编程手册 版权 linux系统编程手册 专栏收录该内容 7 篇文章 1 订阅 订阅专栏 使用的头文件,主要如下: ename.c.inc erro…

python实训day4

1、查看数据库的版本 2、查看当前用户 3、查看当前数据库 4、计算表达式的结果; 任何一个数据库,无论大小,都首先是一个超级计算器 5、查看当前MySQL环境中所有的数据库; 系统数据库(只能看)和自定义数据库(任何操作) 6、先建数据库 gaoming 7、如果表已经存在,则创建不能成功 …

【经典算法OJ题讲解】

1.移除元素 经典算法OJ题1: 移除元素 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-element/desc…

【文字+视频教程】在手机上用文生软件平台CodeFlying开发一个整蛊版《Flappy Bird》

前言: 在之前的文章中我们介绍了国内首家文生软件平台码上飞CodeFlying,并且教给了大家如何用它来开发复杂的项目信息管理系统以及恶搞拼图小游戏等。今天就继续给大家带来一起用码上飞开发整蛊版《Flappy Bird》小游戏的教程。 老规矩,咱还…

node.js环境安装以及Vue-CLI脚手架搭建项目教程

目录 ▐ vue-cli 搭建项目的优点 ▐ 安装node.js环境 ▐ 搭建vue脚手架项目 ▐ 项目结构解读 ▐ 常用命令 ▐ 创建组件 ▐ 组件路由 ▐ vue-cli 搭建项目的优点 传统的前端项目架构由多个html文件,且每个html文件都是相互独立的,导入外部组件时需…

【计算机毕业设计】基于Springboot的网页时装购物系统【源码+lw+部署文档】

包含论文源码的压缩包较大,请私信或者加我的绿色小软件获取 免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…